Wyzwanie:
Biorąc pod uwagę tablicę Sudoku na standardowym wejściu, znajdź minimalną liczbę liczb dodanych, aby tablica była wyjątkowa.
Szczegóły / zasady:
Dane wejściowe są sformatowane w następujący sposób (wszystkie białe znaki są znaczące)
516|827|943 278|394|615 349|615|872 ---+---+--- 98 |4 2|156 465|189|237 12 |5 6|489 ---+---+--- 892|743|561 634|951|728 751|268|394
Dane wyjściowe są sformatowane za pomocą jednej liczby w wierszu, sformatowanej jak
(x,y):z
- xiy zaczynają się od jednej w lewym górnym rogu i zwiększają się w dół i w prawo; z to liczba do dodania.- W tym przypadku są to wszystko jest ważne wyjścia:
(3,4):3
,(3,4):7
,(5,4):3
,(5,4):7
,(3,6):3
,(3,6):7
,(5,6):3
, i(5,6):7
, jak każdy jeden z nich pozwoliłoby deska do rozwiązania.
- W tym przypadku są to wszystko jest ważne wyjścia:
- Jeśli zostanie wprowadzona unikalna / rozwiązana plansza Sudoku, program nie powinien drukować niczego, nawet nowej linii.
- Program powinien działać w ciągu mniej niż godziny dla dowolnej planszy (sugeruję testowanie przy użyciu całkowicie pustej planszy lub planszy z jedną losową liczbą ...).
Punktacja:
- Weź swój całkowity (golfowy) rozmiar kodu w znakach, w tym wszystkie białe znaki ...
Bonusy:
1/2 rozmiaru kodu : Jeśli program wydrukuje pojedynczy wykrzyknik i zatrzyma się po wprowadzeniu tablicy bez wprowadzonych rozwiązań.
1/2 rozmiaru kodu : Jeśli program wypisze dwa wykrzykniki i zatrzyma się po wprowadzeniu tablicy z wewnętrzną sprzecznością (dwie takie same liczby w tym samym rzędzie / kolumnie / kwadracie).
Odpowiedzi:
Brachylog , 245 bajtów / 2 = 122,5
(Zauważ, że musisz użyć wersji języka od tego zatwierdzenia . Ten kod wymagałby niewielkich zmian, aby działał poprawnie w następujących wersjach Brachylog)
Zostanie wydrukowane,
"!!"
jeśli dana tablica ma wewnętrzne sprzeczności (w takim przypadku zajmuje to jednak kilka sekund, ale bądź cierpliwy).Nie jestem pewien, czy poprawnie rozumiem pierwszy bonus, więc nie rozwiązuję go.
Jest to oczywiście niekonkurencyjne, ponieważ język jest znacznie nowszy niż wyzwanie, jednak ponieważ nie ma innych odpowiedzi, nie jestem pewien, czy to ma duże znaczenie…
Wyjaśnienie
Główny predykat:
Predykat 1: Usuń wszystkie
|
linie z linii, przekształć---+---+---
w,-
aby usunąć je późniejPredykat 2: Konwertuj jeden znak na liczbę całkowitą lub, jeśli jest pusty, na zmienną między 1 a 9.
Predykat 3: Załóżmy, że wszystkie wartości listy wejściowej komórek muszą być odrębne
Predykat 4: Zastosuj ograniczenie odróżniające do wartości w blokach 3 * 3
Predykat 5:
Predykat 6: Przypisz wartości spełniające ograniczenia do podzbioru pustych komórek, a następnie przy tych wartościach istnieje tylko jedno rozwiązanie na planszy.
Predykat 7: Przekształca planszę tak, że każda komórka jest teraz
[V:X:Y]
zamiast tylkoV
(wartość).Predykat 8: Przekształca linię tak, aby każda komórka była teraz
[V:X]
.Predykat 9: pobierz wartości komórek
Predykat 10: Dołącz długość podzestawu na początku
Predykat 11: wydrukuj jedną komórkę
źródło