Wyjmij planszę Sudoku

25

Dzisiejsze wyzwanie jest proste: bez żadnego wkładu, wypisz dowolną prawidłową planszę sudoku.

Jeśli nie znasz sudoku, Wikipedia opisuje, jak powinna wyglądać ważna tablica :

Celem jest wypełnienie siatki 9 × 9 cyframi, tak aby każda kolumna, każdy wiersz i każda z dziewięciu podsiatek 3 × 3, które składają się na siatkę (zwaną także „ramkami”, „blokami” lub „regionami”), zawierały wszystkie cyfry od 1 do 9.

Teraz chodzi o to ... Istnieje 6,670,903,752,021,072,936,960 różnych prawidłowych plansz sudoku . Niektóre z nich mogą być bardzo trudne do skompresowania i wygenerowania w mniejszej liczbie bajtów. Inne z nich mogą być łatwiejsze. Częścią tego wyzwania jest ustalenie, które płyty będą najbardziej ściśliwe i które mogą być generowane w jak najmniejszej liczbie bajtów.

Twoje zgłoszenie niekoniecznie musi generować tę samą tablicę za każdym razem. Ale jeśli możliwych jest wiele wyjść, musisz udowodnić, że każde możliwe wyjście jest prawidłową kartą.

Możesz użyć tego skryptu (dzięki Magic Octopus Urn) lub dowolnej z tych odpowiedzi, aby sprawdzić, czy konkretna siatka jest prawidłowym rozwiązaniem. Wygeneruje a [1]dla prawidłowej planszy i cokolwiek innego dla nieprawidłowej planszy.

Nie jestem zbyt wybredny w tym, w jakim formacie wypisujesz swoją odpowiedź, o ile jest ona wyraźnie dwuwymiarowa. Na przykład można wyprowadzić macierz 9x9, dziewięć macierzy 3x3, ciąg, tablicę ciągów, tablicę liczb całkowitych 9 lub 9 cyfr z separatorem. Wyprowadzenie 81 cyfr w 1 wymiarze byłoby niedozwolone. Jeśli chcesz wiedzieć o konkretnym formacie wyjściowym, możesz zapytać mnie w komentarzach.

Jak zwykle jest to , więc napisz najkrótszą odpowiedź, jaką możesz wymyślić w wybranym przez siebie języku!

DJMcMayhem
źródło
Czy możemy wyprowadzić trzy matryce 3x9? Każdy rząd każdej submatrix reprezentujący wiersz na planszy sudoku. W ten sposób
dylnan,
2
Powiązane, ale nie duplikat . Ponadto, jeśli pozwalasz na elastyczne wyjście, nie jestem pewien, czy ma zastosowanie złożoność kolmogorowa , ponieważ zwykle dotyczy to stałych wyników, takich jak sztuka ascii.
BradC,

Odpowiedzi:

13

Pyth, 22 14 12 10 bajtów

.<LS9%D3 9

Zaoszczędzono 2 bajty dzięki Mr. Xcoder.

Wypróbuj tutaj

.<LS9%D3 9
     %D3 9     Order the range [0, ..., 8] mod 3.
  >            For each, ...
.< S9          ... Rotate the list [1, ..., 9] that many times.

źródło
11: m.<S9d%D3 9.
Pan Xcoder,
Krzyż, że obecnie, 10: .<LS9%D3 9.
Pan Xcoder,
Może chcę zaktualizować link ( tio )
bryc
8

T-SQL, 96 89 bajtów

Znaleziono jeden krótszy niż trywialny wynik!

SELECT SUBSTRING('12345678912345678',0+value,9)FROM STRING_SPLIT('1,4,7,2,5,8,3,6,9',',')

Wyodrębnia ciągi 9-znakowe zaczynające się w różnych punktach, zgodnie z tabelą utworzoną przez w pamięci STRING_SPLIT(obsługiwaną w SQL 2016 i nowszych). To 0+valuebył najkrótszy sposób, w jaki mogłem wykonać niejawną rzutowanie na liczbę całkowitą.

Oryginalny trywialny wynik (96 bajtów):

PRINT'726493815
315728946
489651237
852147693
673985124
941362758
194836572
567214389
238579461'
BradC
źródło
6

Python 2 , 53 bajty

r=range(9)
for i in r:print[1+(j*10/3+i)%9for j in r]

Wypróbuj online!


Alternatywy:

Python 2 , 53 bajty

i=0;exec"print[1+(i/3+j)%9for j in range(9)];i-=8;"*9

Wypróbuj online!

Python 2 , 54 bajty

for i in range(81):print(i/9*10/3+i)%9+1,'\n'*(i%9>7),
i=0;exec"print[1+(i/3+j)%9for j in range(9)];i+=10;"*9
r=range(9);print[[1+(i*10/3+j)%9for j in r]for i in r]
TFeld
źródło
5

Python 3 , 58 55 bajtów

l=*range(10),
for i in b"	":print(l[i:]+l[1:i])

Wypróbuj online!

  • -3 bajty dzięki Jo Kingowi,

Elementy łańcucha bajtów kończą się na liczbach, [1, 4, 7, 2, 5, 8, 3, 6, 9]które są używane do permutacji obrotów [0..9]. 0Usunięto l[1:i]i nie ma potrzeby pustego bajtu, który trwa dwa characaters ( \0) do reprezentowania obiektu w bajtach.

55 bajtów

_,*l=range(10)
for i in b"	":print(l[i:]+l[:i])
dylnan
źródło
55 bajtów
Jo King
@JoKing Clever, dzięki
dylnan
4

Galaretka , 9 8 bajtów

9Rṙ`s3ZẎ

Wypróbuj online!

9Rṙ`s3ZẎ
9R         Range(9) -> [1,2,3,4,5,6,7,8,9]
   `       Use the same argument twice for the dyad:
  ṙ        Rotate [1..9] each of [1..9] times.
           This gives all cyclic rotations of the list [1..9]
    s3     Split into three lists.
      Z    Zip. This puts the first row of each list of three in it's own list, 
           as well as the the second and third.
       Ẏ   Dump into a single list of nine arrays.
dylnan
źródło
4

Partia, 84 bajtów

@set s=123456789
@for %%a in (0 3 6 1 4 7 2 5 8)do @call echo %%s:~%%a%%%%s:~,%%a%%

Wykorzystuje dane wyjściowe @ Mnemonic. callsłuży do interpolacji zmiennej w operacji krojenia (zwykle przyjmuje tylko stałe numeryczne).

Neil
źródło
4

JavaScript (Node.js) , 47 bajtów

Dane wyjściowe jako tablica wierszy.

_=>[...w="147258369"].map(x=>(w+w).substr(x,9))

Wypróbuj online!

Generuje to:

472583691
583691472
691472583
725836914
836914725
914725836
258369147
369147258
147258369

Shieru Asakoto
źródło
4

Perl 6 , 40 32 27 bajtów

-5 bajtów dzięki nwellnhof

{[^9+1].rotate($+=3.3)xx 9}

Wypróbuj online!

Anonimowy blok kodu, który zwraca macierz 9x9. Odwzorowuje każdy wiersz na inny obrót w zakresie od 1 do 9.

Jo King
źródło
4

J , 18 bajtów

>:(,&|:|."{,)i.3 3

Wypróbuj online!

Wydajność

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 4 5 6 7 8 9 1
5 6 7 8 9 1 2 3 4
8 9 1 2 3 4 5 6 7
3 4 5 6 7 8 9 1 2
6 7 8 9 1 2 3 4 5
9 1 2 3 4 5 6 7 8

Jak to działa

>:(,&|:|."{,)i.3 3
             i.3 3  The 2D array X = [0 1 2;3 4 5;6 7 8]
   ,&|:|."{,        3-verb train:
   ,&|:               Transpose and flatten X to get Y = [0 3 6 1 4 7 2 5 8]
           ,          Flatten X to get Z = [0 1 2 3 4 5 6 7 8]
       |."{           Get 2D array whose rows are Z rotated Y times
>:                  Increment

Fantazyjna wersja, 23 bajty

|.&(>:i.3 3)&.>|:{;~i.3

Wypróbuj online!

Wydajność:

┌─────┬─────┬─────┐
│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│
└─────┴─────┴─────┘

Jak to działa

|.&(>:i.3 3)&.>|:{;~i.3
                    i.3  Array [0 1 2]
                 {;~     Get 2D array of boxed pairs (0 0) to (2 2)
               |:        Transpose
|.&(>:i.3 3)&.>          Change each pair to a Sudoku box:
            &.>            Unbox
    >:i.3 3                2D array X = [1 2 3;4 5 6;7 8 9]
|.&                        Rotate this 2D array over both axes
                             e.g. 1 2|.X gives [6 4 5;9 7 8;3 1 2]
            &.>            Box again so the result looks like the above
Bubbler
źródło
4

05AB1E , 14 12 bajtów

8ÝΣ3%}ε9Ls._

-2 bajty, tworząc port odpowiedzi Pyth @Mnemonic .

Wypróbuj online. (Stopka została dodana, aby wydrukować ją całkiem ładnie. Rzeczywistym wynikiem jest matryca 9 x 9; możesz ją usunąć, aby zobaczyć stopkę).

Wyjaśnienie:

8Ý              # List in the range [0, 8]
  Σ  }          # Sort the integers `i` by
   3%           #  `i` modulo-3
      ε         # Map each value to:
       9L       #  List in the range [1, 9]
         s._    #  Rotated towards the left the value amount of times

Oryginalne rozwiązanie 14 bajtów :

9Lε9LN3*N3÷+._

Wypróbuj online. (Stopka została dodana, aby wydrukować ją całkiem ładnie. Rzeczywistym wynikiem jest matryca 9 x 9; możesz ją usunąć, aby zobaczyć stopkę).

Wyjaśnienie:

9L                # Create a list of size 9
  ε               # Change each value to:
   9L             #  Create a list in the range [1, 9]
     N3*N3÷+      #  Calculate N*3 + N//3 (where N is the 0-indexed index,
                  #                        and // is integer-division)
            ._    #  Rotate that many times towards the left

Obie odpowiedzi powodują Sudoku:

123456789
456789123
789123456
234567891
567891234
891234567
345678912
678912345
912345678
Kevin Cruijssen
źródło
4

Octave i Matlab, 50 48 29 bajtów

mod((1:9)+['furRaghAt']',9)+1

Wypróbuj online!

-2 dzięki Johnathon Frech

-14 dzięki sugestii dodania Sanchises Broadcast, która wskazała również na niezgodność.

-5, zauważając, że wektor można zapisać w matlabie za pomocą łańcucha znaków i transpozycji.

Było intuicyjne, teraz już nie tak. Wykorzystuje sumowanie emisji do rozłożenia 1: 9 na 9 wierszy, rozłożonych według wartości określonych przez ciąg znaków.

Wyprodukowano planszę Sudoku:

 5 6 7 8 9 1 2 3 4
 2 3 4 5 6 7 8 9 1
 8 9 1 2 3 4 5 6 7
 3 4 5 6 7 8 9 1 2
 9 1 2 3 4 5 6 7 8
 6 7 8 9 1 2 3 4 5
 7 8 9 1 2 3 4 5 6
 4 5 6 7 8 9 1 2 3
 1 2 3 4 5 6 7 8 9
Poptimist
źródło
Witam i witam w PPCG; niezły pierwszy post.
Jonathan Frech
48 bajtów .
Jonathan Frech
Oczywiście s można zdefiniować w samej macierzy. Musiałem też przeliczyć bajty.
Poptimist
To jest teraz Octave, nie jest już kompatybilny z MATLAB. Jeśli chcesz, możesz użyć małej ikony łańcucha u góry łącza Jonathana, aby skopiować wklej domyślne formatowanie PPCG.
Sanchises,
Jeśli chcesz, możesz zmniejszyć to do 34 bajtów z dodawaniem transmisji: Wypróbuj online!
Sanchises,
3

Haskell , 41 bajtów

[[x..9]++[1..x-1]|x<-[1,4,7,2,5,8,3,6,9]]

Wypróbuj online!

Curtis Bechtel
źródło
To nie jest poprawne. Każdy kwadrat zawiera wielokrotność tego samego numeru. Można zrobić coś takiego (43 bajtów) , a nie
Jo królowi
Dzięki! Przyjąłem twoją sugestię
Curtis Bechtel,
@RushabhMehta zrobiłem. Miał 43 bajty, ale usunąłem, s=ponieważ nie jest to konieczne
Curtis Bechtel,
3

Java 10, 82 75 bajtów

v->{for(int i=81;i-->0;)System.out.print((i/9*10/3+i)%9+1+(i%9<1?" ":""));}

-7 bajtów, tworząc port jednej z odpowiedzi @TFeld na Python 2 .

Wypróbuj online.

Wyjaśnienie:

v->{                    // Method with empty unused parameter and no return-type
  for(int i=81;i-->0;)  //  Loop `i` in the range (81, 0]
    System.out.print(   //   Print:
     (i/9               //    (`i` integer-divided by 9,
         *10            //     then multiplied by 10,
         /3             //     then integer-divided by 3,
           +i)          //     and then we add `i`)
             %9         //    Then take modulo-9 on the sum of that above
               +1       //    And finally add 1
    +(i%9<1?            //    Then if `i` modulo-9 is 0:
            " "         //     Append a space delimiter
           :            //    Else:
            ""));}      //     Append nothing more

Generuje następujące sudoku (rozdzielone spacjami zamiast znaków nowej linii, jak poniżej):

876543219
543219876
219876543
765432198
432198765
198765432
654321987
321987654
987654321
Kevin Cruijssen
źródło
2

Python - 81 bajtów

l=list(range(1,10))
for i in range(1,10):print(l);l=l[3+(i%3==0):]+l[:3+(i%3==0)]

Wypróbuj online

Lubię mieć 81 bajtów, ale po optymalizacji :(

Python 2 - 75 68 59 58 bajtów

-7 bajtów dzięki @DLosc

-9 bajtów dzięki @Mnemonic

-1 bajt dzięki @JoKing

l=range(1,10)
for i in l:print l;j=i%3<1;l=l[3+j:]+l[:3+j]

Wypróbuj online

Don Thousand
źródło
2
81 bajtów Idealny wynik! : D
DJMcMayhem
@DJMcMayhem Zastanawiałem się nad tym, by zrobić to krócej, r=range(1,10)ale nie mogłem zrujnować piękna
Don Thousand
68 bajtów ;)
DLosc
@DLosc Ooh sprytne ponowne wykorzystaniel
Don Thousand
Jeśli nie masz nic przeciwko Python 2, możesz usunąć pareny z wydruku i usunąć pakowanie listy.
2

R , 54 bajty

x=1:9;for(y in(x*3)%%10)print(c(x[-(1:y)],x[(1:y)]))

Wydajność:

[1] 4 5 6 7 8 9 1 2 3
[1] 7 8 9 1 2 3 4 5 6
[1] 1 2 3 4 5 6 7 8 9
[1] 3 4 5 6 7 8 9 1 2
[1] 6 7 8 9 1 2 3 4 5
[1] 9 1 2 3 4 5 6 7 8
[1] 2 3 4 5 6 7 8 9 1
[1] 5 6 7 8 9 1 2 3 4
[1] 8 9 1 2 3 4 5 6 7

Wypróbuj online!

DobromirM
źródło
1

C (brzęk) , 65 bajtów

f(i){for(i=0;i<81;)printf("%d%c",(i/9*10/3+i)%9+1,i++%9>7?10:9);}

Funkcję można teraz ponownie wykorzystać

Wypróbuj online!

Logern
źródło
Zamiast drukować bajt NUL w celu oddzielenia cyfr, możesz użyć znaku tabulacji przy tej samej liczbie bajtów.
Jonathan Frech
„Twoje zgłoszenie niekoniecznie musi generować tę samą płytkę za każdym razem. Ale jeśli możliwe jest wiele wyjść, musisz udowodnić, że każde możliwe wyjście jest prawidłową płytą”. Nie oznacza to, że potrzebnych jest wiele wyjść. @ceilingcat
Logern
1
@Logern Zasada jest taka, że ​​przesłanie funkcji musi być wielokrotnego użytku . W porządku, jeśli f(); f()wysyła tę samą płytę dwa razy, ale nie, jeśli drugie połączenie w ogóle nie działa.
Anders Kaseorg,
63 bajty
Jo King
61 bajtów, zawierające sugestie @JoKingf(i){for(i=81;i--;)printf("%d%c",(i/9*10/3+i)%9+1,i%9?9:10);}
ceilingcat
1

K (ngn / k) , 16 bajtów

1+9!(<9#!3)+\:!9

Wypróbuj online!

Pierwsza odpowiedź w ngn / k, wykonana z dużą pomocą samego mężczyzny, @ngn.

W jaki sposób:

1+9!(<9#!3)+\:!9 // Anonymous fn
              !9 // Range [0..8]
    (     )+\:   // Sum (+) that range with each left (\:) argument
        !3       // Range [0..2]
      9#         // Reshaped (#) to 9 elements: (0 1 2 0 1 2 0 1 2)
     <           // Grade up
  9!             // Modulo 9
1+               // plus 1
J. Sallé
źródło
1

Japt, 11 10 bajtów

9õ ñu3
£éX

Wypróbuj lub sprawdź dane wyjściowe


Wyjaśnienie

9õ         :Range [1,9]
   ñ       :Sort by
    u3     :  Mod 3 of each
\n         :Assign to variable U
£          :Map each X
 éX        :  U rotated right by X
Kudłaty
źródło
0

Węgiel drzewny , 14 bajtów

E⁹⭆⁹⊕﹪⁺÷×χι³λ⁹

Wypróbuj online! Link jest do pełnej wersji kodu. Wykorzystuje dane wyjściowe @ Mnemonic. Wyjaśnienie:

E⁹              Map over 9 rows
  ⭆⁹            Map over 9 columns and join
          ι     Current row
         χ      Predefined variable 10
        ×       Multiply
       ÷   ³    Integer divide by 3
            λ   Current column
      ⁺         Add
     ﹪       ⁹  Modulo 9
    ⊕           Increment
                Implicitly print each row on its own line
Neil
źródło