Moja próba sformułowania tego pytania , ale z bardziej obiektywnym kryterium rozwiązywania.
Twoim zadaniem jest zbudowanie programu lub funkcji, która przyjmuje rozwiązaną siatkę Sudoku S
w wybranym przez ciebie formacie i próbuje wygenerować problematyczną siatkę z jak najmniejszą liczbą wskazówek, która ma S
swoje unikalne rozwiązanie. (Nie ma znaczenia, jaką metodą S
jest unikalne rozwiązanie, w tym brutalna siła, o ile rozwiązanie jest możliwe do udowodnienia).
Twój program zostanie oceniony przez uruchomienie go przez zestaw 100 000 siatek rozwiązań znalezionych w tym pliku (7,82 MB do pobrania) i zsumowanie liczby wskazówek we wszystkich 100 000 siatkach problemowych tworzonych przez twoje rozwiązanie.
Rozwiązania Sudoku w powyższym pliku testowym są wyrażone jako ciąg znaków o długości 81 znaków, od lewej do prawej, a następnie od góry do dołu. Kod wymagany do przekształcenia danych wejściowych w pliku testowym w użyteczne rozwiązanie nie będzie wliczany do liczby bajtów rozwiązania.
Podobnie jak w moim wyzwaniu Flood Paint , twój program musi faktycznie wygenerować prawidłowy wynik dla wszystkich 100 000 zagadek, aby można go było uznać za prawidłowe rozwiązanie. Program, który generuje najmniejszą liczbę wskazówek dla wszystkich 100 000 przypadków testowych, jest zwycięzcą, z krótszym kodem przerywającym remis.
Aktualna tablica wyników:
- 2 3610 024 - nutki, C
- 2 580,210 - es1024, PHP
- 6 000 000 - CarpetPython, Python 2
- 7 200 000 - Joe Z., Python
Odpowiedzi:
C - 2 361
024 2509949wskazówekUsuń wskazówki, zaczynając od ostatniej komórki, jeśli solute solver znajdzie tylko jedno unikalne rozwiązanie.
Druga próba: użyj heurystyki, aby zdecydować, w jakiej kolejności usunąć wskazówki zamiast zaczynać od ostatniej. Powoduje to, że kod działa znacznie wolniej (20 minut zamiast 2, aby obliczyć wynik). Mógłbym przyspieszyć solver, eksperymentować z różnymi heurystykami, ale na razie się uda.
źródło
Python - 7 200 000 wskazówek
Jak zwykle, oto rozwiązanie referencyjne na ostatnim miejscu:
Usunięcie dolnego rzędu liczb z pewnością sprawi, że łamigłówka będzie możliwa do rozwiązania we wszystkich przypadkach, ponieważ w każdej kolumnie nadal jest wypełnionych 8 z 9 liczb, a każda liczba w dolnym rzędzie jest po prostu dziewiątą liczbą pozostałą w kolumnie.
Jeśli jakiemukolwiek poważnemu kandydatowi uda się zalegalizować gorzej niż ten, będę zaskoczony.
źródło
Python 2 - 6 000 000 wskazówek
Proste rozwiązanie, które wykorzystuje 3 popularne metody rozwiązywania tych zagadek:
Ta funkcja generuje formaty wskazówek takie jak to:
To zawsze można rozwiązać. 4 części 3x3 są rozwiązywane najpierw, następnie 8 kolumn, a następnie 9 rzędów.
źródło
PHP - 2580 210 wskazówek
Ten pierwszy usuwa ostatni wiersz i kolumnę oraz prawy dolny róg każdego pola. Następnie próbuje wyczyścić każdą komórkę, po każdej zmianie przeprowadzając tablicę za pomocą prostego solwera, aby upewnić się, że tablica jest nadal jednoznacznie rozwiązalna.
Znaczna część poniższego kodu została zmodyfikowana na podstawie jednej z moich starych odpowiedzi .
printBoard
używa zer dla pustych komórek.źródło