In giao điểm của trình tự


9

Trình tự

Bạn được đưa ra bốn chuỗi số, được đánh số 1thông qua 4.

  1. OEIS Vị trí của 0các số tự nhiên được liệt kê ở dạng nhị phân. Dưới đây là một ví dụ về cách tính toán trình tự:

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

    Bắt đầu của chuỗi diễn ra như sau: 0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...


  1. OEIS Chuỗi này bao gồm số tự nhiên đầu tiên, bỏ qua hai số tiếp theo, sau đó bao gồm ba số tiếp theo, sau đó bỏ qua bốn số tiếp theo và tiếp tục.

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

  1. Các số nguyên dương của OEIS trong đó cả số lượng 0và số lượng 1trong biểu diễn nhị phân của số đều là lũy thừa 2.

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

  1. OEIS Trình tự Q của Hofstadter .

    a (1) = a (2) = 1;
    a (n) = a (na (n-1)) + a (na (n-2)) cho 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, ...
    

    Ít được chứng minh nghiêm ngặt về trình tự này, nhưng nhiều kết quả thực nghiệm tồn tại. Một là đặc biệt quan trọng và bạn có thể cho rằng nó hợp lệ cho toàn bộ loạt:

    Bài viết này quan sát thấy rằng các yếu tố của bộ truyện có thể được nhóm lại thành các thế hệ. Nếu chúng ta đánh số chúng bắt đầu từ 1, thì thế hệ thứ k chứa chính xác 2 k phần tử. Thuộc tính có liên quan là tất cả các số trong thế hệ k có được bằng cách tính tổng hai số từ các thế hệ k-1 và / hoặc k-2 , nhưng không bao giờ từ các thế hệ trước. Bạn có thể sử dụng quan sát này (và chỉ điều này) để đặt giới hạn dưới cho các yếu tố còn lại trong chuỗi.


Thử thách

Thách thức của bạn là in các xsố đầu tiên trong giao điểm của các chuỗi đầu vào đã cho.

Đầu vào: Hai số cách nhau bởi một khoảng trắng trên STDIN. Con số đầu tiên là một số nguyên từ 1để 15Inclusive nơi mỗi bit tương ứng với một chuỗi. Bit thấp nhất tương ứng với chuỗi 1và cao nhất tương ứng với chuỗi 4. Thứ hai là số lượng x, để đầu ra STDIN.

Output: Đầu tiên xsố mà giao nhau với chuỗi đầu vào nhất định. In các số trên STDOUTvới bất kỳ khoảng trắng hoặc dấu chấm câu rõ ràng nào dưới dạng dấu phân cách (dấu cách, tab, dòng mới, dấu phẩy, dấu hai chấm, dấu chấm, v.v.).


Ví dụ

1. In các 3số đầu tiên trong mỗi chuỗi.

Đầu vào: 15 3

Đầu ra: 10,23,40


2. In các 12số đầu tiên trong số thứ tự 14.

Đầu vào: 9 12

Đầu ra: 3,8,10,14,19,20,21,23,24,31,37,40


3. In các 10số đầu tiên theo thứ tự 2.

Đầu vào: 2 10

Đầu ra: 0,3,4,5,10,11,12,13,14,21


4. In các 6số đầu tiên theo trình tự 34.

Đầu vào: 12 6

Đầu ra: 2,4,5,6,9,10


Chi tiết

  • Bạn có thể in đầu ra khi bạn đi hoặc tất cả cùng một lúc ở cuối.

Rất cảm ơn tất cả những người đã giúp đỡ trong việc này trong trò chuyện! Câu hỏi này được hưởng lợi rất nhiều từ việc ở trong hộp cát .


@chilemagic: Thật ra làm thế nào để bạn xác định "số X đầu tiên" trong một giao lộ? Nếu bạn lấy cả hai chuỗi trong 12 5ví dụ cho đến cùng một chỉ mục, thì 10thực sự có đến trước 9trong giao lộ ... giống như, làm thế nào bạn, trong khi đi qua các chuỗi, quyết định có bỏ qua 9số 3 như một giao lộ có thể không? Giống như nếu số 3 có 7trong đó thì bạn sẽ được yêu cầu bỏ qua vì nó không xuất hiện trong Số 4
Claudiu

@Claudiu Số lượng xuất ra của bạn sẽ luôn tăng và mỗi số sẽ chỉ xuất hiện một lần trong đầu ra của bạn.
hmatt1

Có giới hạn tối đa xkhông?
Ypnypn

@ypnypn không giới hạn mã cứng, nhưng nếu thuật toán của bạn rất chậm hoặc sẽ không hoàn thành đối với các đầu vào rất lớn thì không sao. Đây là mã golf để bạn có thể không hiệu quả để tiết kiệm byte.
hmatt1

Câu trả lời:


2

Haskell, 495 438 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

Nó thực hiện hợp lý tốt. Dưới đây là một vài ví dụ của 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

Python 3, 590 639 ký tự

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])

Đây là giải pháp đơn giản: sử dụng các trình tạo để xác định từng chuỗi vô hạn và miễn là giao lộ không đủ lớn, hãy thêm một bước cho mỗi chuỗi.

Để giải thích cho chuỗi Hofstadter không tăng đơn điệu: ở mỗi bước tôi tạo ra gấp đôi số lượng cho chuỗi đó, ví dụ 1, sau đó 2, 4, 8, 16, 32, v.v. Tôi nghĩ rằng nó thỏa mãn ràng buộc đã nêu trong câu hỏi và nó vẫn đủ nhanh cho tất cả các trường hợp thử nghiệm được trình bày ở đó.


2
Golf: from itertools import count as C-> from itertools import* C=count, def s(i):return D(i)==1-> s=lambda i:D(i)==1(Tôi thậm chí không nghĩ chức năng này làm cho nó ngắn hơn ...), "{0:04b}".format(int(L)))if U>'0'->"{0:04b}".format(int(L)))if'0'<U
Justin

3

C #, 1923

Nó có thể không phải là chương trình ngắn nhất nhưng tôi thấy thử thách thú vị, vì vậy đây là giải pháp của tôi.

Chạy cả 4 với 35 Số (15 35) mất khoảng 5 giây.

Bạn có thể kiểm tra nó ở đây , nhưng lưu ý rằng nếu bạn muốn OEIS4, số lượng chữ số bạn muốn cần phải nhỏ hoặc netfiddle hết bộ nhớ.

Chơi gôn

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;}}

Có thể đọc được

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;
    }
}

Giải trình

Điều này làm cho việc sử dụng lười biếng đánh giá thời gian lớn mà làm cho nó nhanh hơn tôi tin tưởng. Ngoài ra, tôi đã lười biếng thực hiện bất kỳ "bitlogic" nào bằng cách sử dụng phương thức Convert.ToString (number, 2). Điều này biến bất kỳ số nào thành biểu diễn binray của nó dưới dạng một chuỗi.

Tôi đã phải viết phương thức của riêng mình để cắt các seuqences khi giao điểm Linq-Phương thức tính toán giao điểm của chuỗi đầy đủ, và điều đó theo nghĩa đen là không thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.