Code Golf: ชะตากรรมของยานอวกาศคืออะไร? [เวอร์ชันศิลปะ ASCII]


14

พื้นหลัง

ในกาแลคซี (และอาจเป็นจักรวาล) ไกลออกไป ... มียานอวกาศและดาวเคราะห์จำนวนหนึ่ง การทำงานผิดพลาดบนเรือทำให้ยานอวกาศหมดเชื้อเพลิง ตอนนี้มันเคลื่อนที่ด้วยความเร็วช้าที่อันตรายใกล้กับกลุ่มดาวเคราะห์ซึ่งมันจะต้องหลบหนี! ชะตากรรมของลูกเรือจะเป็นอย่างไร

ความท้าทาย

คุณเป็นโปรแกรมเมอร์นำใน 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 ที่พิมพ์ได้ คุณไม่ได้รับอนุญาตให้เข้าถึงฐานข้อมูลภายนอกประเภทใด ๆ

สิ้นสุดการส่ง


ดูเหมือนจะมีการพิมพ์ผิดในบรรทัดเหนือส่วนอินพุต ... ฉันคิดว่าคุณหมายถึงดาวเคราะห์? :-)
Gaffi

ที่จริงแล้วจำเป็นต้องลบย่อหน้าบางส่วนทั้งหมดข้อมูลจะถูกทำซ้ำภายใต้ส่วนเอาท์พุท
PhiNotPi

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

1
@leftaroundabout นั่นอาจเป็นความท้าทายครั้งต่อไปของฉัน
PhiNotPi

มันใกล้กับดาวเคราะห์แค่ไหนที่จะต้องชนเข้ากับมัน
Peter Taylor

คำตอบ:


6

C # 991 984

struct P{public P(int x,int y){X=x;Y=y;}public int X,Y;}
class O:Exception{}
class C:O{}
List<P>p=new List<P>();
List<string>h=new List<string>();
P r,v,u;
void S(){
var i=0;
for(var l=Console.ReadLine();l!="";l=Console.ReadLine())
{u.X=l.Select((c,j)=>
{if(c=='@')p.Add(new P(j,i));else if(c!='.')
{r=new P(j,i);v=(c=='v'?new P(0,1):c=='<'?new P(-1,0):c=='^'?new P(0,-1):new P(1,0));}
return u;}).Count();i++;}
u.Y=i;
var x=new Action<string>(Console.WriteLine);
try{
while(true){
p.ForEach(q=>{var a=q.X-r.X;var b=q.Y-r.Y;
if(a<2&&a>-2&&b<2&&b>-2){v.X+=a;v.Y+=b;}});
var c=string.Join(".",r.X,r.Y,v.X,v.Y);
if(h.Contains(c))throw new O();
h.Add(c);
var z=new P(r.X,r.Y);var k=new[]{v.X,v.Y};var m=k.Min();var M=k.Max();
for(var j=1;j<=M;j++)
if((j*m)%M==0){
if(p.Contains(new P(z.X+(v.X==M?j:j*m/M),z.Y+(v.Y==M?j:j*m/M))))throw new C();}
r.X+=v.X;r.Y+=v.Y;
if(r.X<0||r.X>=u.X||r.Y<0||r.Y>=u.Y)throw new Exception();}}
catch(C){x("crush");}
catch(O){x("orbit");}
catch{x("escape");}}

รุ่น ungolfed (และปรับโครงสร้างเล็กน้อย) มีให้ที่http://pastebin.com/yAKYvwQf

รุ่นที่ใช้งาน: https://compilify.net/1n9 สิ่งนี้ได้รับการแก้ไขเล็กน้อยเพื่อให้ทำงานได้ตามปกติ:

  • ไม่มีการสร้างอาร์เรย์โดยนัย - เช่น: new[]{1,2}
  • ใช้return <string>แทนConsole.WriteLineเพราะนั่นคือวิธีการทำงานของ compilify.net
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.