Mari kita main game satu pemain yang disebut jump the array . Untuk bermain, Anda hanya perlu array bilangan bulat, katakanlah a
. Anda mulai pada suatu posisi i
, dan pada setiap belokan, Anda melompat ke posisi baru. Pada gilirannya n
,
- jika
n
genap, Anda melompat ke posisi absoluta[i] mod length(a)
, - jika
n
aneh, Anda melompat ke posisi relatif(i + a[i]) mod length(a)
.
Pengindeksan array dimulai dari nol. Anda dapat menghitung lompatan pertama sebagai belokan 0
atau belokan 1
, yang memberikan gim yang berbeda. Karena ruang keadaan permainan terbatas (gerakan Anda ditentukan oleh posisi Anda dan paritas nomor belokan), Anda tentu saja pada akhirnya akan memasukkan lingkaran yang panjangnya genap. Dilambangkan dengan loop(a, i, b)
panjang loop ini, ketika lompatan pertama dihitung sebagai belokan b
.
Memasukkan
Array kosong kosong a
untuk bermain game.
Keluaran
Jumlah maksimum p
sedemikian sehingga, ketika mulai pada beberapa posisi i
dan menghitung belokan pertama sebagai salah satu 0
atau 1
, Anda akhirnya memasukkan satu lingkaran panjang 2 * p
. Dengan kata lain, output Anda adalah angka
max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }
Aturan
Anda dapat memberikan fungsi atau program lengkap. Hitungan byte terkecil menang, dan celah standar tidak diizinkan.
Uji kasus
[0] -> 1
[-213] -> 1
[1,3,12,-1,7] -> 1
[2,3,5,7,9,11,13,17,19] -> 2
[-2,3,-5,7,-9,11,-13,17,-19,23,-27] -> 3
[0,2,5,4,-9,0,-1,1,-1,1,-6] -> 4
mod
didefinisikan sebagai selalu positif (-1 mod 5 == 4
) tidak seperti dalam C. Apakah itu yang terjadi?mod
, yang selalu memberikan hasil tidak negatif.Jawaban:
Pyth : 28 karakter (Python 2: 116 karakter)
Pemakaian:
Coba di sini: Pyth Compiler / Executor
Ia mengharapkan daftar bilangan bulat sebagai input
[0,2,5,4,-9,0,-1,1,-1,1,-6]
Penjelasan:
Saya perhatikan satu properti penting dari fungsi
loop
: Untuk masing-masingi
adaj
, sehinggaloop(a,i,0) == loop(a,j,1)
dan sebaliknya. Karena itu kita hanya perlu menghitung nilailoop(a,i,b)
untukb=0
.Bukti: Jika adalah siklus
i -> j -> k -> ... -> z -> i
denganb = 0
, maka ada siklusj -> k -> ... -> z -> i -> j
denganb = 1
.Karenanya skrip sederhana dapat bekerja dengan cara berikut. Iterasi atas semua
i
dan coba jangkaui
dengan komputasi berulangi = a[(i + a[i]) mod len(a)] mod len(a)
. Karena perhitungan ini dapat berjalan ke dalam siklus tanpai
, kami membatalkan perhitungan setelahlen(a)
langkah-langkah. Kemudian kami mencetak siklus maksimum.Sebuah Python 2 implementasi terlihat seperti ini ( 125 karakter }:
Untuk implementasi pyth saya menggunakan pendekatan yang sedikit berbeda. Untuk setiap
i
saya menghitung daftar posisi, dan mencarii
dalam daftar ini.sunting: Python 2: 116 karakter
solusi @proud haskeller adalah saya beberapa karakter lebih pendek dari solusi Python saya, karena itu saya 'harus' mempersingkat sedikit.
Perbedaannya adalah, saya menghitung angka secara rekursif dan bukan iteratif.
sumber
Python - 157
sumber
len(a)
variabel dan mengganti semualen(a)
dengan nama variabel itu, Anda dapat menyimpan beberapa karakter.t+=1;t%=2
->t^=1
danif t: j=(j+a[j])%z else: j=a[j]%z
->j=(t*j+a[j])%z
while c not in s[:-1]:
bisa jadiwhile(c in s[:-1])-1:
.j
, karena loop ini menetapkan kontenrange(z)
untuki
bukannya menambahnya. Cukup gantij
dengani
untuk menyimpan 4 karakter.Haskell,
120105ini menghasilkan daftar tanpa batas untuk setiap titik awal (untuk alasan bermain golf, kami beralih pada semua nilai alih-alih semua indeks, yang setara). lalu menghitung siklus setiap daftar (panjang siklus
xs
adalahxs % []
).ini menggunakan pengamatan @ jakubes tentang siklus. karena langkah 2 langkah sekaligus, kita tidak perlu membagi 2 pada akhir.
Sunting : sekarang menggunakan trik @MthViewMark untuk menjatuhkan
n
elemen pertama untuk menjamin memiliki siklus dengan elemen pertama. Ngomong-ngomong, saya berhasil memasukkan algoritmanya ke112
karakter:sumber
Haskell - 139 karakter
Contoh:
Ini menggunakan pengamatan @ jakube bahwa Anda hanya perlu memeriksa setengah nilai awal, sambil melakukan 2 langkah per iterasi.
sumber
where
ke sebelumnya]
. Juga, apakah Anda mencoba menggunakancycle l!!i
bukanl!!mod n(length l)
?b
, dan menggunakan penjaga pola|n<-l a
untuk menghilangkanwhere
.Python, 160
Fungsi untuk jawabannya adalah
j
.Fungsi rekursif
l
mengembalikan panjang loop untuk array yang diberikan, mulai, dan belok pertama, dan fungsij
menemukan maks.sumber
lambda
.Mathematica,
189 162161 byteJika fungsi anonim diizinkan - 161 byte:
Kalau tidak - 163 byte:
Menjalankan ini pada semua kasus uji:
Hasil dalam:
Python 2, 202 byte
DEMO
Ini hampir merupakan port dari jawaban Mathematica saya.
sumber
For
dengan 3 argumen biasanya lebih pendek dariWhile
(karena Anda dapat menghemat titik koma di depanFor
).Mathematica,
113112 karakterContoh:
sumber
ised 82
Argumen pertama tidak dihitung menjadi panjang (inisialisasi array ke
$1
danb
inisialisasi ke$2
- pilih "permainan").sumber