Kakuro-Kombinationen
Da ich mental nicht rechnen kann, habe ich oft Probleme mit dem Kakuro- Puzzle, bei dem das Opfer wiederholt herausfinden muss, welche unterschiedlichen Zahlen im Bereich von 1 bis 9 (einschließlich) sich zu einer anderen Zahl im Bereich von 1 bis 45 addieren, wenn Sie wissen, wie es gibt viele zahlen. Wenn Sie beispielsweise wissen möchten, wie Sie 23 aus 3 Zahlen erhalten, ist die einzige Antwort 6 + 8 + 9. (Dies ist die gleiche Idee wie bei Killer Sudoku, wenn Sie damit vertraut sind).
Manchmal haben Sie andere Informationen, wie zum Beispiel, dass die Zahl 1 nicht vorhanden sein kann. Um also 8 in nur 2 Zahlen zu erreichen, können Sie nur 2 + 6 und 3 + 5 verwenden (Sie können 4 + 4 nicht verwenden, da dies der Fall ist nicht verschieden). Alternativ kann es sein, dass Sie bereits eine 3 in der Lösung gefunden haben, und so muss 19 in 3 Zahlen 3 + 7 + 9 sein.
Ihre Aufgabe ist es, ein Programm zu schreiben, das alle möglichen Lösungen für ein bestimmtes Problem in einer strengen Reihenfolge und in einem strengen Layout auflistet.
Eingang
Ihre Lösung kann die Eingaben als einzelne ASCII-Zeichenfolge entweder über stdin, ein Befehlszeilenargument, ein Argument für eine Funktion, einen auf dem Stapel verbliebenen Wert oder den Wahnsinn Ihrer bevorzugten esoterischen Sprache empfangen. Die Zeichenfolge ist in der Form
number_to_achieve number_of_numbers_required list_of_rejected_numbers list_of_required_numbers
Die ersten beiden Argumente sind typische nicht negative Ganzzahlen zur Basis 10 ungleich Null im Bereich von 1 bis 45 bzw. 1 bis 9 (bei Verwendung eines Dezimalpunkts wäre die Eingabe ungültig). Die beiden Listen sind nur Ziffern, die ohne Begrenzung ineinander gereiht sind Keine bestimmte Reihenfolge ohne Wiederholung oder '0', wenn es sich um leere Listen handelt. Zwischen den Listen dürfen keine gemeinsamen Ziffern sein (außer 0). Die Begrenzer sind einzelne Leerzeichen.
Ausgabe
Ihre Ausgabe muss mit einer Zeile beginnen, die die Anzahl der möglichen Lösungen enthält. Ihr Programm muss durch Zeilenumbrüche getrennte Lösungen ausgeben, die nach immer wichtigeren Ziffern sortiert sind. Dabei wird jede Ziffer an die Stelle gesetzt, an der sie sich befinden würde, wenn Sie die Zahlen von 1 bis 9 aufführen würden. Die folgenden Beispiele werden dies hoffentlich klarer machen.
Wenn eine ungültige Eingabe bereitgestellt wird, ist es mir egal, was Ihr Programm tut, obwohl ich es vorziehen würde, wenn mein Bootsektor nicht auf Null gesetzt würde.
Beispiele
Für dieses Beispiel Eingabe
19 3 0 0
Die erwartete Ausgabe wäre
5
2 89
3 7 9
4 6 9
4 78
56 8
Beachten Sie die Leerzeichen anstelle jeder "fehlenden" Nummer. Diese sind erforderlich. Ich mache mir keine Sorgen um Leerzeichen, hinter denen keine Nummer steht (wie die fehlenden 9en oben). Sie können davon ausgehen, dass bei jedem Ausdruck eine Mono-Space-Schriftart verwendet wird. Beachten Sie auch die Reihenfolge, in der zuerst Lösungen mit der kleinsten Ziffer und dann mit der kleinsten nächstkleineren Ziffer usw. aufgelistet werden.
Ein weiteres Beispiel, basierend auf dem obigen
19 3 57 9
Die erwartete Ausgabe wäre
2
2 89
4 6 9
Beachten Sie, dass jedes Ergebnis eine 9 und kein Ergebnis eine 5 oder 7 enthält.
Wenn es zum Beispiel keine Lösungen gibt
20 2 0 0
Dann sollten Sie nur eine einzelne Zeile mit einer 0 darauf ausgeben.
0
Ich habe das Parsen der Eingabe absichtlich zum Spaß dieser Frage gemacht. Dies ist Code-Golf, möge die kürzeste Lösung gewinnen.
quelle
Antworten:
GolfScript, 88 Zeichen
Eine einfache Implementierung in GolfScript. Übernimmt Eingaben von STDIN oder Stack.
Der Code kann hier getestet werden .
Code mit einigen Kommentaren:
quelle
JavaScript (E6) 172
180 275 296Als (testbare) Funktion mit 1 String-Argument und Rückgabe der angeforderten Ausgabe. Damit eine echte Ausgabeänderung mit alert () und der gleichen Byte-Anzahl zurückgegeben wird, muss jedoch beachtet werden, dass die Schriftart für Warnungen keine Monospace-Schriftart ist.
Test In FireFox oder Firebug - Konsole
Testausgang:
Ungolfed
quelle
Mathematica, 239 Bytes
(Ich gebe zu, ich habe angefangen, daran zu arbeiten, als es noch im Sandkasten war.)
Ungolfed
Es erwartet, dass die Eingabezeichenfolge in gespeichert wird
i
.Es ist ziemlich einfach. Zuerst wird die Eingabe analysiert. Dann nutze ich,
IntegerPartitions
um herauszufinden, wie ich die erste Zahl in die zulässigen Zahlen aufteilen kann. Dann filtere ich alle Partitionen heraus, die Duplikate verwenden oder keine erforderlichen Nummern enthalten. Und dann erstelle ich für jede Lösung eine Liste von1
bis9
und konvertiere die vorhandenen Zahlen in ihre Zeichenfolgendarstellung und die anderen in Leerzeichen. Und dann verkette ich alles.quelle
Groovy - 494 Zeichen
Große, nicht inspirierte Antwort, aber es verwendet Google Guava, um das "Power Set" zu generieren.
Golf gespielt:
Probeläufe:
Ungolfed:
quelle