Finder Sudoku ที่ไม่เหมือนใคร


19

ท้าทาย:

ให้บอร์ด Sudoku บนอินพุตมาตรฐานค้นหาจำนวนขั้นต่ำที่เพิ่มเข้ามาเพื่อทำให้กระดานไม่ซ้ำใคร

ข้อมูลจำเพาะ / กฎ:

  • อินพุตถูกจัดรูปแบบดังนี้ (ช่องว่างทั้งหมดมีความสำคัญ)

    516|827|943
    278|394|615
    349|615|872
    ---+---+---
    98 |4 2|156
    465|189|237
    12 |5 6|489
    ---+---+---
    892|743|561
    634|951|728
    751|268|394
    
  • เอาต์พุตถูกจัดรูปแบบด้วยหนึ่งหมายเลขต่อบรรทัดจัดรูปแบบเช่น(x,y):z- x และ y เริ่มจากหนึ่งที่มุมบนซ้ายและเพิ่มลงและขวา; z คือหมายเลขที่จะเพิ่ม

    • ในกรณีนี้ทั้งหมดเหล่านี้จะเป็นผลที่ถูกต้อง: (3,4):3, (3,4):7, (5,4):3, (5,4):7, (3,6):3, (3,6):7, (5,6):3และ(5,6):7เป็นหนึ่งในเหล่านี้จะช่วยให้คณะกรรมการที่จะได้รับการแก้ไข
  • หากมีการป้อนบอร์ด Sudoku ที่ไม่เหมือนใคร / แก้ไขโปรแกรมไม่ควรพิมพ์อะไรแม้แต่บรรทัดใหม่
  • โปรแกรมควรรันในบอร์ดน้อยกว่าหนึ่งชั่วโมง (ฉันแนะนำให้ทดสอบโดยใช้บอร์ดเปล่าหรือกระดานที่มีตัวเลขสุ่มหนึ่งอันอยู่บนมัน ... )

เกณฑ์การให้คะแนน:

  • ใช้ขนาดรหัสทั้งหมด (ตีกอล์ฟ) เป็นตัวอักษรรวมถึงช่องว่างทั้งหมด ...

โบนัส:

ขนาดรหัส 1/2 : หากโปรแกรมพิมพ์เครื่องหมายอัศเจรีย์และหยุดลงเมื่อมีบอร์ดที่ไม่มีวิธีแก้ไข

ขนาดโค้ด 1/2 : หากโปรแกรมพิมพ์เครื่องหมายอัศเจรีย์สองตัวและหยุดเมื่อมีบอร์ดที่ป้อนความขัดแย้งภายใน (ตัวเลขสองตัวเหมือนกันในแถว / คอลัมน์ / ตารางเดียวกัน)


3
น่าเบื่อและอาจเป็นเรื่องยาก :(
Oleh Prypin

6
หุยฮา 'ไม่พิมพ์อะไรเลยแม้แต่บรรทัดใหม่' ออกกฎ GolfScript
ปีเตอร์เทย์เลอร์

1
ซูโดกุแก้ที่ไม่เคยต้องการที่จะ BACKTRACK / เดาสำหรับการแก้ปัญหาอย่างเต็มรูปแบบเป็นสิ่งจำเป็นสำหรับนี้ (และแต่ละครั้งที่ "เดา" เป็นสิ่งจำเป็นผลผลิตมัน)
วงล้อประหลาด

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

คำตอบ:


10

Brachylog , 245 bytes / 2 = 122.5

@n:1a:"-"x:7fF:3a$\:3a@3:4a,Fc~bCh[0:0:0]gO,Co~c[V:O:T]h:F:6f:10ao:ba(h:11a;!);"!!"w!
h"-".|:"|"x:2f.
e(~m["0123456789":.]`;0<.<=9)
:ha#d.
:@3az:ca:5a.
:3a.
hs.:=a,?t:9ac:=fl1
:Im:8f:[[I]]z:ca.
:Jm:J.
:ha.
lg:?c.
b:+a[X:Y],?h:Y:Xr:"(~d,~d):~d
"w

(โปรดทราบว่าคุณต้องใช้รุ่นภาษาที่ใช้ในการกระทำนี้รหัสนี้จะต้องมีการเปลี่ยนแปลงเล็กน้อยเพื่อให้สามารถทำงานได้อย่างถูกต้องใน Brachylog รุ่นต่อไปนี้)

สิ่งนี้จะพิมพ์ออกมา"!!"ถ้าบอร์ดที่ได้รับนั้นมีความขัดแย้งภายใน (ซึ่งใช้เวลาสองสามวินาทีในกรณีนั้นอย่างไรก็ตามใน TIO ดังนั้นโปรดอดทนรอ)

ฉันไม่แน่ใจว่าฉันเข้าใจโบนัสแรกอย่างถูกต้องดังนั้นฉันจึงไม่ได้พูดถึงมัน

เห็นได้ชัดว่านี่ไม่ใช่การแข่งขันเนื่องจากภาษานี้มีความทันสมัยมากกว่าความท้าทายอย่างไรก็ตามเนื่องจากไม่มีคำตอบอื่น ๆ ฉันไม่แน่ใจว่าเรื่องนี้จะเกิดขึ้นมากมาย ...

คำอธิบาย

  • ภาคแสดงหลัก:

    @n                Split the input on line breaks
    :1a:"-"x          Transform into a list of lists, each sublist contains a line's values
    :7fF              Transform so that cells are [Value:X:Y]
    :3a               All values on lines must be different
    $\:3a             All values on columns must be different (by transposition)
    @3:4a,            All 3*3 block values must be different
    Fc~bCh[0:0:0]gO,  Append a fake cell [0:0:0]
    Co~c[V:O:T]       Sort the board, the blank cells V will be those before O ([0:0:0])
    h:F:6f            Find all subsets of blank cells with specific values for which 
                          the board has only one solution
    :10ao             Sort the subsets by lengths
    :ba               Discard the lengths
    (                 
      h:11a             Print the first subset = an answer
    ;                 Or (board is already fully determined)
      !                 Terminate
    )          
    ;                 Or (Some values don't respect the constraints)
    "!!"w!            Print "!!" and terminate
    
  • คำกริยาที่ 1: ลบ "" ทั้งหมด|ในบรรทัดเปลี่ยน---+---+---เป็น-ลบออกหลังจาก

    h"-".    If the first char is "-", then Output is "-"
    |        Or
    :"|"x    Remove all occurences of "|" from the input
    :2f.     Output is the result of all outputs of predicate 2 on the filtered string
    
  • เพรดิเคต 2: แปลงถ่านหนึ่งตัวเป็นจำนวนเต็มหรือถ้าว่างกับตัวแปรระหว่าง 1 ถึง 9

    e                      Take a char of the input string
    (
      ~m["0123456789":.]     Output is the index of the char in "0123456789"
      `                      Discard the choice point caused by the ;
    ;                      Or
      0<.<=9                 Output is an integer between 1 and 9
    )
    
  • ภาคที่ 3: กำหนดว่าค่าทั้งหมดของรายการอินพุตของเซลล์ต้องแตกต่างกัน

    :ha    Retrieve the head of each cell (i.e. the value) in the input 
    #d.    Apply a constraint of distinctness to those values
    
  • ภาคที่ 4: ใช้ข้อ จำกัด ของความแตกต่างกับค่าในบล็อค 3 * 3

    :@3a            Split 3 lines of the board in 3 parts
        z           Zip them together
         :ca:5a.    Concatenate each element of the zip, apply predicate 5 to that
    
  • คำกริยา 5:

    :3a.    Apply predicate 3 to each element of the input
    
  • คำกริยาที่ 6: กำหนดค่าที่สอดคล้องกับข้อ จำกัด ของเซตย่อยของเซลล์ว่างจากนั้นค่าเหล่านั้นจะมีทางออกเดียวสำหรับบอร์ด

    hs.       Output is a subset of the blank cells
    :=a,      Assign values to those cells
    ?t:9ac    Concatenate the values of all cells of the board
    :=f       Find all solved boards
    l1        There is only 1 such solved board
    
  • ภาคที่ 7: แปลงบอร์ดแบบนี้ให้แต่ละเซลล์[V:X:Y]แทนตอนนี้เท่านั้นV(ค่า)

    :Im       Take the Ith line of the board
    :8f       Transform all elements of the line using predicate 8
    :[[I]]z   Zip the result with [I]
    :ca.      Concatenate each element of the zip
    
  • กริยาที่ 8: [V:X]การแปลงสายดังกล่าวว่าแต่ละเซลล์อยู่ในขณะนี้

    :Jm    Take the Jth element of the line
    :J.    Output is [That element:J]
    
  • ภาคที่ 9: ดึงค่าของเซลล์

    :ha.   Take the head of each element of the input
    
  • ภาคที่ 10: ผนวกความยาวของเซตย่อยที่จุดเริ่มต้นของมัน

    lg     Put the length of the input in a list
    :?c.   Concatenate it with the input
    
  • ภาคที่ 11: พิมพ์หนึ่งเซลล์

    b:+a[X:Y],        Increment coordinates by 1 to get X and Y
    ?h:Y:Xr:          Build the list [X:Y:Value]
    "(~d,~d):~d\n"w   Format that list as "('X','Y'):'Value'\n" to STDOUT
    

2
คุณไม่สามารถขยายสิ่งนี้เป็นคำตอบของอารัมภบทได้หรือไม่? ถ้าอย่างนั้นก็จะแข่งขัน! (คุณสามารถโพสต์แยกต่างหาก) ฉันไม่แน่ใจว่าการจับคู่ระหว่าง Brachylog กับ Prolog เป็นอย่างไร
Lynn

@ ลินน์ใช่ฉันทำได้ฉันยังสามารถโพสต์รหัส Prolog ที่สร้างโดย transpiler ของ Brachylog (ซึ่งจะไม่ได้รับความนิยมอย่างมาก) ฉันจะไม่ทำเพราะฉันค่อนข้างมั่นใจว่าโปสเตอร์ของความท้าทายจะไม่กลับมาตอบคำตอบต่อไป: p
Fatalize
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.