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.