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.
źródło
Odpowiedzi:
GolfScript, 88 znaków
Prosta implementacja w GolfScript. Pobiera dane wejściowe ze STDIN lub stosu.
Kod można przetestować tutaj .
Kod z kilkoma komentarzami:
źródło
JavaScript (E6) 172
180 275 296Jako funkcja (testowalna) z 1 argumentem ciągu i zwracaniem żądanego wyniku. Aby uzyskać rzeczywistą zmianę wyniku, zwracaj z alert (), taką samą liczbą bajtów, ale uwaga, czcionka alertu nie jest jednolita.
Testuj w FireFox lub konsoli FireBug
Wyjście testowe:
Nie golfił
źródło
Mathematica, 239 bajtów
(Przyznaję, że zacząłem nad tym pracować, gdy był jeszcze w piaskownicy).
Nie golfił
Oczekuje, że łańcuch wejściowy zostanie zapisany
i
.To dość proste. Najpierw parsowanie danych wejściowych. Następnie używam,
IntegerPartitions
aby dowiedzieć się, jak mogę podzielić pierwszą liczbę na dozwolone liczby. Następnie odfiltrowuję wszystkie partycje, które używają duplikatów lub nie zawierają wymaganych numerów. A następnie dla każdego roztworu utworzyć listę od1
celu9
i przekształcić obecne liczby do ich reprezentacji smyczkowy i innych w pomieszczeniach. A potem wszystko łączę.źródło
Groovy - 494 znaków
Duża, nieinspirowana odpowiedź, ale używa Google Guava do generowania „zestawu mocy”.
Gra w golfa:
Przykładowe przebiegi:
Nie golfowany:
źródło