시퀀스의 교차점을 인쇄


9

시퀀스

1통해 번호가 매겨진 4 개의 숫자 시퀀스가 ​​제공 됩니다 4.

  1. OEIS0 자연수가 이진수로 표시 될 때 의 위치입니다 . 순서를 계산하는 방법의 예는 다음과 같습니다.

     0,1,10,11,100,101,110,111
     ^    ^     ^^  ^    ^
     0    3     78  10   14
    

    시퀀스의 시작은 다음과 같습니다. 0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...


  1. OEIS 이 순서는 첫 번째 자연수를 포함하고 다음 2 개를 건너 뛰고 다음 3 개를 포함하고 다음 4 개를 건너 뛰어 계속합니다.

     0, 3, 4, 5, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 26, 27, 36, ...
    

  1. OEIS 의 수를 모두 양의 정수 0의와의 수 1'수의 바이너리 표현들의 힘이다 2.

    2, 4, 5, 6, 9, 10, 12, 16, 23, 27, 29, 30, 33, 34, 36, 39,
    

  1. OEIS Hofstadter Q 시퀀스 .

    a (1) = a (2) = 1;
    n> 2의 경우 a (n) = a (na (n-1)) + a (na (n-2))

    1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 8, 8, 8, 10, 9, 10, 11, 11, 12, 12, 12, 12, 16, 14, ...
    

    이 순서에 대해서는 거의 입증되지 않았지만 많은 경험적 결과가 존재합니다. 하나는 특히 중요하며 전체 시리즈에 유효하다고 가정 할 수 있습니다.

    이 논문 은 시리즈의 요소들이 여러 세대로 분류 될 수 있음을 관찰했다. 1부터 시작하여 번호를 매기 면 k 번째 세대에는 정확히 2 k 요소 가 포함됩니다 . 관련 특성은 k 세대의 모든 숫자는 k-1 및 / 또는 k-2 세대의 두 숫자를 합하여 얻지 만 이전 세대의 숫자는 결코 합치 지 않는다는 것입니다. 이 (그리고 오직이) 관찰을 사용하여 시퀀스의 나머지 요소에 하한을 둘 수 있습니다.


도전

x주어진 입력 시퀀스의 교차 부분에 첫 번째 숫자 를 인쇄하는 것이 어렵습니다 .

입력 : 에 공백으로 구분 된 두 숫자 STDIN. 첫 번째 숫자는 정수이다 1하는 15포괄적으로 여기서 시퀀스의 각 비트에 대응한다. 가장 낮은 비트는 시퀀스 1에 해당하고 가장 높은 비트는 시퀀스 에 해당합니다 4. 두 번째는 x에 출력 할 숫자의 양입니다 STDIN.

출력 :x 주어진 입력 시퀀스와 교차 하는 첫 번째 숫자입니다. STDOUT공백이나 구두점을 구분 기호 (공백, 탭, 줄 바꿈, 쉼표, 콜론, 마침표 등)로 숫자를 인쇄하십시오 .


1.3 모든 순서에 있는 첫 번째 숫자를 인쇄하십시오 .

입력: 15 3

산출: 10,23,40


2. 첫 번째 12숫자를 순서 번호 1및로 인쇄하십시오 4.

입력: 9 12

산출: 3,8,10,14,19,20,21,23,24,31,37,40


3. 첫 번째 10숫자를 순서대로 인쇄하십시오 2.

입력: 2 10

산출: 0,3,4,5,10,11,12,13,14,21


4. 최초의 인쇄 6순서에 숫자를 3하고 4.

입력: 12 6

산출: 2,4,5,6,9,10


세부

  • 출력을 한꺼번에 또는 한 번에 모두 인쇄 할 수 있습니다.

채팅에서이 문제를 도와 주신 모든 분들께 감사드립니다! 이 질문은 샌드 박스 에있는 것이 큰 도움이되었습니다 .


@chilemagic : 실제로 교차점에서 "첫 번째 X 숫자"를 어떻게 정의합니까? 12 5예제 에서 두 시퀀스를 모두 같은 인덱스로 가져 가면 10실제로 9교차로에서옵니다 ... 시퀀스를 진행하는 동안 9# 3에서 가능한 교차로 를 건너 뛸지 여부를 어떻게 결정 합니까? # 3에 7
들어간

@Claudiu 출력 된 숫자는 항상 증가해야하며 각 숫자는 출력에 한 번만 나타납니다.
hmatt1

최대 한도가 x있습니까?
Ypnypn

@ypnypn은 한계를 하드 코딩하지 않지만 알고리즘이 매우 느리거나 매우 큰 입력에 대해 완료되지 않으면 괜찮습니다. 이것은 코드 골프이므로 바이트를 절약하는 것이 비효율적입니다.
hmatt1

답변:


2

하스켈, 495 (442) (402)

import Data.List
d=1:1:1%2
f=filter
p 0="0"
p 1="1"
p n=p(div n 2)++p(mod n 2)
l=length
u z[a,b]=sort.head.dropWhile((<b).l)$m(nub.foldl1 intersect.y(tail.p$31-a).(`m`[d,f(v.group.sort.p)[1..],z#1,y(z>>=p)z]).take)z
w=(=='0')
v[a]=1>2
v x=all(all w.tail.p.l)x
y x=m snd.f(w.fst).zip x
x#n=n`take`x++drop(n+n+1)x#(n+2)
n%m=d!!(m-d!!n)+d!!(m-d!!(n-1)):m%(m+1)
main=interact$show.u[0..].m read.words
m=map

합리적으로 잘 수행됩니다. 다음은 OP의 몇 가지 예입니다.

Flonk@home:~>echo 15 10 | codegolf
[10,23,40,57,58,139,147,149,212,228]
Flonk@home:~>echo 9 12 | codegolf
[3,8,10,14,19,20,21,23,24,31,37,40]
Flonk@home:~>echo 2 10 | codegolf
[0,3,4,5,10,11,12,13,14,21]
Flonk@home:~>echo 12 6 | codegolf
[2,4,5,6,9,10]

4

파이썬 3, 590 639 자

from itertools import count as C
D=lambda n,t='1':bin(n).count(t)
Y=range
def O():
 for n in C(0):yield from bin(n)[2:]
def B():
 s=i=0
 while 1:
  i+=s
  for j in Y(i,i+s+1):yield j
  s+=2;i+=s-1
def s(i):return D(i)==1
def F():
 a=[1]*3
 for n in C(3):a+=[a[n-a[n-1]]+a[n-a[n-2]]];yield a[-1]
L,R=input().split()
J=[x for x,U in zip([F(),(n for n in C(0)if s(D(n,'0')-1)and s(D(n))),B(),(i for i,c in enumerate(O())if'1'>c)],"{0:04b}".format(int(L)))if U>'0']
X=[set()for _ in J]
M=[]
Z=int(R);K=1
while len(M)<Z:
 for x,j in zip(X,J):x.add(next(j))
 for _ in Y(K):X[0].add(next(J[0]));K+=1
 M=X[0]
 for x in X:M=M&x
print(sorted(M)[:Z])

이것은 간단한 해결책입니다. 생성기를 사용하여 각 무한 시퀀스를 정의하고 교차점이 충분히 크지 않은 경우 각 시퀀스에 단계를 추가하십시오.

비단 조적으로 증가하는 Hofstadter 시퀀스를 설명하기 위해 : 각 단계에서 해당 시퀀스에 대해 1, 2, 4, 8, 16, 32 등의 시퀀스에 대해 두 배를 생성합니다. 질문에 명시된 범위를 만족한다고 생각합니다. 여기에 제시된 모든 테스트 사례에 대해 여전히 충분히 빠릅니다.


2
골프 : from itertools import count as C-> from itertools import* C=count, def s(i):return D(i)==1-> s=lambda i:D(i)==1(이 기능이 더 짧아 진다고 생각하지 않습니다 ...), "{0:04b}".format(int(L)))if U>'0'->"{0:04b}".format(int(L)))if'0'<U
Justin Justin

3

1923 년 C #

아마도 가장 짧은 프로그램은 아니지만 도전 과제가 흥미 로웠으므로 여기에 내 해결책이 있습니다.

35 개의 숫자 (15 35)로 4 개를 모두 실행하는 데 약 5 초가 걸립니다.

여기 에서 테스트 할 수 있지만 OEIS4를 원하는 경우 원하는 자릿수가 작거나 넷피들에 메모리가 부족해야합니다.

골프

using System;using System.Collections;using System.Collections.Generic;using System.Linq;class p{public static void Main(string[] args){int b=0;IEnumerable<int>a=null;foreach(char c in Convert.ToString(int.Parse(args[0]),2).Reverse()){++b;if(c=='0')continue;switch(b){case 1: a=d(a,e());break;case 2: a=d(a,f());break;case 3: a=d(a,g());break;case 4: a=d(a,h(),true);break;}}if(a==null)return;bool j=true;foreach(int i in a.Take(int.Parse(args[1]))){if(j)j=false;else Console.Write(",");Console.Write(i);}}static IEnumerable<int>d(IEnumerable<int>k,IEnumerable<int>l,bool m=false){if(k==null)foreach(int n in l)yield return n;int o=0;int p=1;foreach(int i in k){Dictionary<int,HashSet<int>>q=m ? new Dictionary<int,HashSet<int>>(): null;int s=0;foreach(int n in l){if(!m){if(i<n)break;}else{if(!q.ContainsKey(o))q.Add(o,new HashSet<int>());q[o].Add(n);if(q.Count==1){int r=q[o].OrderBy(gi =>gi).Take(2).Sum();if(i<r)break;}else{int r=q[o].Concat(q[o-1]).OrderBy(gi =>gi).Take(2).Sum();if(i<r)break;}if(++s==p){o++;p=(int)Math.Pow(2,o);}}if(i==n){yield return i;break;}}}}static IEnumerable<int>e(){int t=0;for(int i=0;i<int.MaxValue;i++)foreach(char c in Convert.ToString(i,2)){if(c=='0')yield return t;t++;}}static IEnumerable<int>f(){int t=1;int u=0;bool v=true;using(IEnumerator<int>w=Enumerable.Range(0,int.MaxValue).GetEnumerator()){while(w.MoveNext()){if(v){if(u==0)u=t+1;yield return w.Current;if(--t==0)v=false;}else{if(t==0)t=u+1;if(--u==0)v=true;}}}}static IEnumerable<int>g(){for(int i=0;i<int.MaxValue;i++){string s=Convert.ToString(i,2);if(x(s.Count(c =>c=='0'))&& x(s.Count(c =>c=='1')))yield return i;}}static bool x(int y){return(y != 0)&&((y &(y-1))==0);}static IEnumerable<int>h(){return Enumerable.Range(1,int.MaxValue).Select(z);}static Dictionary<int,int>_=new Dictionary<int,int>();static int z(int n){int a;if(!_.TryGetValue(n,out a)){if(n<3)a=1;else a=z(n-z(n-1))+z(n-z(n-2));_.Add(n,a);}return a;}}

읽을 수있는

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

class Programm
{
    public static void Main(string[] args)
    {
        int index = 0;

        IEnumerable<int> intersection = null;

        foreach (char c in Convert.ToString(int.Parse(args[0]), 2).Reverse())
        {
            ++index;
            if (c == '0')
                continue;

            switch (index)
            {
                case 1: intersection = _join(intersection, OEIS1()); break;
                case 2: intersection = _join(intersection, OEIS2()); break;
                case 3: intersection = _join(intersection, OEIS3()); break;
                case 4: intersection = _join(intersection, OEIS4(), true); break;

                default: throw new ArgumentException();
            }
        }
        if (intersection == null)
            return;

        bool first = true;
        foreach (int i in intersection.Take(int.Parse(args[1])))
        {
            if (first) first = false;
            else Console.Write(",");

            Console.Write(i);
        }

        Console.ReadKey();
    }

    private static IEnumerable<int> _join(IEnumerable<int> intersection, IEnumerable<int> newSequence, bool hof = false)
    {
        if (intersection == null)
            foreach (int n in newSequence) yield return n;



        int generation = 0;
        int generationMax = 1;
        foreach (int i in intersection)
        {
            Dictionary<int, HashSet<int>> generationCache = hof ? new Dictionary<int, HashSet<int>>() : null;
            int count = 0;
            foreach (int n in newSequence)
            {
                if (!hof)
                {
                    if (i < n)
                        break;
                }
                else
                {
                    if (!generationCache.ContainsKey(generation))
                        generationCache.Add(generation, new HashSet<int>());

                    generationCache[generation].Add(n);

                    if (generationCache.Count == 1)
                    {
                        int lowerBound = generationCache[generation].OrderBy(gi => gi).Take(2).Sum();
                        if (i < lowerBound)
                            break;
                    }
                    else
                    {
                        int lowerBound = generationCache[generation].Concat(generationCache[generation - 1]).OrderBy(gi => gi).Take(2).Sum();
                        if (i < lowerBound)
                            break;
                    }

                    if (++count == generationMax)
                    {
                        generation++;
                        generationMax = (int)Math.Pow(2, generation);
                    }
                }

                if (i == n)
                {
                    yield return i;
                    break;
                }
            }
        }
    }


    static IEnumerable<int> OEIS1()
    {
        int position = 0;
        for (int i = 0; i < int.MaxValue; i++)
            foreach (char c in Convert.ToString(i, 2))
            {
                if (c == '0')
                    yield return position;
                position++;
            }
    }

    static IEnumerable<int> OEIS2()
    {
        int take = 1;
        int skip = 0;
        bool doTake = true;
        using (IEnumerator<int> enumerator = Enumerable.Range(0, int.MaxValue).GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                if (doTake)
                {
                    if (skip == 0)
                        skip = take + 1;
                    yield return enumerator.Current;
                    if (--take == 0)
                        doTake = false;
                }
                else
                {
                    if (take == 0)
                        take = skip + 1;
                    if (--skip == 0)
                        doTake = true;
                }
            }
        }
    }

    static IEnumerable<int> OEIS3()
    {
        for (int i = 0; i < int.MaxValue; i++)
        {
            string s = Convert.ToString(i, 2);
            if (_isPowerOfTwo(s.Count(c => c == '0')) && _isPowerOfTwo(s.Count(c => c == '1')))
                yield return i;
        }
    }

    static bool _isPowerOfTwo(int number)
    {
        return (number != 0) && ((number & (number - 1)) == 0);
    }

    static IEnumerable<int> OEIS4()
    {
        return Enumerable.Range(1, int.MaxValue).Select(HofstadterQ);
    }

    static Dictionary<int, int> _hofstadterQCache = new Dictionary<int, int>();

    static int HofstadterQ(int n)
    {
        int result;
        if (!_hofstadterQCache.TryGetValue(n, out result))
        {
            if (n < 3)
                result = 1;
            else
                result = HofstadterQ(n - HofstadterQ(n - 1)) + HofstadterQ(n - HofstadterQ(n - 2));

            _hofstadterQCache.Add(n, result);
        }
        return result;
    }
}

설명

이것은 게으른 평가 빅 타임을 사용하여 빨리 알 수 있습니다. 또한 프레임 워크 Convert.ToString (number, 2) 메서드를 사용하여 "bitlogic"을 수행하는 것이 게으르다. 이것은 숫자를 문자열로 나타내는 binray 표현으로 바꿉니다.

Linq-Method 교차가 전체 시퀀스의 교차점을 계산할 때 seuqence를 교차시키기 위해 내 자신의 방법을 작성해야했으며, 문자 그대로 불가능했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.