Utwórz kontroler sudoku
Jest tu mnóstwo Sudoku SOLVERS, ale chcę, żebyś stworzył narzędzie KONTROLER tak małe, jak to tylko możliwe (kod-golf).
Prawidłowy wpis będzie mógł przyjąć tablicę 9x9 jako argument (przekazany przez odniesienie, zserializowany w wierszu polecenia lub jakkolwiek chcesz go wziąć) lub zaakceptować plik wejściowy, który składa się z dziewięciu wierszy po dziewięć liczb dla ostatecznej siatki . Zobacz przykłady danych wejściowych poniżej.
Prawidłowe dane wejściowe powinny być liczbami podstawowymi 10 (1-9)
Brakujące, puste, dodatkowe, nienumeryczne pozycje lub pozycje o liczbach spoza 1-9 należy odrzucić jako nieprawidłowe dane wejściowe, zwracając wynik niezerowy, drukując błąd lub oba.
Twój program musi sprawdzić, czy każda liczba pojawia się raz na kolumnę, raz na linię i raz na podsiatkę 3x3. Jeśli przejdzie pomyślnie, zwróć „0”, a jeśli nie, zwróć wynik niezerowy.
Należy unikać korzystania z zasobów zewnętrznych (stron internetowych itp.).
Jeśli Twoje rozwiązanie jest samodzielnym programem, wyjście ze statusem wyjścia lub drukowanie, „0” lub niezerowe odpowiednio dla „Pass” lub „Fail” jest w porządku.
Niech wygra najmniejsza odpowiedź!
Przykłady wprowadzania:
tablica c:
int input[9][9]={{1,2,3,4,5,6,7,8,9},
{4,5,6,7,8,9,1,2,3},
{7,8,9,1,2,3,4,5,6},
{2,3,1,5,6,4,8,9,7},
{5,6,4,8,9,7,2,3,1},
{8,9,7,2,3,1,5,6,4},
{3,1,2,6,4,5,9,7,8},
{6,4,5,9,7,8,3,1,2},
{9,7,8,3,1,2,6,4,5}
};
plik:
123456789
456789123
789123456
231564897
564897231
897231564
312645978
645978312
978312645
9 podsiatek:
+---+---+---+
|123|456|789|
|456|789|123|
|789|123|456|
+---+---+---+
|231|564|897|
|564|897|231|
|897|231|564|
+---+---+---+
|312|645|978|
|645|978|312|
|978|312|645|
+---+---+---+
źródło
1
lub-1
Python, 103
Nienawidzę sudoku.
Jak to działa: każdy wiersz, kolumna i blok musi mieć każdą liczbę od 1 do 9. Tak więc dla każdego
0 <= i, j < 9
komórkii,j
jest w bloku3*floor(i/3) + floor(j/3)
. Tak więc należy spełnić 243 wymagania. Robię każde wymaganie krotką,((item index,item type number),symbol)
gdzieitem index
jest liczbą od 0 do 8 (włącznie),item type number
wynosi 0,1 lub 2, aby oznaczać odpowiednio wiersz, kolumnę lub blok isymbol
jest wpisemb[i][j]
.Edycja: przez pomyłkę nie sprawdziłem poprawnych wpisów. Teraz ja robię.
źródło
0
jeśli rozwiązanie się powiedzie, a nieTrue
APL (46)
Wymaga to matrycy 9 na 9. Przykład można wprowadzić na TryAPL w następujący sposób:
Wyjaśnienie:
↓⍉⍵
: pobierz kolumny⍵
,↓⍵
: uzyskaj rzędy⍵
,3/3⌿3 3⍴Z←⍳9
:, Aby matryca 3-o-3 zawierającym cyfry1
z9
, a następnie potrójnie numer w obu kierunkach, dając matrycy 9-by-9 z numerami1
na9
co wskazuje każdej grupieZ∘.=
: Dla każdego numeru1
do9
, zrobić maskę bitową dla danej grupy,/∘(,⍵)¨
: i maska⍵
za każdym razem, podając grupy⍵
.∊∘Z¨
: dla każdej pod-tablicy sprawdź, czy zawiera ona liczby1
się9
,∧/,↑
: weź logikęand
wszystkich tych liczb razem.źródło
↓9 9⍴1 3 2⍉3 3 9⍴⍵
jest to równoważne,/∘(,⍵)¨↓Z∘.=,3/3⌿3 3⍴Z←⍳9
ale dość krótsze. Jestem pewien, że istnieją jeszcze krótsze formuły.⍪
i wykonać pojedynczy podział na końcu:↓(9 9⍴1 3 2⍉3 3 9⍴⍵)⍪⍵⍪⍉⍵
∊∘Z¨
sprawdza, czy każda podgrupa (wiersz, kolumna lub blok) składa się tylko z liczb od 1 do 9. To nie sprawdza, czy wszystkie liczby są reprezentowane. Musisz zrobić coś takiego,Z∘.∊
który testuje, że każda liczba w Z jest zawarta w każdej pod-macierzy.∧/,↑
można to skrócić∧/∊
. Skończyłem, skończyłem! ;-)If it passes, return "0" and if not, return a non-zero result.
Java / C # -
183/180181/178173/170 bajtów(Zmień
boolean
nabool
na C #)Sformatowany:
Metoda tworzy tablicę
u
z 27 maskami bitowymi, reprezentującymi cyfry znalezione w dziewięciu wierszach, kolumnach i kwadratach.Następnie iteruje wszystkie komórki, wykonując operację mającą na
1 << a[x][y]
celu utworzenie maski bitowej reprezentującej cyfrę, a także jej kolumnę, wiersz i maskę bitową z nią.Następnie iteruje wszystkie 27 masek bitowych, zapewniając, że sumują się one do 27594 (1022 * 9, 1022 to maska bitowa dla wszystkich obecnych cyfr 1-9). (Zauważ, że
y
kończy się na 27603, ponieważ zawiera już 9 po podwójnej pętli).Edycja: Przypadkowo pozostawiono w
%3
niepotrzebnym już miejscu.Edycja 2: Zainspirowany komentarzem Bryce Wagner kod został nieco bardziej skompresowany.
źródło
python = 196
Nie najbardziej golfowy, ale pomysł już istnieje. Zestawy są bardzo przydatne.
Deska:
Program:
źródło
n={*range(1,10)}
, ale jest to nowsza wersja niż wyzwanie. Zamiast tego użyj,set(range(1,10))
jak powiedział MatrixFrog.Java -
385 306 328260 znakówEdycja: Niemądrze źle odczytałem instrukcje, że odpowiedź musi być kompletnym programem. Ponieważ może to być tylko poprawna funkcja, przepisałem i zminimalizowałem, aby być funkcją, i przepisałem moje wprowadzenie do rozwiązania, mając to na uwadze.
Tak więc, jako wyzwanie dla siebie, pomyślałem, że spróbuję stworzyć najmniejsze narzędzie do sprawdzania rozwiązań Java.
Aby to osiągnąć, zakładam, że łamigłówka sudoku zostanie przekazana jako wielowymiarowa tablica Java, taka jak:
Następnie mamy rzeczywisty solver, który zwraca „0”, jeśli prawidłowe rozwiązanie, „1”, jeśli nie.
W pełni golfa:
Czytelny:
Jak to działa? Zasadniczo po prostu tworzę własną bazę liczb z wystarczającą rozdzielczością w każdej cyfrze, że muszę tylko trzy porównania numeryczne po przejściu przez układankę raz, aby wiedzieć, czy jest poprawna. Wybrałem bazę 49 dla tego problemu, ale każda baza większa niż 45 byłaby wystarczająca.
(Mam nadzieję) jasny przykład: wyobraź sobie, że każdy „wiersz” w łamigłówce sudoku to jedna cyfra w liczbie bazowej 49. Dla uproszczenia będziemy reprezentować każdą cyfrę w liczbie base-49 jako liczbę base-10 w wektorze. Tak więc, jeśli wszystkie wiersze są „poprawne”, oczekujemy następującej liczby base-49 (jako wektora base-10):
lub przekonwertowany na jedną liczbę podstawową 10:
1526637748041045
Postępuj zgodnie z podobną logiką dla wszystkich kolumn i tak samo dla „podsiatek”. Każda wartość napotkana w końcowej analizie, która nie jest równa tej „idealnej liczbie”, oznacza, że rozwiązanie układanki jest nieprawidłowe.
Edytuj, aby rozwiązać problem podatności na wszystkie 5 i inne powiązane problemy: Dodaję czwarty numer base-49, oparty na założeniu, że w każdej układance powinno być 9 liczb. Tak więc dodaję 5 do każdej cyfry liczby podstawowej-49 dla każdego wystąpienia liczby podstawowej-10, która reprezentuje indeks cyfry. Przykład: jeśli istnieje 10 9 i 9 8, 9 7, 8 6 i 9 wszystkich innych, otrzymasz liczbę podstawową 49 (jako wektor podstawy 10 wielkości 10, aby poradzić sobie z przepełnieniem):
Który zawiedzie w porównaniu z naszą „idealną” liczbą base-49.
Moje rozwiązanie wykorzystuje to matematyczne rozwiązanie, aby uniknąć jak największej liczby pętli i porównań. Po prostu używam
long
wartości do przechowywania każdej liczby base-49 jako liczby base-10 i używam tablicy odnośników, aby uzyskać „współczynniki” dla każdej cyfry base-49 podczas obliczania wartości kontrolnej kolumny / wiersza / podsiatki.Ponieważ Java nie została zaprojektowana tak, aby była zwięzła, uważność w matematycznej konstrukcji była jedynym sposobem, w jaki doszłam do wniosku, że mogę zbudować zwięzły moduł sprawdzający.
Powiedz mi co myślisz.
źródło
R 145
Kod do gry w golfa (mniej więcej) można znaleźć tutaj /programming//a/21691541/1201032 .
źródło
Haskell (Lambdabot), 65 bajtów
źródło
Perl, 193 bajtów
Dane wejściowe są oczekiwane w postaci tablicowej:
Kod zakończenia wynosi 0, jeśli
@a
jest rozwiązaniem, w przeciwnym razie1
jest zwracany.Wersja bez golfa:
Każdy z 9 wierszy, 9 kolumn i 9 tablic podrzędnych jest umieszczany w posortowanej tablicy i sprawdzany, czy pasuje do tablicy
(1..9)
. Liczba$r
jest zwiększana dla każdego udanego dopasowania, które musi zsumować do 27 dla prawidłowego rozwiązania.źródło
J
5254Pobiera argument wklejony w linii poleceń, zakończony a) jako:
Zwraca 1, jeśli minął, 0 jeśli nie.
Wewnętrznie przekształca siatkę 9x9 w siatkę 3x3x3x3 i wykonuje pewne permutacje na osiach, aby uzyskać pożądaną jednostkę (rzędy, linie i pola) w ostatnich 2 wymiarach.
Po wykonaniu tej czynności sprawdza się, czy każda jednostka ma 9 unikalnych wartości.
Prawdopodobnie daleki od ideału, ale już bije większość ;-)
źródło
Mathematica,
8479 znakówPrzykłady:
źródło
3
zawsze wskazuje na nieprawidłowe dane wejściowe, czy też czasami stanowi odpowiedź na nieudane rozwiązanie?JavaScript ES6, 150 znaków
Pobiera dane wejściowe jako ciąg znaków o długości 81 znaków bez żadnych ograniczników.
Funkcja zwraca
null
odpowiedź negatywną, a tablica z oryginalnym łańcuchem w pierwszym elemencie jako dodatnia. Można zmienić na bool, dodając!!
na początku funkcji.Test (zobacz powiązane wyzwanie, aby uzyskać więcej szczegółów):
źródło
R,
6350 bajtówPrzyjmuje dane wejściowe
m
to macierz liczb 9x9.Miałem rację, że dalsza gra w golfa jest możliwa.
Wyjaśnienie:
Weź
m
i dla każdego wiersza zastosujmatch
funkcję. Podajemy kolejny argumentx=1:9
do przekazaniamatch
.x
jest domyślnym argumentem pierwszej pozycji, dlatego też każdy wiersz jest umieszczany na drugim argumencie pozycji, czylitable
. Funkcjamatch
szuka instancjix
wtable
. W takim przypadku szuka1:9
(liczb od 1 do 9) w każdym rzędzie. Dla każdego1:9
powróciTRUE
(lubFALSE
), jeśli ten numer zostanie znaleziony (lub nie).To daje szereg 81 wartości logicznych.
Powtórz powyższe dla każdej kolumny danych wejściowych.
Na koniec
all
sprawdza, czy każdy element listy booleanów jestTRUE
. Będzie to miało miejsce wtedy i tylko wtedy, gdy rozwiązanie jest poprawne (tj. Każda liczba1:9
występuje tylko raz w każdej kolumnie i każdym wierszu).Stare podejście:Pobiera każdy wiersz, sortuje go, a następnie porównuje[1, 2, ... 9]
. Prawidłowy wiersz powinien dokładnie pasować. Następnie robi to samo dla każdej kolumny. W sumie powinniśmy mieć 162 dokładne dopasowania, co sprawdza ostatnia porcja. Prawdopodobnie istnieje tu pole do dalszej gry w golfa ...źródło
Haskell - 175
Funkcja
v
można zadzwonić. Działa poprzez porównanie różnicy każdego wiersza, kolumny i bloku z listą[1..9]
i zsumowanie długości tych list różnic.Demo na przykładzie Sudoku:
źródło
JavaScript - 149 znaków
Oczekuje, że tablica
a
będzie istnieć i utworzy zmiennąo
dla wyniku, który jest0
zakończy się powodzeniem, w przeciwnym razie niezerowa.Działa poprzez sprawdzenie, czy suma pozycji, w której występuje każda wartość dla każdego wiersza, kolumny i siatki 3 * 3, wynosi 36 (0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8).
Testowanie
Daje „o = 0”
(Zamieniono 2 ostatnie cyfry)
Daje
o=-1
Daje
o=-284
źródło
Haskell,
121130127 bajtów (87 Lambdabot)wykorzystuje:
Lambdabot domyślnie ładuje Data.List i Data.List.Split (nie sądzę, aby rozwiązanie BlackCap sprawdzało pola).
Pomysły na ulepszenia mile widziane
// Edycja:
Pomieszałem :) // Edycja: 3 bajty zapisane przez BlackCap
źródło
(map sort)
z(sort<$>)
.c$(sort<$>)<$>
z$(sort<$>)=<<
05AB1E , 36 bajtów | Brak konkurencji |
Wypróbuj online!
1 jest prawdą, wszystko inne jest fałszywe.
źródło
Clojure, 151 bajtów
Dość długo, ale wydaje się, że inni też. Również denerwujące jest to, że połączenie zbiorów wymaga a
require
, więc zamiast tego użyłem konkat wektorów.Iteruje po każdym wierszu i kolumnie, a jeśli wartość wynosi od 1 do 9, emituje trzy wektory, jeden dla wiersza, kolumny i komórki 3x3. Zwraca 0 w przypadku sukcesu, a w
nil
przeciwnym razie dwa dodatkowe znaki mogą zwrócić 1 w przypadku niepowodzenia. Obsługuje liczby spoza 1 - 9, powracając,nil
ale spowoduje awarię innych anomalii, takich jak wartości inne niż całkowite. Ilości wynoszą 0–2, więc można bezpiecznie używać wartości8
i9
odróżniać wartości komórek od wierszy i kolumn.Dane wejściowe to zagnieżdżony wektor wektorów (więc
nth
działa):Nie golfowany:
źródło
PHP,
196190 bajtówProgram pobiera 9 oddzielnych argumentów wiersza poleceń (jeden ciąg cyfr dla każdego wiersza siatki);
wychodzi z
1
(błąd) dla niepoprawnego,0
(ok) dla ważnego.Uruchom z
php -nr '<code>' <row1> <row2> ...
.awaria
wyjaśnienie
count_chars
zlicza znaki w ciągu i zwykle tworzy tablicę z kodami ascii jako kluczami, a znaki liczą się jako wartości; ale z3
parametrem as mode tworzy posortowany ciąg znaków ze znaków; i można to łatwo porównać do liczby z poszukiwanymi cyframi.Porównanie nie tylko sprawdza duplikaty, ale obejmuje również sprawdzenie nieprawidłowych znaków. I wymaga tylko
<
, nie!=
, ponieważ jest to porównanie numeryczne: PHP zinterpretuje ciąg znaków jako liczbę, o ile to możliwe.123e56789
,0x3456789
lub podobne nie mogą się pojawiać, ponieważ znaki są sortowane; i każda czysta liczba całkowita z brakującą cyfrą jest mniejsza niż123456789
... i.23456789
oczywiście.$a=$argv
zapisuje jeden bajt,$d=123456789
zapisuje dziewięć i$u=count_chars
zapisuje 13.źródło
C # -
306298288 znakówDo wywołania funkcji sprawdzania użyto następującego programu konsoli;
Wystarczy zainicjować tablicę i przekazać ją do funkcji sprawdzającej P.
Funkcja sprawdzania jest jak poniżej (w formie gry w golfa);
Lub w pełni ułożonej formie;
Wykorzystuje to ideę, że wszystkie kolumny, wiersze i podsiatki powinny sumować do 45. Działa przez tablicę wejściową i odejmuje wartość każdej pozycji od jej wiersza, kolumny i podsiatki. Po zakończeniu sprawdza, czy żaden z wierszy, kolumn lub podsiatek nadal nie ma wartości.
Zgodnie z żądaniem zwraca wartość 0, jeśli tablica jest prawidłowym rozwiązaniem Sudoku i niezerową (1), jeśli nie jest.
źródło
private static int P(int[,]i){int[]r=new int[9],c=new int[9],g=new int[9];
zamiast tego. (Zwróć uwagę na usunięcie spacji po zamkniętym nawiasie kwadratowym]
.) Nie jestem też pewien, ale myślę, że możesz się go pozbyćprivate static
.for(int p=0;p<9;p++)if(r[p]>0|c[p]>0|g[p]>0)return 1;return 0;}
Nie jestem pewien, czy to działa w C #. (Właściwie nie znam C #)