ห้องกระจก


18

(ความท้าทายนี้คล้ายกันมาก แต่ความท้าทายในปัจจุบันมีภาวะแทรกซ้อนเพิ่มเติม)


ลองนึกภาพห้อง 2 มิติที่ผนังถูกชุบด้วยกระจกแบน

ทันใดนั้นแสงไฟก็พุ่งเข้ามาในห้องซึ่งเป็นส่วนหนึ่งของกำแพงที่หายไป! แสงไฟเต้นรำไปรอบ ๆ ห้องรับแสงสะท้อนจากผนังกระจกและในที่สุดก็ออกจากห้องอีกครั้ง

ลอจิก

คุณจะได้รับ 5 ตัวแปร: W, H, X, YและZ
ตอนนี้พวกเขาหมายถึงอะไร

W, H คือขนาดของห้อง (รวมถึงกำแพง) โดย W คือความกว้างและ H เป็นความสูง
X, Y เป็นพิกัดที่กำแพงมีรูอยู่ คุณสามารถสันนิษฐานได้ว่าสิ่งนี้อยู่บนกระเบื้องผนังเสมอ พิกัดนั้นเป็นแบบ 0 โดยที่แกน X ชี้ไปทางขวาและแกน Y ชี้ลง
Z เป็นตัวเดียวที่เป็นตัวแทนของทิศทางที่แสงตกเข้ามาในห้องอย่างใดอย่างหนึ่งหรือ\ /

ห้องจะต้องสร้างขึ้นจากตัวละครต่อไปนี้:

  • | สำหรับผนังแนวนอน
  • - สำหรับผนังแนวตั้ง
  • + สำหรับมุม

ตัวอย่าง: (W = 7, H = 4)

+-----+
|     |
|     |
+-----+

ตอนนี้เรามีห้องพักแล้วให้ทำลายหนึ่งในแผ่นผนังเพื่อให้ลำแสงตกลงไปในห้อง ลำแสงเป็นเส้นทแยงมุมแสดงโดย\และ/ตัวอักษร

ลองเปลี่ยนกระเบื้องผนังที่ X = 2, Y = 0 ด้วย\ลำแสง

+-\---+
|     |
|     |
+-----+

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

+-\---+
|\ \/\|
| \/\/|
+-----+

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

งานของคุณ

เขียนโปรแกรมที่พิมพ์ห้องและเส้นทางทั้งหมดของลำแสงจนกระทั่งมันออกจากห้องอีกครั้งหรือวนซ้ำไปเรื่อย ๆ

อินพุต

ป้อนข้อมูลอาจจะได้รับในรูปแบบที่เหมาะสมใด ๆ แต่ก็มีการรวม 4 จำนวนเต็ม W, H, X, Y และ Z [10, 8, 0, 3, \]ตัวอักษรเช่น

คุณอาจคิดว่า:

  • W, H> = 3
  • X, Y มักจะอยู่ที่กำแพง
  • Z จะสามารถที่จะมีค่าและ\/

เอาท์พุต

stdoutคุณสามารถตัดสินใจได้ว่าคุณกลับเป็นสตริงหรือส่งออกโดยตรงไปยัง
ต้องรวมผนังห้องและลำแสง (กำหนดโดยอักขระ ASCII ด้านบน)

กฎระเบียบ

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นรหัสที่สั้นที่สุดเป็นไบต์ในภาษาใดก็ได้จะเป็นผู้ชนะ
  • อนุญาตให้ใช้ภาษาการเข้ารหัสทุกภาษาที่สร้างขึ้นก่อนการประกาศความท้าทายนี้

ตัวอย่าง

การป้อนข้อมูล: [5, 4, 2, 0, /]

+-/-+
|/ /|
|\/ |
+---+

การป้อนข้อมูล: [20, 3, 0, 1, \]

+------------------+
\/\/\/\/\/\/\/\/\/\|
+------------------+

อินพุต: [10, 8, 0, 3, \] (ตัวอย่างของวงวนไม่สิ้นสุดที่จะไม่ออกจากห้องอีกครั้ง)

+--------+
|/\/\/\/\|
|\/\/\/\/|
\/\/\/\/\|
|\/\/\/\/|
|/\/\/\/\|
|\/\/\/\/|
+--------+

โชคดี!

คำตอบ:


5

ถ่าน , 55 ไบต์

BNNJNNPψ↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1W¬℅KK«¹F³¿∧κ℅KK«↷κ¶↷κ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: ฉันไม่รู้ว่าทำไม แต่รหัสนั้นไม่ทำงานในขณะนี้ นี่คือรุ่นที่ปรับแต่งแทน คำอธิบายของรหัสเดิม:

BNN

วาดกล่องด้านนอก

JNNPψ

เลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นและสร้างช่องในกล่องที่จุดนี้เพื่อให้กลายเป็นพื้นหลัง

↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1P

หมุนไปในทิศทางที่เหมาะสมเพื่อพิมพ์ส่วนของเส้นเริ่มต้น

W¬℅KK«¹

ในขณะที่เคอร์เซอร์อยู่เหนือรูให้วาดส่วนของบรรทัดถัดไป

F³¿∧κ℅KK«↷κ¶↷κ

ค้นหาช่องที่จะวาดส่วนของบรรทัดถัดไป ใช้งานได้โดยการทำซ้ำรหัสเดียวกันสามครั้ง ครั้งแรกไม่มีอะไรเกิดขึ้น ครั้งที่สองหากเคอร์เซอร์ไม่อยู่เหนือหลุมมันจะหมุนไปทางขวา 45 °จากนั้นก้าวหนึ่งไปทางขวาแล้วหมุนขวา 45 องศา นี่คือผลกระทบของการสะท้อนมันในหนึ่งแกน ครั้งที่สามถ้าเคอร์เซอร์ยังคงไม่ผ่านรูมันจะหมุนไปทางขวา 90 องศาจากนั้นใช้เวลาหนึ่งก้าวไปทางขวาแล้วหมุนขวา 90 องศา นี่คือผลของการเปลี่ยนการสะท้อนกลับไปยังแกนอื่น ๆ หากยังไม่มีช่องแสดงว่ามีการเข้าถึงมุมหรือลูปไม่สิ้นสุดดังนั้นลูปด้านนอกจะหยุด


1
เพื่อให้ผู้คนทดสอบรหัสของคุณทำงานได้จะช่วยให้มีลิงก์ไปยังรหัส golfed ออนไลน์โดยแยกเวอร์ชัน verbose ออก
trichoplax



@trichoplax ลิงก์ TIO จะแสดงรหัส golfed ในผลลัพธ์ซึ่งเป็นที่ที่ฉันคัดลอกและวางจาก ...
Neil

1
@trichoplax เมื่อคุณใช้งาน-v -slจริง ๆ แล้วมันเป็นรหัสย่อที่แปลแล้วซึ่งพิมพ์ออกมาและถูกเรียกใช้งาน แน่นอนว่าสิ่งนี้ขึ้นอยู่กับ deverbosifier การสร้างรหัสรวบรัดที่ถูกต้องเพราะถ้าไม่เช่นนั้นรหัสที่สร้างขึ้นจะล้มเหลวแม้ว่ารหัส verbose ดั้งเดิมนั้นถูกต้องทางเทคนิค
Neil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.