Y-Wing Strategy สำหรับ Sudoku


11

ฉันเพิ่งได้แอป Sudoku ใหม่ที่ผลิตยากของ Sudoku ซึ่งไม่สามารถแก้ไขได้ด้วยกลยุทธ์มาตรฐาน ดังนั้นฉันต้องเรียนรู้ใหม่ ๆ หนึ่งในกลยุทธ์เหล่านี้เป็นY-Wing กลยุทธ์ มันถูกจัดอันดับภายใต้ "กลยุทธ์ที่ยากลำบาก" แต่จริงๆแล้วมันไม่ได้ยากขนาดนั้น

ตัวอย่าง

สำหรับกลยุทธ์นี้มีเพียง 4 เซลล์เท่านั้นที่มีความสำคัญ ดังนั้นฉันจึงไม่สนใจเซลล์อื่นทั้งหมดในภาพ

เราดูผู้สมัครทั้งหมดสำหรับแต่ละเซลล์ ในตัวอย่างต่อไปนี้เรามีมือถือที่มีผู้สมัครที่3 7(นั่นหมายความว่าเราได้ปฏิเสธไปแล้วผู้สมัคร1 2 4 5 6 8 9เช่นเพราะมี1ในแถวเดียวกัน2ในเดียวกันกล่อง 3x3, ... ), มือถือที่มีผู้สมัคร6 7, เซลล์ที่มีตัวเลือก3 6และเซลล์ที่มีตัว2 6เลือก กลยุทธ์ Y-Wing จะแนะนำว่า6สามารถลบออกจากผู้สมัครของเซลล์อย่างจริงจังปล่อยให้เป็นเพียง2ผู้สมัครซึ่งคุณสามารถกรอกดังนั้นเราจึงพบจำนวนที่ถูกต้องและเป็นหนึ่งในการแก้ซูโดกุเต็มขั้น

ตัวอย่างแรก

ทำไมถึง6ถูกลบ?

คำอธิบาย

ขอให้เราสมมติว่า6จำนวนที่ถูกต้องสำหรับเซลล์อย่างจริงจัง ขณะนี้มี6คอลัมน์อยู่ในคอลัมน์นี้ดังนั้นเราจึงสามารถลบออก6จากผู้สมัครของเซลล์ด้านบนขวาเหลือเพียง a 7ซึ่งเราสามารถกรอกได้สิ่งเดียวกันนี้เกิดขึ้นกับเซลล์ด้านซ้าย เราสามารถลบและกรอกข้อมูลใน6 3ตอนนี้ถ้าเราดูที่เซลล์ด้านบนซ้ายเราจะได้รับความขัดแย้ง เพราะตอนนี้มีอยู่แล้ว7ในแถวเดียวกันและ3ในคอลัมน์เดียวกันเพื่อให้เราสามารถลบ7และ3ของผู้สมัครออกจากผู้สมัครที่ไม่ทั้งหมด ซึ่งเห็นได้ชัดว่าเป็นไปไม่ได้ ดังนั้น 6 ไม่สามารถเป็นจำนวนที่ถูกต้องของเซลล์อย่างจริงจัง

แม่นยำยิ่งขึ้น: หากเรามี 4 เซลล์พร้อมผู้สมัคร[A B] [A C] [C D] [B C](ตามลำดับนี้หรือหมุนเป็นวงกลม) และเซลล์เชื่อมต่อ (ผ่านแถวเดียวกันคอลัมน์เดียวกันหรือกล่อง 3x3 เดียวกัน) ในวงกลม (เซลล์ 1 เชื่อมต่อกับเซลล์ 2 ซึ่งเป็น เชื่อมต่อกับเซลล์ 3 ซึ่งเชื่อมต่อกับเซลล์ 4 ซึ่งเชื่อมต่อกับเซลล์ 1) กว่าที่คุณสามารถลบออกCจาก[C D]เซลล์ได้ มันเป็นสิ่งสำคัญที่สามเซลล์[A B], [A C]และ[B C]มีเพียงสองผู้สมัครแต่ละคน แตกต่างกันเซลล์[C D]ซึ่งอาจมีมากกว่าหรือน้อยกว่า ( Dอาจเป็นศูนย์หนึ่งหรือมากกว่าหนึ่งผู้สมัคร)

ตัวอย่างด้วยตัวอักษรแทนตัวเลข

สังเกตว่าฉันบอกอย่างชัดเจนว่าพวกเขาสามารถเชื่อมต่อได้ทั้งสองทาง ในตัวอย่างถัดไปคุณสามารถดูกลยุทธ์ที่ใช้อีกครั้ง แต่คราวนี้ 4 เซลล์ไม่ได้เป็นรูปสี่เหลี่ยมผืนผ้า เซลล์ด้านซ้ายและด้านขวานั้นเชื่อมต่อกันเพราะมันอยู่ในกล่อง 3x3 เดียวกัน Y-Wing กล่าวว่าเราสามารถลบ1ผู้สมัครในฐานะเซลล์ด้านบนซ้ายออกได้ เวลานี้ยังมีผู้สมัคร 2 คนในเซลล์นี้ที่เหลือดังนั้นเราจึงไม่พบหมายเลขที่ถูกต้องใหม่ แต่ถึงกระนั้นการกำจัดของ1สามารถเปิดประตูไปสู่กลยุทธ์ที่แตกต่างกัน

ตัวอย่างที่สองไม่ใช่ในรูปสี่เหลี่ยมผืนผ้า

หากท่านต้องการข้อมูลเพิ่มเติมเกี่ยวกับกลยุทธ์หรือต้องการตัวอย่างอีกไม่กี่เยี่ยมชมsudokuwiki.org

ข้อมูลจำเพาะของความท้าทาย

คุณจะได้รับ 4 รายการเป็นอินพุตซึ่งแสดงถึงตัวเลือกของเซลล์ สี่เซลล์เชื่อมต่อกันเป็นวงกลม (เซลล์ 1 เชื่อมต่อกับเซลล์ 2 ซึ่งเชื่อมต่อกับเซลล์ 3 ซึ่งเชื่อมต่อกับเซลล์ 4 ซึ่งเชื่อมต่อกับเซลล์ 1) คุณสามารถสมมติว่าแต่ละรายการเรียงลำดับจากน้อยไปมาก

งานของคุณคือการลบผู้สมัครหนึ่งคน (โดยใช้กลยุทธ์ Y-Wing) และส่งคืนรายการผู้สมัครที่ได้รับตามลำดับเดียวกัน หากคุณไม่สามารถใช้กลยุทธ์ได้ให้ส่งคืนรายการผู้สมัครที่เหมือนกัน

หากมีสองวิธีที่เป็นไปได้ (คุณสามารถลบ A ของเซลล์ B หรือลบ C ของเซลล์ D) ได้แทนที่จะส่งคืนเพียงโซลูชันเดียว มันไม่สำคัญหรอก

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

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

[3 7] [6 7] [2 6] [3 6]       => [3 7] [6 7] [2] [3 6]   # Example 1
[6 7] [2 6] [3 6] [3 7]       => [6 7] [2] [3 6] [3 7]   # Example 1, different order
[2 6] [3 6] [3 7] [6 7]       => [2] [3 6] [3 7] [6 7]   # Example 1, different order
[3 6] [3 7] [6 7] [2 6]       => [3 6] [3 7] [6 7] [2]   # Example 1, different order
[1 2 8] [1 8] [8 9] [1 9]     => [2 8] [1 8] [8 9] [1 9] # Example 2
[3 8] [4 8] [3 4 8] [3 4]     => [3 8] [4 8] [3 8] [3 4]
[1 3 6 7 8] [3 8] [3 4] [4 8] => [1 3 6 7] [3 8] [3 4] [4 8]
[7 8] [7 8] [4 7] [4 8]       => [7 8] [8] [4 7] [4 8] or [7] [7 8] [4 7] [4 8]
[4 7] [7 8] [4 8] [4]         => [4 7] [7 8] [4 8] []    # Fictional example
[3 7] [2 6] [6 7] [3 6]       => [3 7] [2 6] [6 7] [3 6] # Y-Wing can't be applied here
[4 7] [2 7 8] [4 8] [1 4]     => [4 7] [2 7 8] [4 8] [1 4] # -||-

ชุดจำนวนมากในอินพุตเดียวสามารถเหมือนกันได้หรือไม่?
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ใช่เช่นในกรณีทดสอบครั้งที่ 8 7 8เป็นตัวเลือกสำหรับเซลล์แรกและเซลล์ที่สอง ยังสามารถใช้กลยุทธ์ Y-Wing ได้
Jakube

@ Jakube อาโอเคไม่เห็นว่า
เครื่องมือเพิ่มประสิทธิภาพ

หากเป็นไปได้มากกว่า 1 วิธีฉันสามารถส่งออกหนึ่งในนั้นได้หรือไม่
เครื่องมือเพิ่มประสิทธิภาพ

ใช่ฉันชี้แจงในคำถาม
Jakube

คำตอบ:


3

CJam, 90 ไบต์

ใช่แล้วมันยาวเกินไปเพราะข้อ จำกัด ที่อีก 3 เซลล์ควรมีเพียง 2 ตัวเท่านั้น

l~_:_(a+2/::&_{,}$2>:&:Y;{:PY&Y{P1<}?~}%:X,3>1${,}$W=_,2>\Y&,1?*{X:_(+2/{~:I=}#)_2$=I-t}&p

สิ่งนี้คาดว่าอินพุตเป็นรายการของรายการในรูปแบบ CJam ตัวอย่างเช่น:

[[2 6] [3 6] [3 7] [6 7]]

ให้ผลลัพธ์ในรายการรูปแบบรายการของ CJam:

[[2] [3 6] [3 7] [6 7]]

จะเพิ่มคำอธิบายเมื่อฉันเล่นกอล์ฟเสร็จแล้ว ..

ลองมันออนไลน์ได้ที่นี่หรือลองใช้ชุดทดสอบทั้งหมดที่นี่


3

Mathematica, 124 110 ไบต์

Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])&

ตัวอย่าง:

In[1]:= yWing = Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])& ;

In[2]:= yWing[{{3, 7}, {6, 7}, {2, 6}, {3, 6}}]

Out[2]= {{3, 7}, {6, 7}, {2}, {3, 6}}

In[3]:= yWing[{{4, 7}, {7, 8}, {4, 8}, {4}}]

Out[3]= {{4, 7}, {7, 8}, {4, 8}, {}}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.