พิมพ์จุดตัดของลำดับ


9

ลำดับ

คุณจะได้รับสี่ลำดับหมายเลขหมายเลขผ่าน14

  1. OEISตำแหน่งของ0เมื่อตัวเลขธรรมชาติแสดงเป็นเลขฐานสอง นี่คือตัวอย่างของวิธีการคำนวณลำดับ:

     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ลำดับนี้รวมถึงหมายเลขธรรมชาติแรกข้ามสองถัดไปจากนั้นรวมสามถัดไปแล้วข้ามสี่ถัดไปและดำเนินการต่อ

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

  1. OEISจำนวนเต็มบวกที่ทั้งจำนวนของ0's และจำนวน1' s 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;
    a (n) = a (na (n-1)) + a (na (n-2)) สำหรับ 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ประการที่สองคือจำนวนของตัวเลขเพื่อเอาท์พุทxSTDIN

เอาท์พุท:xตัวเลขแรกที่ตัดกับลำดับสัญญาณที่กำหนด พิมพ์ตัวเลขบนSTDOUTด้วยช่องว่างหรือเครื่องหมายวรรคตอนที่ชัดเจนใด ๆ เป็นตัวคั่น (ช่องว่างแท็บขึ้นบรรทัดใหม่จุลภาคเครื่องหมายจุดคู่ระยะเวลา ฯลฯ )


ตัวอย่าง

1.พิมพ์3ตัวเลขแรกที่อยู่ในทุกลำดับ

การป้อนข้อมูล: 15 3

เอาท์พุท: 10,23,40


2.พิมพ์ครั้งแรก12ตัวเลขในจำนวนลำดับและ14

การป้อนข้อมูล: 9 12

เอาท์พุท: 3,8,10,14,19,20,21,23,24,31,37,40


3.พิมพ์ครั้งแรกตัวเลขในลำดับ102

การป้อนข้อมูล: 2 10

เอาท์พุท: 0,3,4,5,10,11,12,13,14,21


4.พิมพ์ครั้งแรก6ตัวเลขในลำดับและ34

การป้อนข้อมูล: 12 6

เอาท์พุท: 2,4,5,6,9,10


รายละเอียด

  • คุณสามารถพิมพ์งานออกมาในขณะที่คุณไปหรือทั้งหมดพร้อมกันในตอนท้าย

ขอบคุณมากสำหรับทุกคนที่ช่วยด้วยในการแชท! คำถามนี้ได้รับประโยชน์อย่างมากจากการอยู่ในกระบะทราย


@chilemagic: จริงๆแล้วคุณกำหนด "หมายเลข X แรก" ในทางแยกได้อย่างไร หากคุณนำทั้งสองลำดับใน12 5ตัวอย่างมาเป็นดัชนีเดียวกันแล้ว10จะเกิดขึ้นก่อนหน้านี้9ในทางแยก ... เช่นคุณจะทำอย่างไรในขณะที่ผ่านลำดับให้ตัดสินใจว่าจะข้าม9ใน # 3 เป็นจุดตัดที่เป็นไปได้หรือไม่ เช่นถ้า # 3 มี7อยู่ในนั้นคุณจะต้องข้ามมันตั้งแต่ที่ไม่ปรากฏใน # 4
Claudiu

@Claudiu ตัวเลขที่ส่งออกของคุณควรเพิ่มขึ้นเรื่อย ๆ และแต่ละหมายเลขจะปรากฏเพียงครั้งเดียวในผลลัพธ์
hmatt1

มีขีด จำกัด สูงสุดxหรือไม่?
Ypnypn

@ypnypn ไม่ จำกัด โค้ดอย่างหนัก แต่ถ้าอัลกอริทึมของคุณช้ามากหรือจะไม่เสร็จสิ้นสำหรับอินพุตที่มีขนาดใหญ่มากก็โอเค นี่คือรหัสกอล์ฟเพื่อให้คุณไม่มีประสิทธิภาพในการบันทึกไบต์
hmatt1

คำตอบ:


2

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

Python 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, 32 เป็นต้นฉันคิดว่าเป็นไปตามขอบเขตที่ระบุไว้ในคำถาม และยังเร็วพอสำหรับกรณีทดสอบทั้งหมดที่นำเสนอที่นั่น


2
Golfs: 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

3

C #, 1923

มันอาจจะไม่ใช่โปรแกรมที่สั้นที่สุด แต่ฉันก็พบว่าความท้าทายที่น่าสนใจดังนั้นนี่คือทางออกของฉัน

การวิ่งทั้ง 4 ด้วย 35 เบอร์ (15 35) จะใช้เวลาประมาณ 5 วินาที

คุณสามารถทดสอบได้ที่นี่แต่โปรดทราบว่าหากคุณต้องการ OEIS4 จำนวนหลักที่คุณต้องการจะต้องมีขนาดเล็กหรือ netfiddle มีหน่วยความจำไม่เพียงพอ

แข็งแรงเล่นกอล์ฟ

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

คำอธิบาย

นี่ใช้การประเมินผลที่ขี้เกียจครั้งใหญ่ซึ่งทำให้มันรวดเร็วฉันเชื่อ ฉันยังขี้เกียจทำ "bitlogic" ใด ๆ โดยใช้เฟรมเวิร์ก Convert.ToString (number, 2) วิธี สิ่งนี้จะเปลี่ยนตัวเลขใด ๆ ให้เป็นตัวแทน binray ในรูปของสตริง

ฉันต้องเขียนวิธีการของตัวเองเพื่อตัดค่าส่วนแบ่งเนื่องจากจุดตัดของ Linq-Method คำนวณจุดตัดของลำดับเต็มและนั่นเป็นไปไม่ได้อย่างแท้จริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.