Kürzlich habe ich eine Frage zu Diffy-Spielen gepostet, die unbeantwortet geblieben ist. Das ist in Ordnung, die Frage ist wirklich schwierig, aber ich möchte eine einfachere Frage zu Diffy-Spielen stellen, damit wir den Ball ins Rollen bringen können.
Wie funktioniert Diffy?
Das Diffy-Spiel funktioniert wie folgt: Sie beginnen mit einer Liste nicht negativer Ganzzahlen, die wir in diesem Beispiel verwenden werden
3 4 5 8
Dann nehmen Sie die absolute Differenz zwischen benachbarten Zahlen
(8) 3 4 5 8
5 1 1 3
Dann wiederholst du. Sie wiederholen, bis Sie feststellen, dass Sie in eine Schleife eingetreten sind. Und dann fängt das Spiel in der Regel wieder von vorne an.
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
Die meisten Spiele enden in einer Folge von Nullen, was als Verlust betrachtet wird, aber einige wenige Spiele bleiben in größeren Schleifen stecken.
Aufgabe
Bestimmen Sie anhand des Anfangszustands eines Diffy-Spiels, ob das Spiel schließlich einen Zustand aller Nullen erreicht. Sie sollten für jeden der beiden Zustände einen Wert für Wahr oder Falsch ausgeben. Was was entspricht ist egal.
Ziel ist es, die Anzahl der Bytes in Ihrer Quelle zu minimieren.
quelle
1 1 0
ist periodisch, so42 42 41
ist ein solcher Zustand.n
ungerade ist, geht das Spiel nicht auf Null, es sei denn, alle Zahlen sind gleich. Wenn die Länge eine Zweierpotenz ist, geht sie immer auf Null.n
Elementen und Maximum besteht ausm
höchstensn * bit_length(m)
Schritten. Istn*m
also auch eine Obergrenze. Eine stärkere Obergrenze istt(n) * bit_length(m)
, wot(n)
die größte Potenz von 2 ist, die ein Faktor von istn
.Antworten:
Pyth, 6 Bytes
Testsuite
Dieses Programm ist sehr höflich. 0 (falsch) bedeutet alle Nullen, alles andere (wahr) bedeutet nicht alle Nullen.
Wie es funktioniert:
quelle
Mathematica, 52 Bytes
Reine Funktion, die eine Liste nichtnegativer Ganzzahlen als Eingabe und Rückgabe von
True
oder verwendetFalse
.Abs[#-RotateLeft@#]&
ist eine Funktion, die eine Runde des schwierigen Spiels ausführt. (Technisch gesehen soll es seinRotateRight
, aber die ultimative Antwort ist nicht betroffen, und hey, freies Byte) . SoNest[...,#,R]
führt eineR
Runden des Diffy Spiels, und dann1>Max@
feststellt, ob das Ergebnis nur aus Nullen bestehen.Woher wissen wir, wie viele verschiedene Spielrunden wir machen
R
müssen? Wennm
der größte Wert in der Eingabe ist, beachten Sie, dass wir niemals eine ganze Zahl erzeugen, die größer ist als diem
Anzahl der Runden, die wir durchführen. Die Gesamtzahl der Listen der Längel
von nichtnegativen ganzen Zahlen, die alle durch begrenzt sind,m
ist(m+1)^l
. Wenn wir also(m+1)^l
Runden des schwierigen Spiels durchführen, haben wir bis dahin garantiert zweimal eine Liste gesehen und befinden uns somit im periodischen Teil des Spiels. Insbesondere endet das Spiel nur dann mit allen Nullen, wenn das Ergebnis der(m+1)^l
Runden des Spiels die Liste aller Nullen ist. Dieser AusdruckMax[1+#]^Tr[1^#]
berechnet.quelle
Jelly , 13 Bytes
Gibt 0 (falsch) aus, wenn der Zustand "Alle Nullen" erreicht wird, andernfalls wird ein wahrer Wert (eine positive Ganzzahl) zurückgegeben.
Probieren Sie es online!
Verwendet die Beobachtung zuerst von Greg Martin gemacht , dass die Zahlen in der Matrix können niemals die Domäne verlassen [0, m] wobei m das maximale Element in der Eingabe ist, so durchführt (m + 1) l Runden wo l die Länge ist der Eingang genügen.
Wie?
quelle
PHP, 144 Bytes
Gibt 0 für alle Nullen und einen positiven ganzzahligen Wert für true aus
Online Version
Erweitert
quelle
array_push
? Aber wieso ?$_GET
als Eingabe verwenden, sollten Sie davon ausgehen, dass sie eine Zeichenfolge enthält.?0[0]=1&0[1]=1&0[2]=0
oder?0[]=1&0[]=1&0[]=0
ist ein Array von Zeichenfolgen, aber das spielt keine Rolle. Aber Sie haben Recht, ich könnte es kürzer machen, mit?0=1&1=1&2=0
warum nicht? Ray_push? Ich bin sicher, dass Sie oder Titus bessere Wege finden, dies zu verkürzen.array_push($e,$e[$c=0]);
ist einfach genau das gleiche wie$e[]=$e[$c=0];
und du verwendest sogar schon die Syntax ($r[]=$n
). Sie nutzen bereitsmax
jetzt , so dass Sie auch ersetzen solltenend($r)
mit ,$n
weil$n
immer gleich ,end($r)
wenn das Echo ausgeführt wird.R (3.3.1), 87 Bytes
Gibt Null für ein Spiel zurück, das mit allen Nullen endet, andernfalls eine positive Zahl.
nutzt die gleiche Tatsache von Greg Martin und verwendet das eingebaute Diff, um das Diffy zu machen
quelle
Röda , 80 Bytes
Probieren Sie es online!
Ungolfed:
quelle
05AB1E , 13 Bytes
Gibt 1 zurück, wenn es mit Nullen endet, andernfalls mit 0 .
Probieren Sie es online!
Erläuterung
Verwendet die obere Schranke von Runden:
max(input)*len(input)
erklärt durch xnor im Kommentarbereich.quelle
J, 22 Bytes
Gibt
0
(was effektivfalse
in J ist) für ein entartetes Spiel zurück, das mit allen Nullen endet. Gibt1
(true
) zurück, wenn die n-te Iteration eine Zahl ungleich Null enthält, wobei n gleich der größten Ganzzahl in der ursprünglichen Sequenz multipliziert mit der Länge der Liste ist. Siehe Greg Martins Antwort, in der erklärt wird, warum dies wahr ist.Übersetzung:
*
>./
^:( )
#
multipliziert mit*
dem größten Wert in der Liste>./
:|&
von(- )
und1&|.
Beispiele:
quelle
JavaScript (ES6),
95 9290 BytesErläuterung
Rekursive Funktion, die sich selbst aufruft, solange der Zähler (der mit dem Maximalwert in der Liste plus eins hoch der Länge der Liste [
= (max + 1)**length
] beginnt ) nicht Null ist. Bei jedem Aufruf wird der Zähler dekrementiert, und wenn er Null erreicht, werden alle Elemente in der Liste gegen Null geprüft. Wenn alle gleich Null sind, kehrt das Programm zurücktrue
undfalse
ansonsten.quelle
PHP,
123115Wenn Sie Eingaben über HTTP get vornehmen, werden z. B.
?3&4&5&8
einige Bytes gespart.Gibt 1 aus, wenn alle Nullen erreicht sind oder sonst nichts.
Übernimmt die Liste der Argumente über die Kommandozeile. Ich habe das Gefühl, dass dies noch weiter verbessert werden kann (siehe @Titus).
quelle
Python 3.6, 101 Bytes
Nimmt ein Tupel von Zahlen und gibt False zurück, wenn es mit Nullen endet, und True, wenn es eine Schleife ausführt.
quelle
JavaScript (ES6),
8483 BytesGibt
true
für ein Spiel zurück, das mit allen Nullen endet,false
ansonsten.Prüfung
Code-Snippet anzeigen
quelle