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!

DJMcMayhem
sumber
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.

sumber
11: m.<S9d%D3 9.
Tn. Xcoder
Lintas yang keluar, 10: .<LS9%D3 9.
Tn. Xcoder
Mungkin ingin memperbarui tautan ( tio )
bryc
12

Python 2 , 47 byte

l=range(1,10)
for x in l:print(l*9)[x*8/3:][:9]

Cobalah online!

Tidak
sumber
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'
BradC
sumber
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]
TFeld
sumber
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])
dylnan
sumber
55 byte
Jo King
@ 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.
dylnan
sumber
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).

Neil
sumber
4

JavaScript (Node.js) , 47 byte

Output sebagai array dari baris.

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

Cobalah online!

Buat ini:

472583691
583691472
691472583
725836914
836914725
914725836
258369147
369147258
147258369

Shieru Asakoto
sumber
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.

Jo King
sumber
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
Bubbler
sumber
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
Kevin Cruijssen
sumber
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
Poptimist
sumber
Halo dan selamat datang di PPCG; posting pertama yang bagus.
Jonathan Frech
48 byte .
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

Haskell , 41 byte

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

Cobalah online!

Curtis Bechtel
sumber
Ini tidak valid Setiap kotak berisi beberapa nomor yang sama. Anda bisa melakukan sesuatu seperti ini (43 byte) sebagai gantinya
Jo King
Terima kasih! Saya menerima saran Anda
Curtis Bechtel
@RushabhMehta saya lakukan. Itu 43 byte tapi saya menghapus s=karena tidak perlu
Curtis Bechtel
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
Kevin Cruijssen
sumber
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

Don Thousand
sumber
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
68 byte ;)
DLosc
@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!

DobromirM
sumber
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!

Logern
sumber
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
63 byte
Jo King
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
J. Sallé
sumber
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
Shaggy
sumber
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
Neil
sumber