シーケンスの共通部分を印刷する


9

シーケンス

1からまで番号が付けられた4つの番号シーケンスが与えられ4ます。

  1. OEIS0自然数が2進数でリストされている場合のの場所。シーケンスを計算する方法の例を次に示します。

     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数のバイナリ表現で'sはの累乗です2

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

  1. OEISホフスタッター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つは特に重要であり、シリーズ全体で有効であると想定できます。

    この論文では、シリーズの要素を世代にグループ化できることを確認しました。それらに1から始まる番号を付けると、k番目の世代には正確に2 kの要素が含まれます。関連する特性は、世代kのすべての数値は、世代k-1および/またはk-2からの2つの数値を合計することによって得られますが、それ以前の世代からは決して得られないということです。この(そしてこれだけの)観測を使用して、シーケンスの残りの要素に下限を設定できます。


チャレンジ

課題はx、指定された入力シーケンスの共通部分の最初の数値を出力することです。

入力:上のスペースで区切られた2つの数値STDIN。最初の数はから1までの整数15で、各ビットはシーケンスに対応します。最下位ビットはシーケンス1に対応し、最上位ビットはシーケンスに対応します4。2番目はx、に出力する数値の量ですSTDIN

出力: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.最初の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それにある場合と同様に、#4には表示されないため、スキップする必要があります
Claudiu

@Claudiu出力される数値は常に増加しているはずであり、各数値は出力に一度だけ表示されます。
hmatt1 2014年

上限はありxますか?
Ypnypn 2014年

@ypnypnは制限をハードコーディングしませんが、アルゴリズムが非常に遅いか、非常に大きな入力に対して完了しない場合は問題ありません。これはコードゴルフなので、バイトを節約するのは非効率的です。
hmatt1 2014年

回答:


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

これは簡単な解決策です。ジェネレータを使用して無限シーケンスのそれぞれを定義し、交差が十分に大きくない限り、各シーケンスにステップを追加します。

非単調に増加するホフスタッターシーケンスを説明するために、各ステップで、そのシーケンスに対して2倍、たとえば1、次に2、4、8、16、32などを生成します。これは、質問で述べられた限界を満たすと思います、そしてそこに提示されているすべてのテストケースに対して十分に高速です。


2
ゴルフ:from itertools import count as C-> from itertools import* C=countdef 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

それはおそらく最短のプログラムではないでしょうが、私は挑戦が面白かったので、ここに私の解決策があります。

35個の数字(15 35)で4つすべてを実行するには、約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;
    }
}

説明

これは遅延評価ビッグタイムを利用するので、私はそれを速く感じさせます。また、フレームワークのConvert.ToString(number、2)メソッドを使用して「ビットロジック」を行うのが面倒でした。これにより、任意の数値が文字列としてのbinray表現に変わります。

Linq-Method intersectは完全なシーケンスの交差を計算するため、シーケンスを交差させる独自のメソッドを作成する必要があり、それは文字通り不可能でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.