Dizilerin kesişimini yazdırın


9

Diziler

Sen numaralı dört sayı dizileri verilmektedir 1yoluyla 4.

  1. OEIS0 Doğal sayıların ikilik olarak listelendiği konumdur . Sıralamanın nasıl hesaplanacağına ilişkin bir örnek:

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

    Dizinin başlangıcı şöyle: 0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...


  1. OEIS Bu dizi ilk doğal sayıyı içerir, sonraki ikisini atlar, sonra sonraki üçünü içerir, sonra sonraki dördünü atlar ve devam eder.

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

  1. OEIS sayısı hem pozitif tamsayılar 0'ler ve sayısı 1' sayısının ikili gösteriminde s yetkileri şunlardır 2.

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

  1. OEIS Hofstadter Q dizisi .

    a (1) = a (2) = 1;
    n> 2 için 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, ...
    

    Bu dizi hakkında çok az şey kanıtlanmıştır, ancak birçok ampirik sonuç bulunmaktadır. Biri özellikle önemlidir ve bunun tüm seri için geçerli olduğunu varsayabilirsiniz:

    Bu makale , serinin elemanlarının nesiller halinde gruplandırılabileceğini gözlemlemiştir. Onları 1'den başlayarak numara, o zaman k nesil inci tam 2 içeren k elemanlar. İlgili özellik, k kuşağındaki tüm sayıların, k-1 ve / veya k-2 nesillerinden iki sayı toplanmasıyla elde edilir , ancak asla önceki nesillerden elde edilmesidir. Bu (ve yalnızca bu) gözlemi, dizideki kalan öğelere bir alt sınır koymak için kullanabilirsiniz.


Meydan okuma

xZorluk, verilen giriş dizilerinin kesişimindeki ilk sayıları yazdırmaktır .

Girdi: Üzerinde boşlukla ayrılmış iki sayı STDIN. İlk numara arasında bir tam sayı olduğu 1için 15her şeyi kapsayan burada bir sekansa her bir bit denk gelmektedir. En düşük bit diziye karşılık gelir 1ve en yüksek bit diziye karşılık gelir 4. İkincisi, xçıktı alınacak sayı miktarıdır STDIN.

Çıktı:x Belirtilen girdi dizileriyle kesişen ilk sayılar. STDOUTHerhangi bir açık boşluk veya noktalama işareti (boşluk, sekme, yeni satır, virgül, iki nokta üst üste, nokta vb.) İle sayıları yazdırın .


Örnekler

1.3 Her sırada bulunan ilk sayıları yazdırın .

Giriş: 15 3

Çıktı: 10,23,40


2. İlk 12sayıları sıra numarası 1ile yazdırın 4.

Giriş: 9 12

Çıktı: 3,8,10,14,19,20,21,23,24,31,37,40


3. İlk 10numaraları sırayla yazdırın 2.

Giriş: 2 10

Çıktı: 0,3,4,5,10,11,12,13,14,21


4. İlk 6sayıları sırayla yazdırın 3ve 4.

Giriş: 12 6

Çıktı: 2,4,5,6,9,10


ayrıntılar

  • Çıktıyı gittikçe veya sonunda bir defada yazdırabilirsiniz.

Sohbette buna yardımcı olan herkese çok teşekkürler! Bu soru kum havuzunda olmaktan büyük fayda sağladı .


@chilemagic: Aslında bir kavşakta "ilk X sayılarını" nasıl tanımlarsınız? 12 5Örnekteki her iki diziyi aynı dizine kadar alırsanız, 10gerçekten de daha önce 9kavşakta gelir ... diziler arasında ilerlerken 9olası bir kavşak olarak # 3'ü atlayıp atlamayacağınıza nasıl karar verirsiniz ? # 3 gibi olsaydı 7, o zaman # 4'te görünmediği için atlamanız gerekir
Claudiu

@Claudiu Çıktılarınız her zaman artıyor olmalı ve her sayı çıktınızda yalnızca bir kez görünecektir.
hmatt1

İçin bir maksimum sınır var mı x?
Ypnypn

@ypnypn bir sınırı kodlamıyor, ancak algoritmanız çok yavaşsa veya çok büyük girişler için bitmezse sorun değil. Bu kod golf yani bayt kaydetmek için verimsiz olabilir.
hmatt1

Yanıtlar:


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

Oldukça iyi bir performans sergiliyor. İşte OP'nin birkaç örneği:

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 karakter

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

Bu basit bir çözümdür: sonsuz dizilerin her birini tanımlamak için jeneratörleri kullanın ve kesişim yeterince büyük olmadığı sürece her diziye bir adım ekleyin.

Monoton olarak artan Hofstadter sekansını hesaba katmak için: her aşamada bu sekans için iki kat daha fazla üretiyorum, örneğin 1, sonra 2, 4, 8, 16, 32, vb. ve orada sunulan tüm test senaryoları için hala yeterince hızlı.


2
Golfler: from itertools import count as C-> from itertools import* C=count, def s(i):return D(i)==1-> s=lambda i:D(i)==1(Bu fonksiyonun kısaldığını düşünmüyorum bile ...), "{0:04b}".format(int(L)))if U>'0'->"{0:04b}".format(int(L)))if'0'<U
Justin

3

C #, 1923

Muhtemelen en kısa program olmayacak, ancak zorluğu ilginç buldum, işte benim çözümüm.

4 rakamın 35 Numara (15 35) ile çalıştırılması yaklaşık 5 saniye sürer.

Burada test edebilirsiniz , ancak OEIS4 istiyorsanız, istediğiniz basamak miktarının küçük olması veya netfiddle belleğinin bitmesi gerektiğini unutmayın.

golfed

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

Okunabilir

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

açıklama

Bu tembel değerlendirme Bigtime hızlı i kavga yapar yapar kullanır. Ayrıca ben çerçeveler Convert.ToString (sayı, 2) yöntemini kullanarak herhangi bir "bitlogic" yapıyor tembel oldu. Bu, herhangi bir sayıyı dize olarak binray gösterimine dönüştürür.

Linq-Method kesişimi tam dizinin kesişimini hesaplarken, seuqları kesişmek için kendi yöntemimi yazmak zorunda kaldım ve bu tam anlamıyla imkansızdı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.