Combinazioni di Kakuro
Poiché non riesco a fare l'aritmetica mentale, spesso faccio fatica con il Kakuro Puzzle, che richiede alla vittima di elaborare ripetutamente quali numeri distinti nell'intervallo da 1 a 9 (inclusi) si sommano a un altro numero nell'intervallo da 1 a 45 quando sai come ci sono molti numeri. Ad esempio, se vuoi sapere come ottenere 23 da 3 numeri, l'unica risposta è 6 + 8 + 9. (Questa è la stessa idea di Killer Sudoku se hai familiarità con quello).
A volte avrai altre informazioni, come ad esempio che il numero 1 non può essere presente, quindi per ottenere 8 in soli 2 numeri, puoi usare solo 2 + 6 e 3 + 5 (non puoi usare 4 + 4, perché sono non distinto). In alternativa, è possibile che tu abbia già trovato un 3 nella soluzione, quindi qualcosa come 19 in 3 numeri deve essere 3 + 7 + 9.
Il tuo compito è scrivere un programma che elenchi tutte le possibili soluzioni a un determinato problema, in un ordine rigoroso, in un layout rigoroso.
Ingresso
La tua soluzione può ricevere gli input come una singola stringa ASCII tramite stdin, un argomento della riga di comando, un argomento per una funzione, un valore lasciato nello stack o qualunque follia impieghi il tuo linguaggio esoterico preferito. La stringa è nella forma
number_to_achieve number_of_numbers_required list_of_rejected_numbers list_of_required_numbers
I primi 2 argomenti sono interi non-zero non negativi tipici di base 10 rispettivamente negli intervalli da 1 a 45 e da 1 a 9 (l'utilizzo di un punto decimale sarebbe un input non valido), le due liste sono solo cifre messe insieme senza delimitazione in nessun ordine particolare senza ripetizione o "0" se sono elenchi vuoti. Non ci possono essere cifre condivise tra gli elenchi (tranne 0). I delimitatori sono spazi singoli.
Produzione
L'output deve iniziare con una riga che contiene il numero di possibili soluzioni. Il tuo programma deve stampare le soluzioni delimitate da interruzioni di riga ordinate per ogni cifra sempre più significativa, dove ogni cifra è posizionata nella posizione che sarebbe se si elencassero i numeri da 1 a 9. Si spera che gli esempi seguenti lo chiariscano.
Se viene fornito un input non valido, non mi interessa cosa fa il tuo programma, anche se preferirei che non azzerasse il mio settore di avvio.
Esempi
Per questo esempio di input
19 3 0 0
L'output previsto sarebbe
5
2 89
3 7 9
4 6 9
4 78
56 8
Nota gli spazi al posto di ogni numero "mancante", questi sono richiesti; Non mi preoccupo degli spazi che non hanno un numero dopo di loro (come i 9 mancanti sopra). Puoi presumere che qualunque cosa tu stia stampando userà un carattere mono-spazio. Nota anche l'ordinamento, per cui le soluzioni con una cifra più piccola più piccola sono elencate per prime, e poi quelle con una cifra più piccola successiva più piccola, ecc.
Un altro esempio, basato su quello sopra
19 3 57 9
L'output previsto sarebbe
2
2 89
4 6 9
Si noti che ogni risultato contiene un 9 e nessun risultato contiene un 5 o 7.
Se non ci sono soluzioni, ad esempio
20 2 0 0
Quindi dovresti semplicemente generare una sola riga con uno 0 su di essa.
0
Ho intenzionalmente reso l'analisi dell'input parte del divertimento di questa domanda. Questo è code-golf, può vincere la soluzione più breve.