Zagrajmy w grę dla jednego gracza o nazwie przeskocz tablicę . Powiedzmy, że do gry wystarczy tablica liczb całkowitych a
. Zaczynasz od pewnej pozycji i
i za każdym razem skaczesz do nowej pozycji. Na kolei n
,
- jeśli
n
jest parzysty, przeskakujesz do pozycji absolutneja[i] mod length(a)
, - jeśli
n
jest nieparzysty, przeskakujesz do względnej pozycji(i + a[i]) mod length(a)
.
Indeksowanie tablicy rozpoczyna się od zera. Pierwszy skok możesz zaliczyć jako turę 0
lub turę 1
, które dają inną grę. Ponieważ przestrzeń stanu gry jest skończona (ruch zależy od twojej pozycji i parzystości liczby tur), oczywiście w końcu wejdziesz w pętlę o równej długości. Oznacz loop(a, i, b)
długość tej pętli, gdy pierwszy skok jest liczony jako zwrot b
.
Wejście
Niepuste tablice a
liczb całkowitych do gry.
Wynik
Maksymalna liczba p
taka, że rozpoczynając od jakiejś pozycji i
i licząc pierwszy zakręt jako jeden 0
lub 1
, ostatecznie wprowadzasz pętlę długości 2 * p
. Innymi słowy, twój wynik to liczba
max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }
Zasady
Możesz podać funkcję lub pełny program. Wygrywa najmniejsza liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
[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
jest zdefiniowane jako zawsze pozytywne (-1 mod 5 == 4
) w przeciwieństwie do C. Czy tak jest w tym przypadku?mod
, który zawsze daje nieujemne wyniki.Odpowiedzi:
Pyth : 28 znaków (Python 2: 116 znaków)
Stosowanie:
Wypróbuj tutaj: Pyth Compiler / Executor
Oczekuje listy liczb całkowitych jako danych wejściowych
[0,2,5,4,-9,0,-1,1,-1,1,-6]
Wyjaśnienie:
Zauważyłem jedną ważną właściwość funkcji
loop
: dla każdeji
jest takaj
, więcloop(a,i,0) == loop(a,j,1)
i na odwrót. Dlatego musimy tylko obliczyć wartościloop(a,i,b)
dlab=0
.Dowód: jeśli jest to cykl
i -> j -> k -> ... -> z -> i
zb = 0
, to istnieje cyklj -> k -> ... -> z -> i -> j
zb = 1
.Dlatego prosty skrypt może działać w następujący sposób. Powtórz wszystko
i
i spróbuj dotrzeći
iteracyjniei = a[(i + a[i]) mod len(a)] mod len(a)
. Ponieważ obliczenia te mogą przebiegać bez cyklui
, anulujemy je polen(a)
krokach. Następnie drukujemy maksymalny cykl.Python 2 wygląda realizacja tak ( 125 znaków }:
Do implementacji pytha zastosowałem trochę inne podejście. Dla każdego
i
obliczam listę pozycji i szukam nai
tej liście.edycja: Python 2: 116 znaków
Rozwiązanie @proud haskeller było o kilka znaków krótsze niż moje rozwiązanie Python, dlatego musiałem je nieco skrócić.
Różnica polega na tym, że obliczam liczbę rekurencyjnie zamiast iteracyjnie.
źródło
Python - 157
źródło
len(a)
zmienną i zastąpisz wszystkielen(a)
s nazwą tej zmiennej, możesz zapisać niektóre znaki.t+=1;t%=2
->t^=1
iif t: j=(j+a[j])%z else: j=a[j]%z
->j=(t*j+a[j])%z
while c not in s[:-1]:
może byćwhile(c in s[:-1])-1:
.j
, ponieważ ta pętla przypisuje zawartośćrange(z)
doi
zamiast zwiększać ją. Wystarczy wymienićj
zei
aby zaoszczędzić 4 znaków.Haskell,
120105generuje to nieskończoną listę dla każdego punktu początkowego (z powodów golfowych iterujemy wszystkie wartości zamiast wszystkich indeksów, które są równoważne). następnie oblicza cykl każdej listy (długość cyklu
xs
wynosixs % []
).wykorzystuje obserwacje @ jakubes na temat cykli. ponieważ wykonuje 2 kroki na raz, nie musimy dzielić przez 2 na końcu.
Edycja : teraz przy użyciu sztuczki @ MthViewMark polegającej na upuszczeniu pierwszych
n
elementów, aby zagwarantować cykl z pierwszym elementem. nawiasem mówiąc, udało mi się prześledzić jego algorytm do112
postaci:źródło
Haskell - 139 znaków
Przykłady:
Wykorzystuje to obserwację @ jakube, że wystarczy sprawdzić tylko połowę wartości początkowych, wykonując 2 kroki na iterację.
źródło
where
do poprzedniego]
. Czy próbowałeś użyćcycle l!!i
zamiastl!!mod n(length l)
?b
i użyć osłony wzorca,|n<-l a
aby wyeliminowaćwhere
.Python, 160
Funkcja odpowiedzi to
j
.Funkcja rekurencyjna
l
zwraca długość pętli dla danej tablicy, startu i pierwszego obrotu, a funkcjaj
znajduje maks.źródło
lambda
.Matematyka,
189 162161 bajtówJeśli dozwolone są funkcje anonimowe - 161 bajtów:
W przeciwnym razie - 163 bajty:
Uruchamianie tego na wszystkich testowych przypadkach:
Prowadzi do:
Python 2, 202 bajty
PRÓBNY
To prawie port mojej odpowiedzi Mathematica.
źródło
For
z 3 argumentami jest zwykle krótszy niżWhile
(ponieważ można zaoszczędzić na średniku przedFor
).Mathematica,
113112 znakówPrzykład:
źródło
ised 82
Pierwszy argument nie liczy się do długości (inicjalizacja tablicy do
$1
ib
inicjalizacja do$2
- wybierz „grę”).źródło