Wprowadzenie
Napisz solver dla zagadek Hitori, używając najmniej bajtów.
Wyzwanie
Twoim zadaniem jest napisanie solvera dla logicznych łamigłówek Hitori (ひ と り, po japońsku słowo „sam”; znaczenie gry to „Zostaw mnie w spokoju”). Reguły są następujące:
- Wyświetlana jest siatka komórek n-na-n, każda komórka zawiera liczbę całkowitą od 1 do n (włącznie).
- Twoim celem jest upewnienie się, że żadna liczba nie pojawi się więcej niż raz w każdym rzędzie i każdej kolumnie siatki, poprzez usunięcie liczb z danej siatki, z zastrzeżeniem ograniczeń wskazanych w dwóch następnych regułach,
- Nie można usunąć dwóch liczb z dwóch sąsiadujących (poziomo lub pionowo) komórek.
- Pozostałe ponumerowane komórki muszą być ze sobą połączone. Oznacza to, że dowolne dwa pozostałe ponumerowane komórki można połączyć za pomocą krzywej złożonej wyłącznie z segmentów łączących sąsiednie pozostałe liczby (poziomo lub pionowo). (Podziękowania dla @ user202729 za wskazanie, że tego brakuje)
Mam nadzieję, że zasady są już jasne. Jeśli jest coś niejasnego w zasadach, sprawdź stronę na Wikipedii .
Przypadki testowe
Komórki, z których usuwane są liczby, są reprezentowane przez 0.
Input -> Output
4
2 2 2 4 0 2 0 4
1 4 2 3 -> 1 4 2 3
2 3 2 1 2 3 0 1
3 4 1 2 3 0 1 2
4
4 2 4 3 0 2 4 3
4 1 1 2 -> 4 1 0 2
3 1 2 1 3 0 2 1
4 3 1 3 0 3 1 0
5
1 5 3 1 2 1 5 3 0 2
5 4 1 3 4 5 0 1 3 4
3 4 3 1 5 -> 3 4 0 1 5
4 4 2 3 3 4 0 2 0 3
2 1 5 4 4 2 1 5 4 0
8
4 8 1 6 3 2 5 7 0 8 0 6 3 2 0 7
3 6 7 2 1 6 5 4 3 6 7 2 1 0 5 4
2 3 4 8 2 8 6 1 0 3 4 0 2 8 6 1
4 1 6 5 7 7 3 5 -> 4 1 0 5 7 0 3 0
7 2 3 1 8 5 1 2 7 0 3 0 8 5 1 2
3 5 6 7 3 1 8 4 0 5 6 7 0 1 8 0
6 4 2 3 5 4 7 8 6 0 2 3 5 4 7 8
8 7 1 4 2 3 5 6 8 7 1 4 0 3 0 6
9
8 6 5 6 8 1 2 2 9 8 0 5 6 0 1 2 0 9
5 6 2 4 1 7 9 8 3 5 6 2 4 1 7 9 8 3
5 8 2 5 9 9 8 2 6 0 8 0 5 0 9 0 2 0
9 5 6 6 4 3 8 4 1 9 5 6 0 4 3 8 0 1
1 1 6 3 9 9 5 6 2 -> 0 1 0 3 9 0 5 6 2
1 1 4 7 3 8 3 8 6 1 0 4 7 0 8 3 0 6
3 7 4 1 2 6 4 5 5 3 7 0 1 2 6 4 5 0
3 3 1 9 8 7 7 4 5 0 3 1 9 8 0 7 4 5
2 9 7 5 3 5 9 1 3 2 9 7 0 3 5 0 1 0
Te przypadki testowe pochodzą odpowiednio z Concept Is Puzzles , PuzzleBooks , Concept Is Puzzles , Wikipedia i Youtube .
Okular
Nie musisz martwić się obsługą wyjątków.
Państwo może zakładać, że wejście jest zawsze ważna logiczna z unikalnego rozwiązania można skorzystać z tego w pisanie kodu.
To jest golf golfowy , najniższa liczba bajtów wygrywa.
4 <= n <= 9 (16 pierwotnie zmieniono na 9 zgodnie z sugestią Stewie Griffin, również zaoszczędzić trochę problemów w IO)
Możesz pobierać dane wejściowe i dostarczać dane wyjściowe za pomocą dowolnego standardowego formularza i możesz wybrać format.
Niektóre sugestie dotyczące formatu wyjściowego są (ale nie jesteś do nich ograniczony)
- Wyprowadzanie ostatecznej siatki
- Wyprowadzanie siatki zawierającej wszystkie usunięte liczby
- Wyprowadzić listę współrzędnych jednego z powyższych
Jak zwykle obowiązują tutaj domyślne luki .
Powiązane (zainspirowane tym wyzwaniem): Sprawdź, czy wszystkie elementy w macierzy są połączone
Moje ostatnie wyzwanie: rozszerzenie gry w siódemkę
4 <= n <= 16
, ale dla największego przypadku testowegon=9
. Sugeruję, abyś albo opublikowałn=16
przypadek testowy, albo powiedz4 <= n <= 9
. Nawiasem mówiąc,Odpowiedzi:
Haskell , 374 bajty
Wypróbuj online!
źródło
APL (Dyalog Unicode) , 133 bajty SBCS
Wypróbuj online!
Moja implementacja reguły nr 4 (komórki muszą tworzyć pojedynczy podłączony komponent) jest raczej marnotrawstwem, ale nadal przechodzi wszystkie testy w około 10 sekund na TIO.
Ogólny algorytm: przechowuj dwie macierze boolowskie
b
iw
komórki, które z pewnością będą odpowiednio czarne i białe. Zainicjujb
jako zero. Zainicjujw
jako 1 tylko dla komórek, które mają sąsiadujących sąsiadujących ze sobą przeciwnie.Powtarzaj do
b
iw
ustabilizuj:dodaj do
b
komórek, które znajdują się w tej samej linii (poziomej lub pionowej) i mają tę samą wartość, co komórkaw
dodać do
w
bezpośrednich sąsiadów wszystkich komórek wb
dodaj do
w
wszystkich punktów odcięcia - komórki, których usunięcie podzieliłoby wykres komórek innych niż czarne na wiele połączonych komponentówNa koniec wynik
not(b)
pomnożony przez pierwotną macierz.źródło
Galaretka , 62 bajty
Korzysta z linku monadycznego isConnected użytkownika user202729 z innego pytania.
Pełny program drukujący reprezentację listy list.
Działa brutalną siłą i jest głupio nieefektywna.
Wypróbuj online! - 3 na 3, ponieważ jest zbyt mało wydajny, aby uruchomić nawet rozmiar 4 w granicach 60 sekund TIO!
W jaki sposób?
źródło