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!


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.

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'


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]

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])


@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.

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).



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.


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

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

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

Witam i witam w PPCG; niezły pierwszy post.
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

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

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


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


@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!





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!


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,


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.