เอาท์พุทบอร์ด Sudoku


25

ความท้าทายในวันนี้เป็นเรื่องง่าย: โดยไม่ต้องป้อนข้อมูลใด ๆ ออกบอร์ดซูโดกุที่ถูกต้องใด ๆ

ในกรณีที่คุณไม่คุ้นเคยกับซูโดกุWikipedia จะอธิบายว่ากระดานที่ถูกต้องควรมีลักษณะอย่างไร :

วัตถุประสงค์คือการเติมตาราง 9x9 ด้วยตัวเลขเพื่อให้แต่ละคอลัมน์แต่ละแถวและแต่ละ subgrids เก้า 3 × 3 ที่ประกอบด้วยตาราง (เรียกอีกอย่างว่า "กล่อง", "บล็อก" หรือ "ภูมิภาค") ประกอบด้วย ตัวเลขทั้งหมดตั้งแต่ 1 ถึง 9

ตอนนี้ที่นี่คือสิ่งที่ ... มี6.670.903.752.021.072.936.960 ที่แตกต่างกันกระดานซูโดกุที่ถูกต้อง บางตัวอาจบีบอัดและส่งออกได้ยากในจำนวนไบต์น้อย คนอื่นอาจจะง่ายกว่า ส่วนหนึ่งของความท้าทายนี้คือการหาว่าบอร์ดใดที่สามารถบีบอัดได้มากที่สุดและสามารถแสดงผลได้ในจำนวนไบต์ที่น้อยที่สุด

การส่งของคุณไม่จำเป็นต้องแสดงผลบอร์ดเดียวกันทุกครั้ง แต่ถ้าเป็นไปได้หลายเอาต์พุตคุณจะต้องพิสูจน์ว่าทุกผลลัพธ์ที่เป็นไปได้คือบอร์ดที่ถูกต้อง

คุณสามารถใช้สคริปต์นี้ (ขอบคุณ Magic Octopus Urn) หรือคำตอบใด ๆ เหล่านี้เพื่อตรวจสอบว่ากริดใดเป็นโซลูชันที่ถูกต้อง มันจะส่งออก[1]สำหรับบอร์ดที่ถูกต้องและสิ่งอื่นใดสำหรับบอร์ดที่ไม่ถูกต้อง

ฉันไม่จู้จี้เกินไปกับรูปแบบที่คุณส่งคำตอบของคุณตราบใดที่มันชัดเจนเป็นสองมิติ ตัวอย่างเช่นคุณสามารถส่งออกเมทริกซ์ 9x9, เมทริกซ์ 3x3 เก้าชุด, สตริง, อาร์เรย์ของสตริง, อาร์เรย์ของจำนวนเต็ม 9 หลักหรือตัวเลข 9 หลักพร้อมตัวคั่น ไม่อนุญาตให้ส่งออก 81 หลักใน 1 มิติ หากคุณต้องการทราบเกี่ยวกับรูปแบบผลลัพธ์เฉพาะโปรดถามฉันในความคิดเห็น

ตามปกตินี่คือดังนั้นเขียนคำตอบสั้น ๆ ที่คุณสามารถทำได้ด้วยภาษาที่คุณเลือก!


เราสามารถแสดงเมทริกซ์ 3x9 สามตัวได้หรือไม่? แต่ละแถวของแต่ละ submatrix แสดงถึงแถวหนึ่งในกระดานซูโดกุ เช่นนี้
dylnan

2
เกี่ยวข้อง แต่ไม่ซ้ำกัน นอกจากนี้หากคุณอนุญาตให้ใช้เอาต์พุตที่ยืดหยุ่นฉันไม่แน่ใจว่าใช้kolmogorov-complexเพราะปกติแล้วสำหรับเอาต์พุตคงที่เช่น ascii art
BradC

คำตอบ:


13

Pyth, 22 14 12 10 ไบต์

.<LS9%D3 9

บันทึก 2 ไบต์ต้องขอบคุณ Mr. Xcoder

ลองที่นี่

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

m.<S9d%D3 911:
Mr. Xcoder

ข้ามออกที่ .<LS9%D3 910:
Mr. Xcoder

อาจต้องการอัปเดตลิงก์ ( tio )
bryc


8

T-SQL, 96 89 ไบต์

พบหนึ่งสั้นกว่าเอาท์พุทเล็กน้อย!

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

แยกสตริง 9 อักขระเริ่มต้นที่จุดต่าง ๆ ตามที่กำหนดโดยตารางในหน่วยความจำที่สร้างโดยSTRING_SPLIT(ซึ่งรองรับใน SQL 2016 และใหม่กว่า) 0+valueเป็นวิธีที่สั้นที่สุดที่ฉันสามารถทำการแปลงค่าโดยนัยเป็นจำนวนเต็ม

เอาท์พุทเล็กน้อยดั้งเดิม (96 ไบต์):

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



5

Python 3 , 58 55 ไบต์

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

ลองออนไลน์!

  • -3 ไบต์ขอบคุณ Jo King

องค์ประกอบของสตริงไบต์ท้ายให้ตัวเลขที่ใช้ในการเปลี่ยนรูปการหมุนของ[1, 4, 7, 2, 5, 8, 3, 6, 9] จะถูกลบออกในและไม่มีความจำเป็นสำหรับไบต์โมฆะซึ่งจะใช้เวลาสอง characaters ( ) เพื่อเป็นตัวแทนในไบต์วัตถุ[0..9]0l[1:i]\0

55 ไบต์

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


@JoKing ฉลาดขอบคุณ
dylnan

4

เยลลี่ , 9 8 ไบต์

9Rṙ`s3ZẎ

ลองออนไลน์!

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

แบตช์ 84 ไบต์

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

ใช้เอาต์พุตของ @ Mnemonic callใช้เพื่อสอดแทรกตัวแปรในการดำเนินการแบ่งส่วน (โดยปกติจะยอมรับเฉพาะค่าคงที่ตัวเลขเท่านั้น)



4

Perl 6 , 40 32 27 ไบต์

-5 ไบต์ขอบคุณ nwellnhof

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

ลองออนไลน์!

บล็อกโค้ดไม่ระบุชื่อที่ส่งคืนเมทริกซ์ 9x9 แม็พแต่ละแถวกับการหมุนที่แตกต่างกันของช่วง 1 ถึง 9


4

J , 18 ไบต์

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

ลองออนไลน์!

เอาท์พุต

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

มันทำงานอย่างไร

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

เวอร์ชั่นแฟนซี 23 ไบต์

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

ลองออนไลน์!

เอาท์พุท:

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

มันทำงานอย่างไร

|.&(>: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 ไบต์

8ÝΣ3%}ε9Ls._

-2 ไบต์โดยการสร้างพอร์ตของ@Mnemonic 's คำตอบ

ลองออนไลน์ (ส่วนท้ายถูกเพิ่มลงในพิมพ์สวยผลที่แท้จริงคือเมทริกซ์ 9x9 รู้สึกอิสระที่จะลบส่วนท้ายเพื่อดู)

คำอธิบาย:

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

ฉบับที่ 14 โซลูชันขนาดไบต์ :

9Lε9LN3*N3÷+._

ลองออนไลน์ (ส่วนท้ายถูกเพิ่มลงในพิมพ์สวยผลที่แท้จริงคือเมทริกซ์ 9x9 รู้สึกอิสระที่จะลบส่วนท้ายเพื่อดู)

คำอธิบาย:

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

ทั้งสองคำตอบส่งผลให้ Sudoku:

123456789
456789123
789123456
234567891
567891234
891234567
345678912
678912345
912345678

4

Octave & Matlab, 50 48 29 ไบต์

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

ลองออนไลน์!

-2 ต้องขอบคุณ Johnathon frech

-14 ขอบคุณคำแนะนำเพิ่มเติมจาก Sanchises Broadcast ซึ่งยังชี้ให้เห็นถึงความไม่เข้ากันได้

-5 โดยสังเกตว่าเวกเตอร์สามารถเขียนใน MATLAB ด้วยอักขระถ่านและการขนย้าย

ใช้งานง่ายตอนนี้ไม่เป็นเช่นนั้น ใช้การรวมการออกอากาศเพื่อกระจาย 1: 9 บน 9 แถวกระจายตามค่าที่กำหนดโดยสตริงอักขระถ่าน

ผลิต Sudoku board แล้ว:

 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

สวัสดีและยินดีต้อนรับสู่ PPCG; โพสต์แรกที่ดี
Jonathan Frech

48 ไบต์
Jonathan Frech

แน่นอนว่า s สามารถนิยามได้ในเมทริกซ์เอง ฉันต้องทำไบต์ให้ผิดเช่นกัน
Poptimist

ตอนนี้เป็นระดับแปดเสียงไม่รองรับ MATLAB อีกต่อไป หากคุณต้องการคุณสามารถใช้ไอคอนลูกโซ่เล็ก ๆ ที่ด้านบนของลิงค์ของ Jonathan เพื่อคัดลอกวางการจัดรูปแบบ PPCG เริ่มต้น
Sanchises

หากต้องการคุณสามารถลดขนาดได้ถึง 34 ไบต์ด้วยการเพิ่มการออกอากาศ: ลองออนไลน์!
Sanchises

3

Haskell , 41 ไบต์

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

ลองออนไลน์!


สิ่งนี้ไม่ถูกต้อง แต่ละตารางมีหลายจำนวนเท่ากัน คุณสามารถทำสิ่งนี้ (43 bytes)แทน
Jo King

ขอบคุณ! ฉันรับข้อเสนอแนะของคุณ
เคอร์ติสเบคเทล

@RushabhMehta ฉันทำ มันเป็น 43 ไบต์ แต่ผมออกs=เพราะมันไม่จำเป็น
เคอร์ติเบคเทล

3

Java 10, 82 75 ไบต์

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

-7 ไบต์โดยการสร้างท่าเรือแห่งหนึ่งใน@TFeld 's งูหลาม 2 คำตอบ

ลองออนไลน์

คำอธิบาย:

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

ส่งออกซูโดกุต่อไปนี้ (คั่นด้วยช่องว่างแทนการขึ้นบรรทัดใหม่เหมือนด้านล่าง):

876543219
543219876
219876543
765432198
432198765
198765432
654321987
321987654
987654321

2

Python - 81 ไบต์

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

ลองออนไลน์

ฉันชอบมี 81 ไบต์ แต่หลังจากการเพิ่มประสิทธิภาพบาง :(

Python 2 - 75 68 59 58 ไบต์

-7 ไบต์ขอบคุณ @DLosc

-9 ไบต์ขอบคุณ @Mnemonic

-1 ไบต์ขอบคุณ @JoKing

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

ลองออนไลน์


2
81 bytesคะแนนสมบูรณ์แบบ! : D
DJMcMayhem

@DJMcMayhem ฉันกำลังพิจารณาที่จะทำให้มันสั้นลงโดยการทำr=range(1,10)แต่ฉันไม่สามารถทำลายความงาม
ดอนพัน


@DLosc Ooh นำมาใช้อย่างชาญฉลาดอีกครั้งl
Don Thousand

หากคุณไม่สนใจ Python 2 คุณสามารถแยกส่วนของการพิมพ์ออกและนำรายการบรรจุภัณฑ์ออกได้


2

R , 54 ไบต์

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

เอาท์พุท:

[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

ลองออนไลน์!


2

ขอบคุณมากที่ @Shaggy!

JavaScript (Node.js) , 61 ไบต์

t=>[...s='123456789'].map(e=>s.slice(t=e*3.3%9)+s.slice(0,t))

ลองออนไลน์!


1
บิตอย่างรวดเร็วของการเล่นกอล์ฟได้รับลงนี้63 ไบต์
ขนปุย

2
ขออภัย61 ไบต์ ; พลาดสนามกอล์ฟที่ชัดเจนอย่างน่างงงวย!
ขนด



1

C (เสียงดังกราว) , 65 ไบต์

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

ฟังก์ชันนี้สามารถนำกลับมาใช้ใหม่ได้

ลองออนไลน์!


แทนที่จะพิมพ์ NUL ไบต์เพื่อแยกตัวเลขของคุณคุณสามารถใช้อักขระแท็บที่จำนวนไบต์เดียวกัน
Jonathan Frech

"การส่งของคุณไม่จำเป็นต้องส่งออกบอร์ดเดียวกันทุกครั้ง แต่ถ้าเป็นไปได้หลายเอาต์พุตคุณจะต้องพิสูจน์ว่าทุกผลลัพธ์ที่เป็นไปได้คือบอร์ดที่ถูกต้อง" ไม่ได้บอกว่าจำเป็นต้องใช้เอาต์พุตหลายตัว @ceilingcat
Logern

1
@Logern คำถามที่พบบ่อยคือการส่งฟังก์ชั่นจะต้องนำมาใช้ซ้ำได้ ไม่เป็นไรถ้ามันf(); f()ออกบอร์ดเดียวกันสองครั้ง แต่ไม่ใช่ถ้าการเรียกครั้งที่สองไม่ทำงานเลย
Anders Kaseorg


61 ไบต์รวมคำแนะนำจาก @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 ไบต์

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

ลองออนไลน์!

คำตอบแรกใน ngn / k ทำได้ด้วยความช่วยเหลือจากผู้ชายเอง @ngn

วิธี:

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

ถ่าน 14 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ใช้เอาต์พุตของ @ Mnemonic คำอธิบาย:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.