Marching Squaresเป็นอัลกอริธึมจากคอมพิวเตอร์กราฟิกส์ซึ่งใช้ในการกู้คืน isocontours 2D จากตารางตัวอย่าง (ดูเพิ่มเติมที่Marching Cubes Cubesสำหรับการตั้งค่า 3D) แนวคิดคือการประมวลผลแต่ละเซลล์ของกริดอย่างอิสระและกำหนดรูปทรงที่ส่งผ่านเซลล์นั้นตามค่าที่มุมของมัน
ขั้นตอนแรกในกระบวนการนี้คือการกำหนดว่าขอบใดที่เชื่อมต่อกันด้วยรูปทรงโดยพิจารณาจากมุมที่สูงหรือต่ำกว่าค่าของเส้นขอบ เพื่อความง่ายเราจะพิจารณาเฉพาะส่วนที่มีค่าตามรูปร่าง0
ซึ่งเราสนใจว่ามุมนั้นเป็นมุมบวกหรือลบ มีหลายกรณีที่จะแยกแยะ:24 = 16
แหล่งที่มาของภาพ: Wikipedia
การระบุสีขาวและดำไม่ได้มีความสำคัญเลย แต่สำหรับความจริงบอกว่าสีขาวเป็นบวกและสีดำเป็นลบ 0
เราจะไม่สนใจกรณีที่มุมหนึ่งของอยู่ตรง
จุดอาน (กรณีที่ 5 และ 10) ให้ความยากลำบากเพิ่มเล็กน้อย: มันไม่ชัดเจนว่าควรใช้ diagonals โดยดูที่มุมเท่านั้น สิ่งนี้สามารถแก้ไขได้โดยการหาค่าเฉลี่ยของมุมทั้งสี่ (เช่นการประมาณค่าศูนย์) และการเลือกเส้นทแยงมุมเพื่อให้เส้นโค้งแยกศูนย์กลางออกจากมุมที่มีเครื่องหมายตรงข้าม หากค่าเฉลี่ยตรงทุก0
กรณีสามารถเลือกได้
โดยปกติ 16 กรณีเหล่านี้จะถูกเก็บไว้ในตารางการค้นหา นี่คือประสิทธิภาพที่ดี แต่แน่นอนเราต้องการให้รหัสสั้นๆ ที่นี่ ดังนั้นงานของคุณคือทำตามขั้นตอนการค้นหานี้และพิมพ์การแสดง ASCII ของเคสในโค้ดน้อยที่สุดเท่าที่จะทำได้
ความท้าทาย
คุณได้รับค่าของมุมทั้งสี่ (จำนวนเต็มที่ไม่ใช่ศูนย์) ตามลำดับที่คุณเลือก จากนั้นคุณควรสร้างเค้าโครงที่ถูกต้องของรูปทรงการแก้ไขกรณีจุดอานอย่างถูกต้อง
คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์
อินพุตอาจถูกใช้ในรูปแบบสตริงหรือรายการที่สะดวก
16 รายจะถูกนำเสนอในรูปแบบ ASCII โดยใช้บล็อก 5x5 อย่างใดอย่างหนึ่งต่อไปนี้:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
คุณต้องไม่พิมพ์ช่องว่างนำหน้าหรือต่อท้าย แต่คุณสามารถพิมพ์บรรทัดใหม่ที่เป็นตัวเลือกได้
นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ
กรณีทดสอบ
กรณีทดสอบถือว่าการป้อนข้อมูลที่จะได้รับในการสั่งซื้อด้านบนซ้าย , ขวาบน , ล่างซ้าย , ขวาล่าง กรณีทดสอบจะถูกนำเสนอใน 9 กลุ่มหนึ่งที่สอดคล้องกับแต่ละตัวแทน 9 ที่ได้รับข้างต้น (ในลำดับเดียวกันเริ่มต้นจากเซลล์ที่ว่างเปล่าลงท้ายด้วยจุดอานทั้งสอง)
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
นอกจากนี้กรณีทดสอบต่อไปนี้อาจส่งคืนจุดอาน (ทั้งตัวเลือก):
[1, -4, -2, 5]
[-1, 4, 2, -5]