Kadal Melompat!

8

Misalkan kita mendefinisikan program sederhana yang mengambil larik array bilangan asli dengan beberapa panjang N dan melakukan hal berikut:

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

Setiap program seperti itu akan berjalan selamanya atau pada akhirnya akan berakhir, menghasilkan daftar bilangan bulat positif. Tugas Anda adalah, mengingat daftar P bilangan bulat positif, menghasilkan daftar terpendek, L, dari bilangan asli yang berakhir dan menghasilkan P ketika dicolokkan ke program sebelumnya.

Daftar seperti itu selalu ada, karena orang hanya dapat menambahkan P[i]-1nol setelah masing-masing P[i]dalam daftar, lalu satu 0 terakhir, dan itu akan menghasilkan daftar asli. Misalnya, diberikan [5,5], satu solusinya [5,0,0,0,0,5,0,0,0,0,0]. Namun, [5,0,5]jauh lebih pendek, sehingga solusi otomatis tidak valid untuk program Anda.

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

Input adalah daftar bilangan bulat positif (dalam beberapa format Anda dapat menentukan) dan output harus dalam format yang sama. Ukuran daftar dan bilangan bulat bisa hingga 2 ^ 16. Ini kode golf, jadi program terpendek dalam byte menang!

Melon Fricative
sumber
5
Apakah Anda yakin bahwa menangani daftar sewenang-wenang hingga 65536 elemen dalam 10 menit layak? Apakah Anda memiliki implementasi referensi yang mencapainya?
Peter Taylor
2
Hanya sebagai FYI, kotak pasir lebih efektif bila digunakan lebih dari 3 jam: PI mengerti itu mungkin tergoda untuk dikirim segera, tetapi saya pikir komentar Peter menunjukkan bagaimana pertanyaan ini bisa mendapat manfaat dari jangka panjang di sana.
FryAmTheEggman

Jawaban:

5

Python 3, 109 102 100 95 93 byte

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

Solusi rekursif. Sebut saja seperti f([1,2,3,4]). Saksikan lulus semua kasus uji.

Kita mulai dengan k=1(panjang output) dan i=0(posisi dalam output), dan membuat daftar Pdengan knol. Kemudian kita iterate sepanjang unsur-unsur xdari L, memperbarui P[i]ke P[i]or x(sehingga P[i]membuat nilainya jika itu nol) dan iuntuk (i+P[i])%k. Setelah itu, kami memeriksa bahwa nilai akhir P[i]adalah nol, bertambah kjika tidak, dan kembali P.

Jika pada titik mana pun dari algoritma P[i]sudah nol, itu memasuki satu loop terjadi di sekitar beberapa nilai bukan nol P, dan berakhir pada nilai bukan nol; lalu kita kambuh.

Zgarb
sumber