Przegląd
Niektórzy z was mogą znać Sekwencję Kolakoskiego ( A000002 ), dobrze znaną autoreferencyjną sekwencję, która ma następującą właściwość:
Jest to sekwencja zawierająca tylko 1 i 2, a dla każdej grupy 1 i 2, jeśli dodasz długość serii, będzie ona równa się tylko połowie długości. Innymi słowy, sekwencja Kolakoski opisuje długość serii w samej sekwencji. Jest to jedyna sekwencja, która to robi, z wyjątkiem tej samej sekwencji z początkowym 1 usuniętym. (Jest to prawdą tylko wtedy, gdy ograniczysz się do sekwencji składających się z 1 i 2 sekund - Martin Ender)
Wyzwanie
Wyzwaniem jest, biorąc pod uwagę listę liczb całkowitych:
- Dane wyjściowe,
-1
jeśli lista NIE jest działającym prefiksem sekwencji Kolakoski. - Podaj liczbę iteracji zanim sekwencja stanie się
[2]
.
Opracowany przykład
Wykorzystując dostarczony obraz jako przykład:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] # Iteration 0 (the input).
[1,2,2,1,1,2,1,2,2,1,2] # Iteration 1.
[1,2,2,1,1,2,1,1] # Iteration 2.
[1,2,2,1,2] # Iteration 3.
[1,2,1,1] # Iteration 4.
[1,1,2] # Iteration 5.
[2,1] # Iteration 6.
[1,1] # Iteration 7.
[2] # Iteration 8.
Dlatego wynikowa liczba służy 8
do wprowadzenia [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1]
.
9
jest również w porządku, jeśli indeksujesz 1.
Pakiet testowy (możesz również testować z pod-iteracjami)
------------------------------------------+---------
Truthy Scenarios | Output
------------------------------------------+---------
[1,1] | 1 or 2
[1,2,2,1,1,2,1,2,2,1] | 6 or 7
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] | 8 or 9
[1,2] | 2 or 3
------------------------------------------+---------
Falsy Scenarios | Output
------------------------------------------+---------
[4,2,-2,1,0,3928,102904] | -1 or a unique falsy output.
[1,1,1] | -1
[2,2,1,1,2,1,2] (Results in [2,3] @ i3) | -1 (Trickiest example)
[] | -1
[1] | -1
Jeśli jesteś zdezorientowany:
Prawda: ostatecznie osiągnie dwa bez żadnego pośredniego kroku mającego elementy inne niż 1
i 2
. -Einkorn Enchanter 20 hours ago
Falsy: Wartość końcowa nie jest [2]
. Warunki pośrednie zawierają coś innego niż coś z zestawu [1,2]
. Kilka innych rzeczy, patrz przykłady.
To jest golf golfowy , zwycięzcą będzie najniższa liczba bajtów.
-1
?[2]
dopóki nie zobaczyłem[2,2,1,1,2,1,2]
przypadku testowego.1
i2
.[1]
jako przypadek testowy.Odpowiedzi:
Haskell ,
12687797675 bajtów39 bajtów zaoszczędzonych dzięki Ørjanowi Johansenowi
Wypróbuj online!
To błędy przy złych danych wejściowych.
źródło
f
(i w konsekwencji!
) można znacznie skrócić, używając leniwej produkcji +span
/length
zamiast akumulatorów. Wypróbuj online![1]
import Data.List;f l=length<$>group l
. (<$>
jest tutaj synonimemmap
). Zamiast dwóch różnych-1
przypadków, krótsze jest użycie@(_:_:_)
wzorca, aby zmusić główny przypadek tylko do dopasowania długości> = 2 list. Wypróbuj online!05AB1E , 22 bajty
Wypróbuj online!
Wyjaśnienie
źródło
[1,1,2,2,1,2,1,1,2,2,1,2,2,1,1,2,1,1]
SCALA, 290 (282 a) znaków, 290 (282 a) bajtów
Zajęło mi to bardzo długo ... Ale w końcu skończyłem!
z tym kodem:
Nie wiem, czy powinienem policzyć
var u=t
bajty, biorąc pod uwagę, że nie używamt
podczas algorytmu (kopia ma tylko modyfikowaćvar
zamiast parametrut
uważanego zaval
- dzięki ScaLa ). Powiedz mi, czy powinienem to policzyć.Wystarczająco trudne. Wypróbuj online!
PS: Myślałem o zrobieniu tego rekurencyjnie, ale będę musiał przekazać licznik jako parametr prawdziwej rekurencyjnej „podfunkcji”; fakt ten każe mi zadeklarować dwie funkcje, a te znaki / bajty są niczym innym jak zagubionym.
EDYCJA: Musiałem zmienić (?), Ponieważ nie jesteśmy pewni, czy powinniśmy brać pod uwagę
[1]
przypadki. Więc tutaj jest zmodyfikowany kod:Nie jest zoptymalizowany (mam duplikat „out” dla tych samych warunków:
[2]
kiedy dojdę i kiedy parametr[2]
jest traktowany osobno).NOWY KOSZT = 342 (Celowo nie zmodyfikowałem tytułu)
źródło
[1]
[2]
”[1]
nigdy nie dociera[2]
i dlatego powinien powrócić -1 .JavaScript,
146142 bajtówPierwsza próba gry w golfa wydaje się, że „powrót” w większej funkcji jest dość nużący ...
Ponadto sprawdzenie b = 1 i b = 2 zajmuje kilka bajtów ...
Oto kod:
Wyjaśnienie
Dane testowe (przy użyciu danych testowych)
Edycja 1: 146 -> 142: Cofam moją edycję po zmniejszeniu bajtów, ponieważ wpływa to na wynik; i trochę edycji ostatniego zdania
źródło
f=a=>{for(i=t=!a[0];a[1];)r=[],c=j=0,a.map(a=>{t|=a-1&&a-2;a-c&&(0<j&&r.push(j),c=a,j=0);j++}),(a=r).push(j),i++;return t||a[0]-2?-1:0^i}
zapisuje 5 bajtów (dla pętli zamiast while; przecinki vs. nawiasy klamrowe; && vs if). Możesz użyć kompilatora zamykającego Google ( closure-compiler.appspot.com ), aby wykonać te optymalizacje za CiebieGalaretka ,
2625222120 bajtówWypróbuj online!
Ten kod faktycznie nie działał poprawnie do 20 bajtów, a ja nawet nie zauważyłem; zawiodło w
[2,2]
przypadku testowym. Powinien teraz działać idealnie.źródło
JavaScript (ES6),
1271269580 bajtów0-indeksowane. Rzuty
"ReferenceError: X is not defined"
i"InternalError: too much recursion"
przy złym wejściu.Przypadki testowe
Pokaż fragment kodu
źródło
Clojure, 110 bajtów
Podstawowy
loop
z wstępną kontrolą skrzynek na brzeg. Zwracanil
za nieprawidłowe dane wejściowe. I nie wiem,(= [2] '(2))
jesttrue
: oźródło
Python 2, 146 bajtów (tylko funkcja)
Zwraca 0 na wejściu falsy (ok, ponieważ jest indeksowane 1). Po prostu użyj go w następujący sposób:
źródło
Mathematica, 82 bajty
Function
który wielokrotnie zastępuje{2}
niezdefiniowany symbolT
, listę (jednego lub więcej)1
si2
z następną iteracją, i wszystko inne z0
aż do osiągnięcia stałego punktu, a następnie zwracaFirstPosition
symbolT
w wynikowymFixedPointList
minusie1
. Dane wyjściowe to,{n}
gdzien
(1
-indexed) liczba iteracji potrzebnych do sięgnięcia{2}
po przypadek prawdy i-1+Missing["NotFound"]
przypadek fałszowania.Jeśli wyjście musi być
n
zamiast{n}
, kosztuje trzy kolejne bajty:źródło
Python 2 ,
184 163156 bajtówPython 2 , 156 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Galaretka , 17 bajtów
Wypróbuj online!
źródło
Python 2 , 122 bajty
Wypróbuj online!
Python 3 , 120 bajtów
Wypróbuj online!
Wyjaśnienie
Inicjowana jest nowa sekwencja (w), aby zapisać następną iterację redukcji. Licznik (c) jest inicjowany w celu śledzenia liczby iteracji.
Każdy element w oryginalnej sekwencji (sekwencjach) jest porównywany z poprzednią wartością. Jeśli są takie same, wartość ostatniego elementu (w) zwiększa się o 1. Jeśli są różne, kolejność (w) jest przedłużana o [1].
Jeśli w == [2], zwracany jest licznik (c). W przeciwnym razie, jeśli oryginalna sekwencja (sekwencje) zawiera inne elementy niż 1 i 2, zwracana jest wartość -1. Jeśli tak nie jest, funkcja jest wywoływana rekurencyjnie z nową sekwencją (w) as (s), a licznik (c) zwiększony o 1.
źródło
def f(s,c=2,j=0,w=[1]):
, ale daje to inny wynik. Czy ktoś mógłby wyjaśnić, dlaczego tak jest?R, 122 bajty
Przechodzi wszystkie przypadki testowe. W przeciwnym razie zgłasza jeden lub więcej błędów. Nienawidzę kontroli ważności; ten kod mógłby być tak golfistowany, gdyby dane wejściowe były dobre; byłby krótszy, nawet gdyby dane wejściowe były sekwencją 1 i 2, niekoniecznie przedrostkiem sekwencji Kolakoski. Tutaj musimy sprawdzić zarówno wektor początkowy (inaczej przypadek testowy
[-2,1]
) minąłby), a wektor wynikowy (inaczej[1,1,1]
by minął).źródło
Ruby ,
8177 bajtówWypróbuj online!
Edycja: Zapisano 4 bajty, konwertując na rekurencyjną lambda.
Zwraca 1 indeksowaną liczbę iteracji lub 0 jako falsey.
Wykorzystuje metodę fragmentaryczną Ruby enumerable, która robi dokładnie to, czego potrzebujemy - grupując kolejne serie identycznych liczb. Długości przebiegów stanowią tablicę dla następnej iteracji. Powtarza iterację, gdy tablica jest dłuższa niż 1 element i nie napotkano żadnych liczb innych niż 1 i 2.
źródło
Pyth , 45 bajtów
Wypróbuj online!
Jest to prawdopodobnie wciąż gra w golfa. Zdecydowanie nadaje się do gry w golfa, jeśli działałby
.?
tak, jak chciałem (jest toelse
konstrukcja najbardziej wewnętrzna zamiast najbardziej zewnętrznej)źródło
Perl 5
-p
, 71 bajtówWypróbuj online!
1
-indexed. Wyjścia0
dla fałszu.źródło