Einführung
Betrachten Sie das folgende Beispiel:
CODE
+ GOLF
——————
GREAT
Hierbei handelt es sich um eine Gleichung, bei der jeder Buchstabe eine Dezimalziffer und die Wörter natürliche Zahlen darstellen (ähnliche Buchstaben stehen für ähnliche Ziffern und unterschiedliche Buchstaben für unterschiedliche Ziffern). Die Aufgabe besteht darin, jeden Buchstaben mit seinem Ziffernwert abzugleichen, damit die Gleichung korrekt ist. Eine Lösung für die obige Gleichung ist:
9265
+ 1278
——————
10543
Deine Aufgabe
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, mit der die oben genannten Gleichungen gelöst werden können.
Eingang
Die Eingabe ist eine Zeichenfolge im folgenden Format:
[A-Z]+\+[A-Z]+=[A-Z]+
Beispiel:
CODE+GOLF=GREAT
AA+BB=CC
Leerzeichen werden weggelassen und es werden nur Buchstaben zwischen Großbuchstaben A und Z verwendet (keine Sonder- oder Kleinbuchstaben).
Diese Zeichenfolge kann aus der Standardeingabe, aus einer Datei oder als Funktionsparameter gelesen werden.
Ausgabe
Sie haben folgende zwei Möglichkeiten für das Ausgabeformat:
- die ursprüngliche Gleichung mit den Ziffern ersetzt
- Liste der Buchstaben und ihrer Werte
Wenn es mehrere Lösungen gibt, sollte eine (aber nur eine) davon zurückgegeben werden. Wenn es keine Lösungen gibt, sollte das Programm eine leere Zeichenfolge oder null zurückgeben. Die Ausgabe kann als String zurückgegeben, in die Standardausgabe oder in eine Datei geschrieben werden.
Beispiel:
9265+1278=10543
A=1 B=2 C=3
(Sie können ein beliebiges Trennzeichen verwenden)
Regeln
- Um die Sache zu vereinfachen, wird angenommen, dass Zahlen mit 0 beginnen, aber Sie können Zahlen mit führender 0 als ungültige Lösungen behandeln, es liegt an Ihnen
- Ähnliche Buchstaben stehen für ähnliche Ziffern, und verschiedene Buchstaben stehen für unterschiedliche Ziffern
- Sie können jede Sprache und die Standardbibliothek der gewählten Sprache verwenden (keine externen Bibliotheken)
- Sie können keine Verbindung zu Ressourcen im Internet herstellen (warum sollten Sie es trotzdem tun?)
- Dies ist eine Code-Golf-Aufgabe, der kürzeste Code gewinnt. Aufeinanderfolgende Leerzeichen zählen als ein einzelnes Zeichen. (So gewinnt jedes in Leerzeichen geschriebene Programm automatisch)
Ich habe eine etwas hackige Lösung mit 179 Zeichen. Wenn etwas nicht klar ist, frag mich bitte in den Kommentaren.
quelle
If there are no solutions, the program should return an empty string or null.
Endlosschleifen geben immer noch nichts aus ... darf ich?Antworten:
Python - 48 Zeichen
Missbrauch der Whitespace-Regel.
Zuerst habe ich jedes Zeichen in CesiumLifeJackets Antwort auf seinen ASCII-Wert konvertiert (ich hätte mein eigenes schreiben können, aber ich bin faul, und es hätte sowieso keinen Einfluss auf das Endergebnis gehabt). Die lange Zeichenfolge in meiner Lösung ist ein Leerzeichen für jeden dieser ASCII-Werte und Tabulatoren, die sie trennen. Auf Registerkarten aufteilen, Längen ermitteln, zurück in Zeichen konvertieren und ausführen.
SE konvertiert Tabulatoren in jeweils 4 Leerzeichen, sodass Copypasting nicht funktioniert. Du musst mir nur glauben :)
quelle
Ruby 2.0, 122 Zeichen
Brute Force Mischen + Auswerten!
Dies erfüllt noch nicht die Kriterien für die Rückgabe von null / leeren Zeichenfolgen, wenn es keine Lösung gibt. es schleift nur unendlich.Wenn nach ca. 300 Millionen Iterationen kein Ergebnis gefunden wird, wird null zurückgegeben. Nahe genug?Es findet alle eindeutigen Buchstaben in der Eingabe, mischt dann wiederholt die Ziffern 0-9 und versucht, sie mit den Buchstaben abzugleichen, bis es eine Konfiguration findet, die funktioniert.
Der Code wird als eine aufgerufene Funktion dargestellt,
f
die eine Zeichenfolge mit den ersetzten Zahlen zurückgibt, wie in Ausgabeoption 1 oben. Anwendungsbeispiel:Die Laufzeit für das
CODE+GOLF=GREAT
Beispiel auf meiner Maschine variiert von augenblicklich bis ungefähr 6 Sekunden - hängt davon ab, wie viel Glück Sie mit dem Mischen haben!Ich bin besonders unzufrieden mit dem
gsub(/\b0/,'')
Bit, führende Nullen zu entfernen, aber es war das einzige, was ich denken konnte, um zu verhindern, dasseval
die Zahlen als Oktal-Ints interpretiert werden.( BONUS : Da eval verwendet wird, funktioniert es für beliebige Ruby-Ausdrücke und nicht nur für Additionen!)
quelle
permutation
, aber wie Sie sagen, ging es mir hauptsächlich um die Codelänge.LiveScript (179 Zeichen)
Es hat eine deterministische und relativ schnelle Laufzeit und funktioniert auch mit anderen Operatoren (+, -, *).
quelle
Python,
256213 ZeichenSchreckliche Laufzeit, wird versuchen, sich weiter zu verbessern:
quelle
JavaScript 138
Zufällige Bruteforce.
Kann eine Weile dauern (mein bester Schuss
CODE+GOLF=GREAT
ist 3 Sekunden, mein schlechtester 3 Minuten).Versuchen Sie es mit einem einfachen Ausdruck wie
A+B=C
quelle
Haskell, 222
Rohe Gewalt. Versucht jede mögliche Übereinstimmung, bis sie eine findet oder nachdem sie alle ausprobiert hat. Ich habe die Ausgaberegeln erweitert: druckt so etwas wie
[[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]
für die Lösung, und wenn keine vorhanden ist, druckt[]
. Lassen Sie mich wissen, ob ich das ändern muss.quelle
CJam - 17
Insgesamt 975 Zeichen, aber 960 davon sind Leerzeichen in 2 Sequenzen. Diese zählen also als 2 Zeichen, und zusammen mit den anderen 15 erhalten wir 17.
975 mögen viel erscheinen, beachten Sie jedoch, dass die Python-Lösung von undergroundmonorail 18862 Zeichen hat bist nur in einer einzigen Zeile :)
Sie können es unter http://cjam.aditsu.net/ für kurze Wörter ausführen , aber Sie sollten wahrscheinlich den Java-Interpreter für längere verwenden. Läuft mit Java auf meinem Laptop
SEND+MORE=MONEY
in 30-40 Sekunden undCODE+GOLF=GREAT
in fast 3 Minuten. Es akzeptiert keine Zahlen, die mit 0 beginnen (weil das nicht cool ist).Hier ist ein Programm, das das obige Programm generiert (hilft auch, wenn StackExchange das Leerzeichen nicht korrekt anzeigt):
Die ersten 11 Zeilen enthalten das ursprüngliche Programm (nicht wirklich Golf) in einer Zeichenfolge, und die letzte Zeile führt die Konvertierung durch und fügt den Dekodierungsteil hinzu.
quelle
Powershell, 137 Bytes
Port von LiveScript
Ungolfed-Testskript:
Ausgabe:
quelle
PHP,
118113 Bytesdruckt Ziffern unter Buchstaben und beendet das Programm; Schleifen unendlich, wenn unlösbar. Als Rohr mit laufen lassen
-nr
.Nervenzusammenbruch
quelle
PHP, 145 Bytes
rekursive Funktion, druckt die gelöste Gleichung und beendet das Programm; kehrt zurück,
NULL
wenn unlösbar.Probieren Sie es online aus
Nervenzusammenbruch
quelle