Kombinacje Kakuro
Ponieważ nie umiem wykonywać arytmetyki mentalnej, często mam problemy z łamigłówką Kakuro , która wymaga od ofiary wielokrotnego sprawdzania, które odrębne liczby z zakresu od 1 do 9 (włącznie) sumują się z innymi liczbami z zakresu od 1 do 45, jeśli wiesz, jak to zrobić istnieje wiele liczb. Na przykład, jeśli chcesz wiedzieć, jak uzyskać 23 z 3 liczb, jedyną odpowiedzią jest 6 + 8 + 9. (Jest to ten sam pomysł, co Killer Sudoku, jeśli znasz się na tym).
Czasami będziesz mieć inne informacje, takie jak to, że liczba 1 nie może być obecna, więc aby uzyskać 8 w zaledwie 2 liczbach, możesz użyć tylko 2 + 6 i 3 + 5 (nie możesz użyć 4 + 4, ponieważ są one nie wyraźne). Ewentualnie może się zdarzyć, że w rozwiązaniu znalazłeś już 3, więc coś takiego jak 19 na 3 liczbach musi być 3 + 7 + 9.
Twoim zadaniem jest napisanie programu, który wymienia wszystkie możliwe rozwiązania danego problemu, w ścisłej kolejności, w ścisłym układzie.
Wejście
Twoje rozwiązanie może odbierać dane wejściowe jako pojedynczy ciąg ASCII poprzez stdin, argument wiersza poleceń, argument funkcji, wartość pozostawioną na stosie lub dowolne szaleństwo, jakie stosuje Twój ulubiony ezoteryczny język. Ciąg jest w formie
number_to_achieve number_of_numbers_required list_of_rejected_numbers list_of_required_numbers
Pierwsze 2 argumenty to typowe nieujemne liczby całkowite niezerowe o podstawie 10 odpowiednio w zakresie od 1 do 45 i od 1 do 9 (użycie kropki dziesiętnej byłoby niepoprawnym wprowadzeniem), dwie listy są po prostu cyframi połączonymi ze sobą bez ograniczenia w brak konkretnego zamówienia bez powtórzeń lub „0”, jeśli są pustymi listami. Między listami nie może być żadnych cyfr wspólnych (z wyjątkiem 0). Ograniczniki to pojedyncze spacje.
Wynik
Dane wyjściowe muszą zaczynać się od wiersza zawierającego liczbę możliwych rozwiązań. Twój program musi wydrukować rozwiązania rozdzielane podziałami linii, posortowane według każdej coraz ważniejszej cyfry, gdzie każda cyfra jest umieszczana w miejscu, w którym byłaby, gdybyś podał liczby od 1 do 9. Miejmy nadzieję, że poniższe przykłady to wyjaśnią.
Jeśli podano nieprawidłowe dane wejściowe, nie dbam o to, co robi twój program, chociaż wolałbym, żeby nie zerowało mojego sektora rozruchowego.
Przykłady
Dla tego przykładowego wejścia
19 3 0 0
Oczekiwany wynik to
5
2 89
3 7 9
4 6 9
4 78
56 8
Zanotuj spacje zamiast każdego „brakującego” numeru, są one wymagane; Nie przejmuję się spacjami, które nie mają po sobie cyfr (takich jak brakujące 9 powyżej). Możesz założyć, że cokolwiek drukujesz, będzie używać czcionki mono-spacji. Zwróć także uwagę na kolejność, w której najpierw są wyświetlane rozwiązania z najmniejszą najmniejszą cyfrą, a następnie rozwiązania z najmniejszą kolejną najmniejszą cyfrą itp.
Kolejny przykład oparty na powyższym
19 3 57 9
Oczekiwany wynik to
2
2 89
4 6 9
Zauważ, że każdy wynik zawiera 9, a żaden wynik nie zawiera 5 lub 7.
Jeśli na przykład nie ma rozwiązań
20 2 0 0
Następnie powinieneś po prostu wypisać pojedynczy wiersz z 0.
0
Celowo parsowałem wejściową część zabawy tego pytania. To jest gra w golfa, może wygrać najkrótsze rozwiązanie.