Keluarkan papan Sudoku


25

Tantangan hari ini sederhana: Tanpa mengambil input apa pun, mengeluarkan papan sudoku yang valid.

Jika Anda tidak terbiasa dengan sudoku, Wikipedia menjelaskan seperti apa bentuk papan yang valid :

Tujuannya adalah untuk mengisi kisi 9 × 9 dengan angka sehingga setiap kolom, setiap baris, dan masing-masing dari sembilan 3 × 3 subgrid yang menyusun kisi (juga disebut "kotak", "blok", atau "wilayah") mengandung semua digit dari 1 hingga 9.

Nah, inilah masalahnya ... Ada 6.670.903.752.021.072.936.960 papan sudoku yang valid berbeda . Beberapa dari mereka mungkin sangat sulit untuk dikompres dan diproduksi dalam lebih sedikit byte. Yang lain mungkin lebih mudah. Bagian dari tantangan ini adalah untuk mencari tahu papan mana yang akan paling kompresibel dan bisa dikeluarkan dalam byte paling sedikit.

Kiriman Anda tidak harus selalu menampilkan papan yang sama setiap kali. Tetapi jika beberapa output dimungkinkan, Anda harus membuktikan bahwa setiap output yang mungkin adalah papan yang valid.

Anda dapat menggunakan skrip ini (terima kasih pada Magic Octopus Guci) atau salah satu dari jawaban ini untuk memverifikasi jika kisi tertentu adalah solusi yang valid. Ini akan menghasilkan a [1]untuk papan yang valid, dan apa pun untuk papan yang tidak valid.

Saya tidak terlalu pilih-pilih tentang format di mana Anda menghasilkan jawaban Anda, asalkan itu jelas 2-dimensi. Misalnya, Anda dapat menampilkan matriks 9x9, sembilan matriks 3x3, string, array string, array bilangan bulat 9 digit, atau sembilan bilangan 9 digit dengan pemisah. Menghasilkan 81 digit dalam 1 dimensi tidak akan diizinkan. Jika Anda ingin tahu tentang format output tertentu, jangan ragu untuk bertanya kepada saya di komentar.

Seperti biasa, ini adalah , jadi tuliskan jawaban terpendek yang dapat Anda temukan dalam bahasa yang Anda pilih!


Bisakah kita mengeluarkan tiga matriks 3x9? Setiap baris dari masing-masing submatrix mewakili satu baris di papan sudoku. Seperti ini
dylnan

2
Terkait tetapi bukan dup . Juga, jika Anda mengizinkan output fleksibel, saya tidak yakin bahwa kompleksitas-kolmogorov berlaku, karena itu biasanya untuk output tetap seperti seni ascii yang tepat.
BradC

Jawaban:


13

Pyth, 22 14 12 10 byte

.<LS9%D3 9

Disimpan 2 byte berkat Tn. Xcoder.

Coba di sini

.<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.
Tn. Xcoder

Lintas yang keluar, 10: .<LS9%D3 9.
Tn. Xcoder

Mungkin ingin memperbarui tautan ( tio )
bryc


8

T-SQL, 96 89 byte

Ditemukan satu yang lebih pendek dari keluaran sepele!

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

Ekstrak string 9-karakter yang dimulai pada titik yang berbeda, seperti yang didefinisikan oleh tabel dalam-memori yang dibuat oleh STRING_SPLIT(yang didukung pada SQL 2016 dan yang lebih baru). Itu 0+valueadalah cara terpendek yang dapat saya lakukan untuk melakukan cast implisit ke integer.

Output trivial asli (96 byte):

PRINT'726493815
315728946
489651237
852147693
673985124
941362758
194836572
567214389
238579461'


6

Python 2 , 53 byte

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

Cobalah online!


Alternatif:

Python 2 , 53 byte

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

Cobalah online!

Python 2 , 54 byte

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 byte

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

Cobalah online!

  • -3 byte terima kasih kepada Jo King,

Elemen-elemen dari string byte akhirnya memberikan angka-angka [1, 4, 7, 2, 5, 8, 3, 6, 9]yang digunakan untuk mengubah rotasi dari [0..9]. The 0dihapus dalam l[1:i]dan tidak ada kebutuhan untuk byte nol yang mengambil dua characaters ( \0) untuk mewakili dalam sebuah objek byte.

55 byte

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


@ JoKing Pintar, terima kasih
dylnan

4

Jelly , 9 8 byte

9Rṙ`s3ZẎ

Cobalah 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

Batch, 84 byte

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

Menggunakan output @ Mnemonic. calldigunakan untuk menginterpolasi variabel ke dalam operasi slicing (biasanya hanya menerima konstanta numerik).



4

Perl 6 , 40 32 27 byte

-5 byte berkat nwellnhof

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

Cobalah online!

Blok kode anonim yang mengembalikan matriks 9x9. Peta setiap baris ke rotasi berbeda dari rentang 1 hingga 9.


4

J , 18 byte

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

Cobalah online!

Keluaran

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

Bagaimana itu bekerja

>:(,&|:|."{,)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

Versi mewah, 23 byte

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

Cobalah online!

Keluaran:

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

Bagaimana itu bekerja

|.&(>: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 byte

8ÝΣ3%}ε9Ls._

-2 byte dengan menciptakan pelabuhan @Mnemonic 's Pyth jawabannya .

Cobalah online. (Footer ditambahkan ke cukup-cetak saja. Hasil sebenarnya adalah matriks 9x9; jangan ragu untuk menghapus footer untuk melihatnya.)

Penjelasan:

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

Solusi 14 byte asli :

9Lε9LN3*N3÷+._

Cobalah online. (Footer ditambahkan ke cukup-cetak saja. Hasil sebenarnya adalah matriks 9x9; jangan ragu untuk menghapus footer untuk melihatnya.)

Penjelasan:

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

Kedua jawaban menghasilkan Sudoku:

123456789
456789123
789123456
234567891
567891234
891234567
345678912
678912345
912345678

4

Oktaf & Matlab, 50 48 29 byte

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

Cobalah online!

Terima kasih kepada Johnathon Frech

-14 Terima kasih atas saran tambahan Siaran Sanchises, yang juga menunjukkan ketidaksesuaian.

-5 dengan memperhatikan bahwa vektor dapat ditulis dalam matlab dengan string char dan transposisi.

Apakah intuitif, sekarang tidak demikian. Menggunakan penjumlahan siaran untuk menyebarkan 1: 9 di atas 9 baris, disebarkan oleh nilai yang ditentukan oleh string char.

Papan Sudoku diproduksi:

 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

Halo dan selamat datang di PPCG; posting pertama yang bagus.
Jonathan Frech


Tentu saja, s dapat didefinisikan dalam matriks itu sendiri. Saya harus salah menghitung byte juga.
Poptimist

Ini sekarang Oktaf, tidak lagi kompatibel dengan MATLAB. Jika suka, Anda dapat menggunakan ikon rantai kecil di bagian atas tautan Jonathan untuk menyalin rekatkan format PPCG default.
Sanchises

Jika suka, Anda bisa mendapatkan ini hingga 34 byte dengan tambahan siaran: Coba online!
Sanchises


3

Java 10, 82 75 byte

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

-7 byte dengan membuat port dari salah satu jawaban Python 2 @TFeld .

Cobalah online.

Penjelasan:

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

Output sudoku berikut (ruang dibatasi bukan baris baru seperti di bawah ini):

876543219
543219876
219876543
765432198
432198765
198765432
654321987
321987654
987654321

2

Python - 81 byte

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

Cobalah secara Online

Saya suka memiliki 81 byte, tetapi setelah beberapa mengoptimalkan :(

Python 2 - 75 68 59 58 byte

-7 byte berkat @DLosc

-9 byte berkat @Mnemonic

-1 byte berkat @JoKing

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

Cobalah secara Online


2
81 byte Skor sempurna! : D
DJMcMayhem

@DJMcMayhem Saya sedang mempertimbangkan untuk membuatnya lebih singkat dengan melakukan r=range(1,10)tetapi saya tidak bisa merusak keindahan
Don Thousand


@Dosc Ooh penggunaan kembali pintarl
Don Thousand

Jika Anda tidak keberatan dengan Python 2, Anda dapat mengeluarkan paren dari cetakan dan menghapus daftar kemasan.


2

R , 54 byte

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

Keluaran:

[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

Cobalah online!





1

C (dentang) , 65 byte

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

Fungsi sekarang dapat digunakan kembali

Cobalah online!


Alih-alih mencetak byte NUL untuk memisahkan digit Anda, Anda bisa menggunakan karakter tab pada jumlah byte yang sama.
Jonathan Frech

"Kiriman Anda tidak harus selalu menampilkan papan yang sama setiap kali. Tetapi jika beberapa keluaran dimungkinkan, Anda harus membuktikan bahwa setiap keluaran yang memungkinkan adalah papan yang valid." Itu tidak mengatakan bahwa beberapa output diperlukan. @ceilingcat
Logern

1
@ Logern Aturan yang dimaksud adalah bahwa pengiriman fungsi harus dapat digunakan kembali . Tidak apa-apa jika f(); f()mengeluarkan papan yang sama dua kali, tetapi tidak jika panggilan kedua tidak bekerja sama sekali.
Anders Kaseorg


61 byte, menggabungkan saran dari @ 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 byte

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

Cobalah online!

Jawaban pertama dalam ngn / k, dilakukan dengan bantuan besar dari pria itu sendiri, @ngn.

Bagaimana:

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

1

Japt, 11 , 10 byte

9õ ñu3
£éX

Cobalah atau verifikasi outputnya


Penjelasan

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

0

Arang , 14 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Menggunakan output @ Mnemonic. Penjelasan:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.