Określenie dowolnej dowolnej siatki 9x9 wymaga podania pozycji i wartości każdego kwadratu. Naiwne kodowanie tego może dać 81 (x, y, wartość) trypletów, wymagając 4 bitów dla każdego x, y i wartości (1-9 = 9 wartości = 4 bity) w sumie 81x4x3 = 972 bitów. Numerując każdy kwadrat, można zmniejszyć informację o położeniu do 7 bitów, upuszczając nieco bit dla każdego kwadratu i łącznie 891 bitów. Określając z góry ustaloną kolejność, można drastycznie zredukować ją do zaledwie 4 bitów dla każdej wartości, co daje w sumie 324 bity. Jednak w sudoku może brakować liczb. Daje to możliwość zmniejszenia liczby liczb, które należy podać, ale może wymagać dodatkowych bitów do wskazywania pozycji. Używając naszego 11-bitowego kodowania (pozycja, wartość), możemy określić układankę z wskazówkami z bitów, np. Minimalna (17) łamigłówka wymaga 187 bitów. Najlepszym kodowaniem, o jakim do tej pory myślałem, jest użycie jednego bitu dla każdego miejsca, aby wskazać, czy jest ono wypełnione, a jeśli tak, to kolejne 4 bity kodują liczbę. Wymaga to bitów, 149 dla minimalnej układanki ( ). Czy istnieje bardziej wydajne kodowanie, najlepiej bez bazy danych każdej prawidłowej konfiguracji sudoku? (Punkty za adresowanie ogólny z logiczne)
Właśnie przyszło mi do głowy, że wiele łamigłówek będzie rotacją kolejnej lub będzie miało zwykłą kombinację cyfr. Być może może to pomóc w zmniejszeniu wymaganych bitów.
Według Wikipedii ,
Liczba klasycznych siatek rozwiązań 9 × 9 wynosi 66 690 903 752 021,072,936,960 (sekwencja A107739 w OEIS) lub około .
Jeśli poprawnie wykonałem matematykę ( ), uzyskam 73 (72.498) bitów informacji dla tabeli odnośników.
Ale:
Wykazano, że liczba zasadniczo różnych rozwiązań, biorąc pod uwagę symetrie, takie jak obrót, odbicie, permutacja i znakowanie, wynosi zaledwie 5 472 730 538 [15] (sekwencja A109741 w OEIS).
Daje to 33 (32,35) bitów, więc możliwe jest, że sprytna metoda wskazania, która permutacja może spaść poniżej pełnych 73 bitów.
Odpowiedzi:
Tak. Mogę wymyślić kodowanie poprawiające twoje 149-bitowe kodowanie minimalnej układanki w 6 lub 9 bitach, w zależności od warunków. To jest bez bazy danych lub rejestru innych rozwiązań lub częściowych płyt. Oto jest:9 × 9
Najpierw używasz bitów do zakodowania liczby m przy minimalnej liczbie wystąpień na planszy. Kolejne 4 bitów kodowania Rzeczywista £ -l od razy m pojawi. Następne 7 ℓ bitów koduje każdą pozycję, w której pojawia się m .4 m 4 ℓ m 7 ℓ m
Kolejne bitów to flagi wskazujące, czy pozostałe pozycje mają liczbę, czy nie (pomijasz pozycje, w których znajduje się m ). Ilekroć jest jeden z tych bitów , kolejne 3 bity wskazują, która to liczba (w uporządkowanym zbiorze { 1 , … , 9 } bez m ). Na przykład, jeśli m = 4, a 3 bity są , to liczba w odpowiedniej pozycji na planszy jest piątą (licząc od 0) w zestawie { 1 , 2 , 3 ,81 - ℓ m { 1 , … , 9 } m m = 4 {1,2,3,5,6,7,8,9} 6 j<m j−1 j>m j−2 ℓ 3(n−ℓ)
1
101
, więc jest to 6 . Liczby j < m będą kodowane binarnie jako j - 1 , podczas gdy liczby j > m będą kodowane jako j - 2 . Ponieważ już napisaliśmy ℓ pozycji,zostaną dodanetylko 3 ( n - ℓ ) bity, aby zakodować resztę płytki w tym kroku.Zatem całkowita liczba bitów wymagana do zakodowania płytki przy użyciu tej procedury wynosi
Dla zauważamy, że ℓ może wynosić 0 lub 1 (ogólnie ℓ ≤ ⌊ n / 9 ⌋ ). Zatem B może wynosić 140 lub 143 w zależności od tego, czy na planszy nie ma numeru.n=17 ℓ ℓ≤⌊n/9⌋ B
Warto zauważyć, że rozwiązanie Kevina jest znacznie lepsze w ogólnym przypadku. To kodowanie wykorzystuje maksymalnie 149 bitów tylko dla lub dla n = 20, pod warunkiem że ℓ = 0 . Przynajmniej pokazuje ogólny pomysł, jak wykorzystać fakt, że N = 9 jest bardzo zbliżone do 2 ⌊ log 2 N ⌋ (co oznacza, że mamy tendencję do „utraty pamięci” przy użyciu 4 bitów na wartość, ponieważ 4 bity pozwalają nam również wyrazić N = 16 liczb.n∈{17,18,19} n=20 ℓ=0 N=9 2⌊log2N⌋ N=16
Przykład. Rozważ następującą tablicę z wskazówkami.n=17
Tutaj żadna liczba nie pojawia się na planszy, a liczby 6, 7 i 9 pojawiają się tylko raz. Przyjmujemy ( ) i ℓ = 1 ( ). Czytając pozycje od lewej do prawej, a następnie od góry do dołu, m pojawia się w pozycji 36 ( ). Zatem nasze kodowanie zaczyna się od .m=7 ℓ=1 m 36
0111
0001
0100100
011100010100100
Następnie potrzebujemy siedmiu1 4 m=7 1,2,3,4,5,6,8,9
0
s, jednego1
i 3-bitowego kodowania liczby , a następnie a i 3-bitowego kodowania 4 itd. ( ). Ostatecznie pomińmy pozycję, w której jest m = 7 , i zakodujemy 8 jako (szósta liczba od 0 na liście 1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 ) i 9 jako . Pełne kodowanie wygląda następująco:0
1
0000000100101100
110
111
Kompletne kodowanie jest
01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000
, a czytelnik może sprawdzić, czy długość tego ciągu jest rzeczywiście 143 :-)źródło