Ostatnio napisałem na pytanie o grach Diffy który upadł bez odpowiedzi. To dobrze, pytanie jest naprawdę trudne, ale chciałbym zadać łatwiejsze pytanie na temat gier Diffy, abyśmy mogli uruchomić piłkę.
Jak działa Diffy
Skopiowano z Find Diffy Games
Gra Diffy działa w następujący sposób: Zaczynasz od listy liczb całkowitych nieujemnych, w tym przykładzie użyjemy
3 4 5 8
Następnie bierzesz absolutną różnicę między sąsiednimi liczbami
(8) 3 4 5 8
5 1 1 3
Potem powtarzasz. Powtarzaj, dopóki nie uświadomisz sobie, że wszedłeś w pętlę. A potem ogólnie gra zaczyna się od nowa.
3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0
Większość gier kończy się ciągiem zer zerowych, co uznaje się za stan utraty, ale kilka rzadkich gier utknie w większych pętlach.
Zadanie
Biorąc pod uwagę stan początkowy gry Diffy, określ, czy gra ostatecznie osiąga stan wszystkich zer. Powinieneś wypisać wartość Prawdy lub Falsy dla każdego z dwóch stanów. Który odpowiada, co nie ma znaczenia.
Celem jest zminimalizowanie liczby bajtów w źródle.
źródło
1 1 0
jest okresowy, podobnie jak42 42 41
taki stan.n
jest nieparzysta, gra nie osiąga zera, chyba że wszystkie liczby są równe. Jeśli długość jest potęgą 2, zawsze spada do zera.n
elementami i maksimumm
zajmuje co najwyżejn * bit_length(m)
kroki. Jest więcn*m
również górną granicą. Silniejszą górną granicą jestt(n) * bit_length(m)
, gdziet(n)
jest największa moc 2, która jest czynnikiemn
.Odpowiedzi:
Pyth, 6 bajtów
Zestaw testowy
Ten program jest bardzo uprzejmy. 0 (fałsz) oznacza wszystkie zera, wszystko inne (prawda) oznacza nie wszystkie zera.
Jak to działa:
źródło
Mathematica, 52 bajty
Czysta funkcja przyjmująca listę nieujemnych liczb całkowitych jako dane wejściowe i zwracające
True
lubFalse
.Abs[#-RotateLeft@#]&
to funkcja, która wykonuje jedną rundę gry diffy. (Technicznie tak powinno byćRotateRight
, ale ostateczna odpowiedź pozostaje nienaruszona, a hej, wolny bajt.) WięcNest[...,#,R]
wykonujeR
rundy gry diffy, a następnie1>Max@
wykrywa, czy wszystkie wyniki są zerami.Skąd wiemy, ile rund różni
R
się robić? Jeślim
jest to największa wartość na wejściu, zauważ, że nigdy nie wygenerujemy liczby całkowitej większej niżm
bez względu na to, ile rund wykonamy. Łączna liczba list długościl
nieujemnych liczb całkowitych wszystkich ograniczonam
jest przez(m+1)^l
. Jeśli więc przeprowadzimy(m+1)^l
rundę gry diffy, gwarantujemy, że do tego czasu zobaczymy kilka list, a zatem będziemy w okresowej części gry. W szczególności gra kończy się zerami tylko wtedy, gdy wynikiem(m+1)^l
rund jest lista wszystkich zer. To wyrażenie jest tym, co się liczyMax[1+#]^Tr[1^#]
.źródło
Galaretka , 13 bajtów
Zwraca 0 (falsey), jeśli zostanie osiągnięty stan zerowy, w przeciwnym razie zwracana jest prawdziwa wartość (dodatnia liczba całkowita).
Wypróbuj online!
Wykorzystuje spostrzeżenie poczynione po raz pierwszy przez Grega Martina, że liczby w tablicy nie mogą nigdy opuścić domeny [0, m], gdzie m jest maksymalnym elementem na wejściu, więc wykonanie (m + 1) l rund, gdzie l jest długością wejścia wystarczać.
W jaki sposób?
źródło
PHP, 144 bajtów
wypisz 0 dla wszystkich zer i dowolną dodatnią liczbę całkowitą dla true
Wersja online
Rozszerzony
źródło
array_push
? Ale dlaczego ?$_GET
jako danych wejściowych, powinieneś założyć, że zawiera ciąg.?0[0]=1&0[1]=1&0[2]=0
lub?0[]=1&0[]=1&0[]=0
jest tablicą ciągów, ale to nie ma znaczenia. Ale masz rację, mógłbym skrócić to,?0=1&1=1&2=0
dlaczego nie àrray_push` Jestem pewien, że ty lub Tytus znajdziecie lepsze sposoby na zwarcie tego.array_push($e,$e[$c=0]);
jest po prostu dokładnie taki sam jak$e[]=$e[$c=0];
i nawet używasz już składni ($r[]=$n
). Używałeśmax
teraz więc należy również wymienićend($r)
z$n
ponieważ$n
jest zawsze równaend($r)
, gdy echo jest wykonywany.R (3.3.1), 87 bajtów
Zwraca zero dla gry kończącej się wszystkimi zerami, a w przeciwnym razie liczbę dodatnią.
wykorzystuje ten sam fakt Grega Martina i używa wbudowanego mechanizmu różnicowego, aby wykonać różnicę
źródło
Röda , 80 bajtów
Wypróbuj online!
Nie golfowany:
źródło
05AB1E , 13 bajtów
Zwraca 1, jeśli kończy się zerami, a 0 w przeciwnym razie.
Wypróbuj online!
Wyjaśnienie
Wykorzystuje górną granicę rund:
max(input)*len(input)
wyjaśnione przez xnor w sekcji komentarzy.źródło
J, 22 bajty
Zwraca
0
(która jest faktyczniefalse
w J) dla zdegenerowanej gry kończącej się wszystkimi zerami. Zwraca1
(true
), jeśli n-ta iteracja zawiera niezerową liczbę, gdzie n jest równe największej liczbie całkowitej w oryginalnej sekwencji pomnożonej przez długość listy. Zobacz odpowiedź Grega Martina wyjaśniającą, dlaczego to prawda.Tłumaczenie:
*
>./
^:( )
#
pomnożona przez*
największą wartość na liście>./
:|&
z(- )
a1&|.
Przykłady:
źródło
JavaScript (ES6),
95 9290 bajtówWyjaśnienie
Funkcja rekurencyjna, która wywołuje się tak długo, jak długo licznik (który zaczyna się od maksymalnej wartości na liście powiększonej o potęgę długości listy [
= (max + 1)**length
]) nie jest równy zero. Przy każdym wywołaniu licznik jest zmniejszany, a gdy osiągnie zero, wszystkie elementy na liście są sprawdzane względem zera. Jeśli wszystkie są równe zero, program powracatrue
ifalse
inaczej.źródło
PHP,
123115przyjmowanie danych wejściowych przez HTTP get np.
?3&4&5&8
oszczędza kilka bajtów.Drukuje 1, jeśli osiągnie wszystkie zera lub nic innego.
pobiera listę argumentów z wiersza poleceń. Mam wrażenie, że można grać w golfa jeszcze bardziej (patrząc na @Titus).
źródło
Python 3.6, 101 bajtów
Pobiera krotkę liczb i zwraca False, jeśli kończy się na zera, i True, jeśli się zapętla.
źródło
JavaScript (ES6),
8483 bajtyZwraca
true
grę zakończoną wszystkimi zerami, wfalse
przeciwnym razie.Test
Pokaż fragment kodu
źródło