Inspiriert von xkcd .
Ihre Herausforderung besteht darin, festzustellen, ob eine Zahl im Spiel 2048 eine gute Kombination ergeben würde . Ihre Eingabe wird eine Zahl sein, wie zum Beispiel:
8224
Und die Ausgabe wird sein, ob diese Zahl eine gute 2048-Kombination ergeben würde, die für diese Eingabe true
oder yes
oder 1
oder irgendeine andere Art der Anzeige eines positiven Ergebnisses wäre.
Für diejenigen , die nicht mit dem Spiel vertraut, hier ist eine einfache Erklärung: Zweierpotenzen sind auf einem Gitter angeordnet sind , wie folgt aus : [2] [2]
. Kacheln können in jede Richtung bewegt werden. Wenn sich zwei identische Kacheln treffen, werden sie zur nächsten Potenz von zwei ( [2] [2]
wenn also nach links oder rechts bewegt wird [4]
). Oder Sie können das Spiel einfach hier ausprobieren .
Was bedeutet "eine gute 2048-Kombination"? Es bedeutet, dass jede Zahl, wenn sie im Spiel "2048" wäre, zu einer einzigen Zahl kombiniert werden könnte. (Eine Null bedeutet ein Leerzeichen und kann bei Bedarf ignoriert werden.) Beachten Sie, dass Zahlen möglicherweise mehrstellig sein können! Die Zahlen dürfen sich jedoch zwischen den Zügen nicht ändern. Hier sind einige Beispiele / Testfälle (wobei "Gut" eine gute Kombination anzeigt und "Schlecht" nicht gut bedeutet):
- Gut: 8224 (8224 -> 844 -> 88 -> 16)
- Gut: 2222 (2222 -> 44 -> 8)
- Gut: 22048 (22048 -> 448 -> 88 -> 16)
- Schlecht: 20482 (kann die äußeren 2en nicht kombinieren, noch kann man eine 2048 und eine 2 kombinieren)
- Gut: 20482048 (20482048 -> 4096)
- Bad: 210241024 (210241024 -> 22048, aber dies ist jetzt [2] [2048] und kann nicht kombiniert werden, da sich die Zahlen zwischen den Zügen nicht ändern können.)
- Gut: 2048 (es ist schon eine Nummer)
- Schlecht: 2047 (es ist keine Potenz von 2)
- Schlecht: 11 (es gibt keine 1en im Spiel)
- Gut: 000040000000 (Nullen sind Leerzeichen)
Verschiedene Regeln:
- Die Eingabe kann von einem beliebigen vernünftigen Ort aus erfolgen, z. B. STDIN, Funktionsargument, Datei usw.
- Die Ausgabe kann auch überall sinnvoll sein, z. B. STDOUT, Funktionsrückgabewert, Datei usw.
- Die Rastergröße ignorieren -
22222222
sollte immer noch true ausgeben. - Das ist kein Maximum für die Anzahl, solange es eine Zweierpotenz ist. Die möglichen Zahlen sind daher Zweierpotenzen größer als 0.
- Für diejenigen, die sich Sorgen machen, dass Nullen Mehrdeutigkeiten verursachen, ist dies nicht der Fall. Beispielsweise
22048
kann entweder[2] [2048]
oder analysiert werden[2] [2] [0] [4] [8]
. Der erste funktioniert nicht, aber der zweite, also sollte er true ausgeben. - Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
1
22048
sollte ausgeben,good
aber das ist nicht wahr. Sie kann nicht kombinieren2
mit2048
und das Gitter ist ,4x4
wenn alle Zahlen unterschiedlich sind , sollten Sie 5 Zellen erhalten werden. also vielleicht solltest du das entfernen0
? Auch Ihr 5. Beispiel scheint ungültig zu sein, da das Spiel bei2048
:)Antworten:
GolfScript, 137 Zeichen
Die Eingabe muss auf STDIN erfolgen. Die Ausgabe ist
0
/1
für schlechte / gute Zahlen. Der größte Teil des Codes ist zum Parsen der möglichen Eingaben erforderlich.Diese kürzere Version (113 Zeichen) führt einen einfachen Schichttest durch, der bei Eingaben wie z
224422
. B. nicht korrekt funktionieren würde .Alle Testfälle können online überprüft werden .
quelle
Python:
457.422ZeichenDie Funktion f (s) erhält eine Folge von Ziffern und gibt dementsprechend 'gut' oder 'schlecht' aus. Ich habe 0 nicht als Leerzeichen verwendet, da Leerzeichen im Spiel bedeutungslos sind und beim Parsen von Zeichenfolgen Mehrdeutigkeiten verursachen (ist 22048 gut oder schlecht?). Dabei werden nur Zahlen bis 2048 verwendet, dies kann jedoch geändert werden, ohne dass Zeichen hinzugefügt werden müssen. Auf Kosten von ca. 10 Zeichen kann ich auch alle Schritte zum Kombinieren der Zahlen ausdrucken. Und mir ist klar, dass dieser Code noch nicht genug Golf spielt. Keine Sorge, Änderungen kommen.
quelle
Haskell:
285 254 253 237 230227Benutzung - lade es einfach in ghci und übergebe den String an h.
Code:
Kommentar:
i
Ist die Überprüfung, ob eine Zahl eine Zweierpotenz ist, wird dies von Sprachen mit kleinen Abweichungen ausgespielt.%
Generiert rekursiv alle Parses, die Potenzen von 2 oder 0 enthalten.c
Reduziert Kacheln.l
rekursiv prüft, ob Fliesen links oder gut zusammenlegbar sind.g
prüft, ob Fliesen links oder rechts zusammenklappbar sind. Die Anzahl der Kacheln ist unbegrenzt - z. B. werdenh ((show (2^200))++(show (2^200)))
2 Kacheln mit der Kennzeichnung "1606938044258990275541962092341162602522202993782792835301376" als wahr zurückgegeben.Bearbeitet, um einen Fehler zu beheben, der "88222288888" nicht richtig nach rechts reduzierte, sondern auch mehr Möglichkeiten zum Golfen bot.
quelle
Perl, 175-336 Bytes
Nur das Wesentliche intakt halten:
[ 64 und 256 führen zu einigen schlecht auflösbaren Mehrdeutigkeiten, mit denen gierige Übereinstimmungen nicht fertig werden können ... aber dies sind nette Byte-Zählungen. ]
quelle
Delphi
572582 ZeichenDer bearbeitete Code, limit ist auf 2 ^ 30 gesetzt, damit er den MaxInt-Wert in Delphi nicht überschreitet.
Golf gespielt
Ungolfed
BEARBEITEN
Also wurde ich neugierig und fragte mich, wie viele dieser Kombinationen zum Puzzle passen würden und führte einen Test durch.
Für andere, die auch neugierig sind, machen Sie auch einen Test;)
Aber ok hier sind die Ergebnisse:
20736 combinations were tested and 1166 were great combinations
Ich muß sagen , Kombinationen mit drei oder mehr Nullen ausgelassen wurden (Marken richtig spüren?)
Kombinationen fast einzigartig sind, die Kombinationen Sinn
2248
,8224
,8422
und4228
wurden alle als eine große Kombination gezählt.quelle
Mathematica - 218 Bytes
Ungolfed-Version:
Die
Internal\
Magie von PartitionRagged ist dieser Frage entnommen .Diese Lösung verarbeitet beliebige Rastergrößen und beliebig große Zahlen.
Hier ist eine 195-Byte- Version, die wie das eigentliche Spiel mit nur bis zu 4 Kacheln funktioniert (so
f[22222222]
ist esFalse
):wo ich ersetzt habe
mit
quelle
DeleteCases
sieht so aus, alsf[88222288888]
würde es ganz links stehende Paare entfernen, also würde es scheitern?DeleteCases
entfernen nur Nullen und Zahlen, die nicht Potenz zwei sind. Das eigentliche Auseinanderfallen von Paaren erfolgt nach der Regel//. {a___, x_, x_, b___} :> {a, 2 x, b}
, die für diese Zahl gilt, und umgekehrt. Ich bin mir nicht ganz sicher, in welcher Reihenfolge Mathematica diese Ersetzungen anwendet, aber es funktioniert.Haskell - 260
263f
ist die Funktion. Beispiele:Eine kleine Erklärung:
p
Gibt alle Möglichkeiten zum Teilen einer Liste zurück.q
Filtert diejenigen, die nur aus Potenzen von 2 bestehen (außer 1, aber einschließlich 0).c
versucht, eine Zeichenfolge zu reduzieren.r
Durchläuft die rechte und linke Kollapsion, bis nur noch 1 Element übrig ist oder die Zeichenfolge nicht mehr zusammenklappbar ist.quelle
c
, versuchen Sie "222244442222" - es gibt wahr zurück, aber das ist im Spiel nicht zusammenlegbar. Muss mit rekursieren(2*x):c s
.