跳躍のトカゲ!


8

長さNの自然数の配列Lを受け取り、次のような簡単なプログラムを定義するとします。

i=0                 #start at the first element in the source array
P=[]                #make an empty array
while L[i]!=0:      #and while the value at the current position is not 0
    P.append(L[i])  #add the value at the current position to the end of the output array
    i=(i+L[i])%N    #move that many spaces forward in the source array, wrapping if needed
return P            #return the output array

このようなプログラムはすべて、永久に実行されるか、最終的に終了して、正の整数のリストを生成します。あなたの仕事は、正の整数のリストPが与えられると、終了し、前のプログラムに接続されたときにPを生成する自然数の最短リストLを生成することです。

そのようなリストは常に存在します。なぜなら、リストのP[i]-1それぞれの後にゼロを追加P[i]し、最後に1つの0を追加するだけで、元のリストが生成されます。たとえば、が与えられた[5,5]場合、1つのソリューションは[5,0,0,0,0,5,0,0,0,0,0]です。ただし、[5,0,5]ははるかに短いため、自動ソリューションはプログラムにとって有効なソリューションではありません。

[5,6]->[5,6,0,0]  
[5,7]->[5,0,0,0,0,7,0,0]
[5,6,7]->[5,6,0,7]
[5,6,8]->[5,0,8,0,0,6,0,0,0]
[1,2,3,4]->[1,2,0,3,0,0,4,0]
[1,2,1,2]->[1,2,0,1,2,0,0]
[1,3,5,7]->[1,3,0,0,5,0,0,0,0,7]
[1,3,5,4]->[1,3,4,0,5,0,0]

入力は正の整数のリスト(指定できるいくつかの形式)であり、出力は同じ形式でなければなりません。リストと整数のサイズは最大2 ^ 16です。これはコードゴルフなので、バイト単位の最短プログラムが勝ちます!


5
最大65536要素の任意のリストを10分間で処理できると確信していますか?それを実現するリファレンス実装はありますか?
Peter Taylor

2
参考までに、サンドボックスは3時間を超えて使用するとより効果的です。PIはすぐに投稿するのは魅力的である可能性があることを理解していますが、ピーターのコメントは、この質問がそこでの長時間の実行からどのように利益を得たのかを示していると思います。
FryAmTheEggman 2016年

回答:


5

Python 3、109 102 100 95 93バイト

def f(L,k=1,i=0):
 P=[0]*k
 for x in L:x=P[i]=P[i]or x;i=(i+x)%k
 return P[i]and f(L,k+1)or P

再帰的なソリューション。のように呼んでくださいf([1,2,3,4])すべてのテストケースに合格することを確認します。

k=1(出力の長さ)とi=0(出力内の位置)から始めてPkゼロのリストを作成します。要素に沿っその後、我々反復xL、更新P[i]P[i]or x(そうP[i]、それのゼロ以外の場合はその値を保ち)とiします(i+P[i])%k。その後、の最終値P[i]がゼロであることを確認し、ゼロでkない場合は増分して、を返しPます。

アルゴリズムのいずれかの時点でP[i]すでにゼロ以外の値である場合はP、のゼロ以外の値の一部をループするループに入り、ゼロ以外の値になります。その後、再帰します。

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