พื้นหลัง
ในกาแลคซี (และอาจเป็นจักรวาล) ไกลออกไป ... มียานอวกาศและดาวเคราะห์จำนวนหนึ่ง การทำงานผิดพลาดบนเรือทำให้ยานอวกาศหมดเชื้อเพลิง ตอนนี้มันเคลื่อนที่ด้วยความเร็วช้าที่อันตรายใกล้กับกลุ่มดาวเคราะห์ซึ่งมันจะต้องหลบหนี! ชะตากรรมของลูกเรือจะเป็นอย่างไร
ความท้าทาย
คุณเป็นโปรแกรมเมอร์นำใน USS StackExchange เช่นนี้คุณต้องการที่จะเขียนโปรแกรมจำลองที่จะเปิดเผยหรือไม่ว่าคุณกำลังถูกโจมตีจากพื้นดินบนดาวเคราะห์หรือไม่ก็จะหนีออกจากระบบดาวเคราะห์หรือจะติดอยู่ในวงโคจรตลอดกาล
อย่างไรก็ตามการระเบิดบนยานอวกาศของคุณหมายความว่ามีทรัพยากรการคำนวณ จำกัด มาก โปรแกรมของคุณจะต้องเล็กที่สุดเท่าที่จะทำได้ นอกจากนี้หมายความว่าวิธีเดียวที่เป็นไปได้ในการป้อนข้อมูลการจำลองเพื่อเรียกใช้คือผ่าน ASCII art
การจำลองสถานการณ์
ในจตุภาคของลิขสิทธิ์นี้กฎของฟิสิกส์มีการเปลี่ยนแปลงเล็กน้อยเพื่อรองรับศิลปะ ASCII ซึ่งหมายความว่าจักรวาลแบ่งออกเป็นเซลล์ การเคลื่อนไหวจะถูกอธิบายในหน่วยของเซลล์และเวลาจะอยู่ในหน่วยของขั้นตอนเวลา
ตัวเรือเองมีโมเมนตัม ถ้าเรือรบเคลื่อนที่ +2 เซลล์บนแกน x และ -1 เซลล์บนแกน y (ย่อมาจาก (2, -1)) ในขั้นตอนก่อนหน้านี้และไม่มีสนามแรงโน้มถ่วงจากนั้นเรือจะเคลื่อนที่ด้วยความแม่นยำ ความเร็วเดียวกันในขั้นตอนต่อไป
จะมีดาวเคราะห์หลายดวงซึ่งทั้งหมดนี้มีสนามแรงโน้มถ่วงอยู่ในแปดเซลล์รอบ ๆ มันซึ่งจะส่งผลต่อความเร็วของเรือและจะดึงเรือเข้ามาใกล้ดาวเคราะห์มากขึ้น การเป็นแค่ "ทิศเหนือ" ของดาวเคราะห์จะส่งผลให้มีการดึงเรือหนึ่งเซลล์ไปยัง "ทิศใต้" ด้วยแรง (-1,0) การเป็นแค่ "ทิศตะวันออกเฉียงเหนือ" ของดาวเคราะห์จะส่งผลให้มีแรงดึงเรือหนึ่งเซลล์ไปยัง "ใต้" และอีกหนึ่งหน่วยไปยัง "ตะวันตก" ด้วยแรง (-1, -1)
สนามความโน้มถ่วงเพิ่มเวกเตอร์เข้ากับโมเมนตัมของเรือเมื่อมันออกจากเซลล์ด้วยแรงโน้มถ่วง หากเรือเคลื่อนที่ก่อนหน้านี้เซลล์ (2, -1) และขณะนี้อยู่ในเขตความโน้มถ่วง (-1,1) ดังนั้นในขั้นตอนต่อไปนี้มันจะเคลื่อนที่ (1,0) เซลล์ หากเรืออยู่ใกล้กับดาวเคราะห์หลายดวงก็จะมีหลายเวกเตอร์ที่จะเพิ่ม
อินพุต
บน STDIN คุณจะได้รับการแทนค่า ASCII art ของระบบดาวเคราะห์ที่จะแสดงพิกัดของดาวเคราะห์และความเร็วเรือปัจจุบันของคุณ จะมีดาวเคราะห์หลายดวงในรูปแบบของเครื่องหมาย @ ในขณะที่จะมียานอวกาศหนึ่งดวงในรูปแบบของสัญลักษณ์ av ^ <> ตัวเลือกสัญลักษณ์สำหรับเรือบ่งบอกถึงความเร็วปัจจุบันของเรือ (ก่อนเพิ่มแรงโน้มถ่วง) ตัวอย่างเช่น <หมายถึงความเร็วของเซลล์หนึ่งไปทางทิศตะวันตกในขณะที่ ^ หมายถึงความเร็วของเซลล์หนึ่งไปทางทิศเหนือ พื้นที่ว่างทั้งหมดจะประกอบด้วยจุดซึ่งขีดทุกเส้นให้มีความกว้างเท่ากัน บรรทัดว่างหมายถึงส่วนท้ายของอินพุต นี่คือตัวอย่างของอินพุต:
.................
...@.@........v..
......@..@..@@...
..@..............
.......@..@......
.................
เอาท์พุต
การส่งออกจะเป็นคำเดียวใน STDOUT ซึ่งจะบอกได้ว่าเรือจะหลบหนีจากแรงโน้มถ่วงหรือจะตกสู่พื้นดินหรือจะโคจรตลอดกาล
การหลบหนีจากแรงโน้มถ่วงหมายถึงเรือเคลื่อนที่ออกจากแผนที่ หากเรือหนีออกมาจากนั้นโปรแกรมของคุณจะต้องพิมพ์คำว่า "หลบหนี"
Crash Landing คือเมื่อเรือแล่นผ่านไปยังดาวเคราะห์โดยตรงหรือสิ้นสุดในเซลล์เดียวกันในช่วงเวลา โปรดทราบว่ามันไม่เพียงพอที่จะคำนวณว่าเรืออยู่ที่ใดในทุกขั้นตอน เรือที่แล่นด้วยความเร็ว (5,5) จะชนเข้ากับดาวเคราะห์ที่ตั้งอยู่ที่ (1,1) แม้ว่าการคำนวณที่ตรงไปตรงมานั้นจะหมายถึงว่ามันจะไม่เข้าชมเซลล์นั้น อย่างไรก็ตามเรือที่มีความเร็ว (5,6) จะไม่ชนพื้นดินในโลก หากยานอวกาศของคุณตกลงมาจากนั้นโปรแกรมของคุณจะต้องพิมพ์คำว่า "crash"
การโคจรอาจเป็นการยากที่สุดในการตรวจจับ การโคจรเกิดขึ้นทุกครั้งที่ยานอวกาศเข้าชมเซลล์เดียวกันสองครั้งด้วยความเร็วเดียวกัน หากเรือโคจรคุณควรพิมพ์คำว่า "orbit"
นี่คือผลลัพธ์สำหรับตัวอย่างข้างต้น:
escape
คำอธิบาย
นี่คือแผนที่แสดงตำแหน่งที่ยานอวกาศเดินทางในแต่ละขั้นตอนในตัวอย่างด้านบน:
^
.................
...@.@........v..
....^.@..@..@@...
..@..<.<<<.<.v...
.......@..@......
.................
มันไปทางทิศใต้หันไปทางทิศตะวันตกเดินทางไปตามทางเดินหันไปทางทิศเหนือและหนีไปอย่างแคบ ๆ ระหว่างไปยังดาวเคราะห์ด้วยความเร็วสูงทุกคนล้วนมีแรงโน้มถ่วง
กรณีเพิ่มเติมสำหรับการตรวจสอบ
...
^@.
...
orbit
...........
.>@.@......
.@......@..
....@......
crash (it crashes into the easternmost planet)
...
.@.
.v.
crash (momentum can't overcome gravity)
........
..@.....
..<.....
...@....
........
orbit (it gets trapped in a gravity well between two planets)
กฎระเบียบและบันทึก
นี่คือรหัสกอล์ฟ บังคับใช้กฎกอล์ฟมาตรฐาน โปรแกรมของคุณต้องเขียนด้วย ASCII ที่พิมพ์ได้ คุณไม่ได้รับอนุญาตให้เข้าถึงฐานข้อมูลภายนอกประเภทใด ๆ
สิ้นสุดการส่ง