ค้นหา Leapers


19

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

Leapersเป็นนางฟ้าหมากรุกทั่วไปของอัศวิน Leapers ถูกกำหนดค่าโดยสองจำนวนเต็มmและnและสามารถย้ายmกำลังสองในทิศทางเดียวและอีกnกำลังสองในทิศทางตั้งฉากทั้งสอง สำหรับอัศวินมาตรฐานเรามี(m, n) = (2, 1) การเคลื่อนไหวทั้งหมดถือเป็นการกระโดดครั้งเดียวโดยที่ไม่มีช่องสี่เหลี่ยมระหว่างทางไปยังเป้าหมายต้องว่างเปล่าหรือมีอยู่จริง

ความท้าทาย

คุณได้รับ "กระดานหมากรุก" ในรูปแบบของรายการจำนวนเต็ม 2D เชิงบวกซึ่งเป็นตัวแทนของกำลังสองที่เป็นส่วนหนึ่งของกระดาน งานของคุณคือการหา leaper ที่ได้รับเพียงพอย้ายสามารถเข้าถึงตารางใด ๆ บนกระดาน

ลองดูตัวอย่าง กระดานหมากรุกมาตรฐานใช้ตารางปกติของสี่เหลี่ยม 8x8 (โปรดทราบว่าเราไม่แยกความแตกต่างระหว่างสี่เหลี่ยมสีขาวและสีดำสำหรับความท้าทายนี้):

########
########
########
########
########
########
########
########

อัศวินมาตรฐานสามารถเข้าถึงได้ทั้งหมดดังนั้น(2, 1)จะเป็นผลลัพธ์ที่ถูกต้อง อย่างไรก็ตาม(1, 1)ตัวอย่างเช่นจะไม่ถูกต้องเนื่องจากชิ้นส่วนดังกล่าวสามารถเข้าถึงครึ่งหนึ่งของสี่เหลี่ยมไม่ว่าจะเริ่มต้นที่ใด (1, 0)ในทางกลับกันก็จะเป็นเอาท์พุทที่ถูกต้องเนื่องจากสี่เหลี่ยมทั้งหมดมีการเชื่อมต่อแบบ orthogonally

ตอนนี้ถ้าเรามีบอร์ดที่ผิดปกติเช่น:

#   #
 # # #
  # # #
 # #
    #

แล้วการแก้ปัญหาที่เป็นไปได้และ(1, 1) (3, 1)เรายังสามารถมีบอร์ดที่มีภูมิภาคที่ไม่ได้เชื่อมต่ออย่างสมบูรณ์เช่น

#### ####
#### ####
#### ####
#### ####

อัศวินมาตรฐาน(2, 1)ยังคงสามารถเข้าถึงสแควร์สทั้งหมดที่นี่ซึ่งในความเป็นจริงเป็นทางออกเดียว

และในที่สุดบอร์ดเรียบง่ายต่อไปนี้ไม่สามารถเข้าถึงได้อย่างสมบูรณ์โดย leaper ใด ๆ เลย:

#
 ##

โปรดทราบว่ารูปแบบการป้อนข้อมูลจะไม่เป็นการแทน ASCII แต่เป็นรายการของพิกัดแทน เช่นตัวอย่างที่สองด้านบนสามารถให้เป็น:

[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]]

กฎระเบียบ

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

พิกัดอินพุตสามารถนำมาใช้ในรูปแบบรายการที่สะดวก (ลิสต์แบบแบน, รายการคู่, รายการจำนวนเต็มเชิงซ้อน, สตริงที่มีตัวคั่นที่สอดคล้องกัน ฯลฯ )

เอาต์พุตควรเป็นจำนวนเต็มสองจำนวนmและnที่ระบุ leaper หากมีวิธีแก้ไขอยู่ (เป็นจำนวนเต็มสองรายการแยกกันรายการสตริงที่มีตัวคั่นที่ไม่ใช่ตัวเลข ฯลฯ ) หากไม่มีวิธีแก้ไขคุณอาจส่งออกค่าที่สอดคล้องกันซึ่งอาจเป็น leaper ที่ไม่ถูกต้อง ซึ่งรวมถึงคู่ของจำนวนเต็ม(0, 0)ในรูปแบบปกติของคุณรวมถึงสิ่งใดก็ตามที่ไม่ใช่คู่ที่ไม่ใช่เชิงลบ

โปรแกรมของคุณต้องการที่จะจัดการกับกรณีใดกรณีการทดสอบภายในหนึ่งนาที นี่เป็นข้อ จำกัด ที่ค่อนข้างคลุมเครือ แต่ใช้สามัญสำนึก: ถ้าใช้เวลา 2 นาทีในเครื่องของคุณฉันคิดว่าเราสามารถสันนิษฐานได้ว่ามันอาจจะทำงานภายใน 1 จากคนอื่น แต่ถ้าใช้ 20 ครั้งก็มีโอกาสน้อยกว่า ไม่ควรยากที่จะแก้ไขแต่ละกรณีทดสอบในเวลาไม่กี่วินาทีดังนั้นกฎนี้จะทำหน้าที่ออกกฎแรงเดรัจฉานไร้เดียงสาเท่านั้น

ใช้กฎมาตรฐานของ

กรณีทดสอบ

board => all valid leapersกรณีทดสอบแต่ละคนจะอยู่ในรูป โปรดจำไว้ว่าคุณจะต้องส่งออกอย่างใดอย่างหนึ่ง หากรายการ leapers ว่างเปล่าตรวจสอบให้แน่ใจว่าได้ส่งคืนสิ่งที่ไม่ใช่ leaper ที่ถูกต้อง

Examples above:
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7], [7, 8], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8]] => [[0, 1], [1, 2], [1, 4], [2, 3], [3, 4]]
[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]] => [[1, 1], [1, 3]]
[[1, 1], [2, 2], [3, 2]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => [[1, 2]]

Square boards:
[[1, 1], [1, 2], [2, 1], [2, 2]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [2, 3]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]] => [[0, 1], [1, 2], [2, 3]]

Miscellaneous:
[[1, 1], [2, 1]] => [[0, 1]]
[[1, 1], [1, 2]] => [[0, 1]]
[[1, 1], [12, 35]] => [[11, 34]]
[[1, 1], [1, 2], [2, 1], [2, 2], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 5], [3, 6], [4, 1], [4, 2], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [1, 4]]
[[2, 2], [2, 4], [2, 6], [2, 8], [4, 2], [4, 4], [4, 6], [4, 8], [6, 2], [6, 4], [6, 6], [6, 8], [8, 2], [8, 4], [8, 6], [8, 8]] => [[0, 2], [2, 4]]

Random boards:
[[1, 5], [1, 9], [2, 6], [2, 8], [2, 10], [2, 12], [3, 5], [3, 7], [3, 9], [3, 11], [3, 13], [4, 2], [4, 4], [4, 6], [4, 8], [4, 14], [5, 1], [5, 3], [5, 5], [5, 7], [6, 2], [6, 4], [7, 1], [8, 2]] => [[1, 1], [1, 3]]
[[1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 6], [3, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 3], [5, 4], [5, 6]] => [[0, 1], [1, 2]]
[[1, 8], [2, 6], [2, 10], [3, 3], [3, 4], [3, 8], [4, 1], [4, 11], [5, 3], [5, 9], [6, 12], [8, 11], [10, 10], [11, 12], [12, 6], [12, 8], [13, 6], [13, 8], [13, 10], [13, 11], [14, 5], [14, 7], [14, 8], [14, 13], [14, 14], [15, 7], [15, 9], [15, 11], [15, 12], [16, 6], [16, 7], [16, 9], [16, 13], [16, 14], [17, 10], [17, 12], [18, 8], [18, 12], [20, 9], [21, 11], [22, 13], [23, 10], [23, 11], [23, 15], [24, 12]] => [[1, 2]]
[[1, 17], [1, 21], [3, 11], [3, 15], [3, 19], [3, 23], [5, 13], [5, 21], [7, 11], [7, 15], [7, 19], [9, 1], [9, 13], [9, 17], [11, 3], [11, 7], [11, 15], [11, 19], [13, 5], [13, 9], [13, 13], [13, 17], [13, 21], [15, 11], [15, 15], [15, 19], [17, 13], [17, 17]] => [[2, 2], [2, 6], [2, 10]]
[[1, 3], [2, 4], [2, 5], [3, 6], [4, 1], [5, 3], [5, 6], [5, 7], [6, 12], [6, 14], [6, 21], [7, 9], [7, 19], [8, 9], [8, 15], [8, 17], [8, 18], [8, 24], [9, 12], [9, 19], [10, 12], [10, 14], [10, 17], [10, 21], [11, 22], [12, 15], [12, 17], [12, 24], [13, 16], [14, 20], [14, 21], [14, 26], [15, 13], [15, 19], [16, 18], [16, 23], [17, 16], [17, 24]] => [[2, 3]]
[[1, 11], [3, 13], [4, 10], [6, 14], [8, 12], [9, 9], [9, 15], [12, 8], [13, 5], [13, 19], [13, 21], [14, 8], [15, 1], [15, 17], [16, 4], [16, 14], [16, 18], [16, 20], [17, 21], [18, 2], [18, 16], [18, 18], [19, 9], [19, 13], [19, 15], [20, 12], [21, 1], [21, 17], [22, 4], [22, 10], [23, 7]] => [[1, 3]]
[[1, 39], [6, 37], [8, 32], [10, 27], [11, 31], [11, 35], [12, 22], [16, 21], [16, 29], [16, 33], [18, 34], [21, 3], [21, 9], [21, 19], [23, 8], [23, 14], [23, 22], [23, 24], [23, 36], [24, 6], [25, 13], [25, 17], [26, 1], [26, 11], [28, 6], [28, 20], [28, 26], [28, 30], [28, 34], [30, 11], [30, 15], [30, 21], [32, 6], [33, 28], [33, 32], [35, 13], [35, 23]] => [[2, 5]]

ในกรณีพิเศษโปรดทราบว่าสำหรับบอร์ดที่ประกอบด้วยเซลล์เดียวเท่านั้น leaper ใด ๆ ที่ใช้งานได้ แต่เอาต์พุตของคุณต้องตรงกับ leaper จริงดังนั้นจึง[0, 0]ไม่ใช่เอาต์พุตที่ถูกต้อง


คำถามอย่างรวดเร็ว. อัศวินเป็น(2,1)อย่างไร ถูกต้องฉันหากฉันผิด แต่ผมค่อนข้างมั่นใจว่าสามารถย้ายอัศวิน 3 สี่เหลี่ยมในทิศทางใดและจากนั้น 1 ตารางในแนวตั้งฉากกับทิศทางใด ๆ (3,1)ที่ก่อนหน้านี้หนึ่งดังนั้นจึงควรจะเป็น
R. Kap

1
@ R.Kap คุณผิด ;) en.wikipedia.org/wiki/Knight_(chess)#Movement
DLosc

@DLosc ตกลงว้าว ฉันเดาว่าฉันเป็น ขอบคุณสำหรับสิ่งนั้น!
R. Kap

เราสามารถส่งออก leapers ที่ใช้ได้ทั้งหมดในรายการได้ไหม ถ้าเราทำเราสามารถส่งออก leapers เทียบเท่าได้[[1, 0], [0, 1]]หรือไม่
FryAmTheEggman

@FryAmTheEggman เพียงคนใดคนหนึ่งในนั้นได้โปรด
Martin Ender

คำตอบ:


12

Pyth, 41 35

hfqQu@+G+VM*s_BM*F_BMTGQ]hQ)maVhQdt

ออกจากข้อผิดพลาดหากไม่มี leapers ที่ถูกต้องให้สตริงว่างถ้า STDERR ถูกละเว้น

ลองที่นี่หรือเรียกใช้ชุดทดสอบ

บันทึกแล้ว 6 ไบต์ขอบคุณisaacg ! โดยทั่วไปเพียงแค่หาผู้สมัคร leaper ทั้งหมดโดยเลือกแต่ละ leaper ที่ถูกต้องจากไทล์แรกไปยังไทล์อื่น ๆ จากนั้นสำหรับแต่ละสิ่งเหล่านี้ทำให้การกำหนดค่า[x, y]ออฟเซ็ตทั้งแปดอย่างที่ leaper ใช้ จากนั้นค้นหาการเคลื่อนไหวทั้งหมดที่เริ่มต้นจากไทล์แรกที่ตามหลังการย้ายและทิ้งสิ่งที่ไม่อยู่ในอินพุต มันทำเช่นนี้ต่อไปจนกว่าผลลัพธ์จะไม่เปลี่ยนแปลง หากรายการสุดท้ายนี้เป็นเช่นเดียวกับการป้อนข้อมูล leaper นั้นถูกต้อง

กระดานหมากรุกมาตรฐานใช้เวลานานที่สุดเมื่อฉันทำการทดสอบมันใช้เวลาประมาณ 3 วินาทีในคอมพิวเตอร์ที่ไม่ค่อยประทับใจ

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