Diziyi atlama adlı tek oyunculu bir oyun oynayalım . Oynamak için, sadece bir dizi tamsayıya ihtiyacınız var a
. Bir pozisyonda başlarsınız i
ve her turda yeni bir pozisyona atlarsınız. Sırayla n
,
- eğer
n
eşitse, mutlak pozisyona atlarsınıza[i] mod length(a)
, - eğer
n
garip, göreli konuma atlamak(i + a[i]) mod length(a)
.
Dizi indeksleme sıfırdan başlar. İlk atlamayı farklı bir oyun veren dönüş 0
veya dönüş olarak sayabilirsiniz 1
. Oyunun durum alanı sınırlı olduğu için (hareketiniz pozisyonunuza ve dönüş numarasının paritesine göre belirlenir), elbette sonunda eşit uzunlukta bir döngü gireceksiniz. loop(a, i, b)
İlk atlama dönüş olarak sayıldığında, bu döngünün uzunluğunu belirtin b
.
Giriş
a
Oyunu oynamak için boş bir tamsayı dizisi .
Çıktı
Maksimum sayı p
, bir konuma başlarken i
ve ilk dönüşü ya 0
da olarak sayarken, 1
sonunda bir uzunluk döngüsü girersiniz 2 * p
. Başka bir deyişle, çıktınız sayıdır
max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }
kurallar
Bir işlev veya tam bir program verebilirsiniz. En küçük bayt sayısı kazanır ve standart boşluklara izin verilmez.
Test senaryoları
[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
her zaman pozitif ( -1 mod 5 == 4
) olarak tanımlandığını varsayalım.
mod
her zaman olumsuz olmayan sonuçlar veren Haskell tarzı kullanıyorum .