Code Golf: ชะตากรรมของยานอวกาศคืออะไร? [รุ่นจุดลอยตัว]


12

คำถามนี้ยากกว่ารุ่น art ASCII เล็กน้อย ไม่มีงานศิลปะและตอนนี้คุณต้องทำเลขคณิตจุดลอยตัว!

ความท้าทาย

USS StackExchange กำลังเดินทางผ่านสนามแรงโน้มถ่วงของดาวเคราะห์ cg-00DLEF เมื่อเกิดการระเบิดทางดาราศาสตร์ขึ้นบนเรือ ในฐานะหัวหน้าเจ้าหน้าที่เขียนโปรแกรมของเรือคุณมีหน้าที่จำลองเส้นทางการเคลื่อนที่ของเรือเพื่อคาดการณ์ว่าคุณจะถูกบังคับให้ชนบนบกในระบบสุริยะของ cg-00DELF หรือไม่ ในระหว่างการระเบิดเรือของคุณเสียหายอย่างหนัก เนื่องจากยานอวกาศ DEEEPRAROM * ที่ จำกัด ฟรีคุณต้องเขียนโปรแกรมของคุณให้มีจำนวนอักขระน้อยที่สุดเท่าที่จะทำได้

* การเข้าถึงแบบสุ่มที่สามารถลบได้ด้วยโปรแกรมแบบลบได้

การจำลองสถานการณ์

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

จะมีดาวเคราะห์สามดวงในการจำลอง ทั้งสามจะมีตำแหน่งรัศมีและแรงโน้มถ่วงที่เฉพาะเจาะจง แรงโน้มถ่วงสำหรับดาวเคราะห์แต่ละดวงนั้นเป็นเวกเตอร์ที่ออกแรงโดยตรงไปยังศูนย์กลางของดาวเคราะห์ สูตรในการหาความแข็งแรงของเวกเตอร์นี้คือ(Gravity)/(Distance**2)โดยที่ระยะทางเป็นระยะทางที่แน่นอนจากเรือถึงศูนย์กลางของดาวเคราะห์ ซึ่งหมายความว่าไม่มีการ จำกัด ว่าแรงโน้มถ่วงจะไปถึงที่ใด

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

การจำลองแต่ละครั้งมีการ จำกัด เวลา 10,000 ขั้นตอน หากยานอวกาศเดินทางเข้าไปในดาวเคราะห์ (ใกล้กับศูนย์กลางของดาวเคราะห์มากกว่ารัศมีของดาวเคราะห์) มันก็ชนเข้ากับดาวเคราะห์ดวงนั้น ถ้ายานอวกาศไม่ชนเข้ากับดาวเคราะห์ใด ๆ ในตอนท้ายของการจำลองมันก็คงจะสันนิษฐานได้ว่าหนีจากแรงโน้มถ่วง ไม่น่าเป็นไปได้ที่เรือจะสามารถจัดตำแหน่งอย่างสมบูรณ์แบบเพื่อให้สามารถอยู่ในวงโคจรได้ 10,000 ขั้นตอนในขณะที่ชนกับ 1,0001 ขั้นตอนในเวลา

อินพุต

อินพุตจะเป็นสี่บรรทัดถึง STDIN แต่ละบรรทัดประกอบด้วยตัวเลขสี่ตัวคั่นด้วยเครื่องหมายจุลภาค นี่คือรูปแบบของตัวเลข:

ShipLocX,ShipLocY,ShipVelX,ShipVelY
Planet1LocX,Planet1LocY,Planet1Gravity,Planet1Radius
Planet2LocX,Planet2LocY,Planet2Gravity,Planet2Radius
Planet3LocX,Planet3LocY,Planet3Gravity,Planet3Radius

หากมีดาวเคราะห์น้อยกว่าสามดวงเส้นที่เหลือจะถูกเติมด้วยศูนย์สำหรับค่าทั้งหมด นี่คือตัวอย่างอินพุต:

60,0,0,10
0,0,4000,50
100,100,4000,50
0,0,0,0

ซึ่งหมายความว่ายานอวกาศตั้งอยู่ที่ (60,0) และเดินทางตรง "ขึ้น / เหนือ" ในอัตรา 10 หน่วย / ขั้นตอน มีดาวเคราะห์สองดวงดวงหนึ่งตั้งอยู่ที่ (0,0) และหนึ่งอยู่ที่ (100,100) ทั้งคู่มีแรงดึงดูดของ 4,000 และรัศมี 50 แม้ว่าทั้งหมดนี้จะเป็นจำนวนเต็ม แต่ก็ไม่ได้เป็นจำนวนเต็มเสมอไป

เอาท์พุต

เอาท์พุทจะเป็นคำเดียวเพื่อ STDOUT เพื่อบอกว่ายานอวกาศตกลงมาหรือไม่ crashหากผิดพลาดเรือดินแดนพิมพ์ escapeมิฉะนั้นพิมพ์ นี่คือผลลัพธ์ที่คาดไว้สำหรับอินพุตด้านบน:

crash

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

บางกรณีเพิ่มเติมสำหรับการตรวจสอบ

60,0,10,-10
0,0,2000,50
100,100,1357.9,47.5
0,0,0,0

หลบหนี (เนื่องจากกฎกำลังสองผกผัน 2000 ไม่แรงโน้มถ่วงมากถ้าคุณอยู่ห่าง 60 หน่วย)

0,0,0,0
100,100,20000,140
-50,-50,50,50
-100,-100,50,50

ความผิดพลาด (ดาวเคราะห์ดวงแรกมีขนาดใหญ่มากและใกล้สุด ๆ )

0,0,0,0
0,0,0,0
0,0,0,0
0,0,0,0

หลบหนี (นี่คือกรณีขอบ: ไม่มีดาวเคราะห์และการตีความที่ตรงไปตรงมาจะแนะนำว่ายานอวกาศอยู่ด้านบนของดาวเคราะห์โดยตรง)

กฎข้อ จำกัด และหมายเหตุ

นี่คือรหัสกอล์ฟ บังคับใช้กฎกอล์ฟมาตรฐาน โปรแกรมของคุณควรเขียนด้วยอักขระ ASCII ที่พิมพ์ได้เท่านั้น คุณไม่สามารถเข้าถึงฐานข้อมูลภายนอกประเภทใด ๆ ได้ คุณสามารถเขียนข้อความเป็นภาษาใดก็ได้ (นอกเหนือจากภาษาที่มีความเชี่ยวชาญในการแก้ปัญหานี้)

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


rofl DEEEPRAROM! - ปฏิสัมพันธ์แรงโน้มถ่วงของดาวเคราะห์ไม่ควรถูกจำลอง? ยังไม่แพงอย่างแน่นอนตัวเลข แต่ยุติธรรมพอ - ฉันถือว่าการจำลองอ้างอิงใช้มาตรฐานการรวมคำสั่งที่ 4 ของ Runge-Kutta และโปรแกรมของเราต้องสร้างผลลัพธ์ที่เทียบเท่ากันหรือไม่
หยุดหมุนทวนเข็มนาฬิกาเมื่อ

ฉันไม่ได้คิดวิธีการที่ดาวเคราะห์หลายดวงโต้ตอบกัน ปัญหาคือพวกเขาจะมีแนวโน้มที่จะชนกันทันที การแก้ไขสิ่งนี้จะต้องทำการกระแทกขนาดของการจำลองขึ้นอย่างไม่น่าเชื่อ
PhiNotPi

สำหรับวิธี Runge-Kutta ฉันยังไม่ได้เรียนคณิตศาสตร์ขั้นสูงเลย :( สิ่งที่ฉันทำคือการคำนวณแรงโน้มถ่วงที่ตำแหน่งปัจจุบันของเรือและเพิ่มสิ่งนี้กับความเร็วของเรือสร้างความเร็วใหม่ของเรือฉันทำสิ่งนี้ในแต่ละขั้นตอนฉันรู้ว่านี่ไม่ถูกต้องสมบูรณ์ แต่ฉันพบ ที่แบ่งความเร็วเริ่มต้นของเรือและแรงโน้มถ่วงของดาวเคราะห์ 10 เพิ่มความแม่นยำของการจำลอง
PhiNotPi

อานั่นเป็นวิธีของออยเลอร์ สำหรับขั้นตอนเวลาเล็ก ๆ น้อย ๆ ที่ถูกต้องเช่นกัน แต่ Runge-Kutta หรือสิ่งอื่นที่ซับซ้อนกว่านั้นน่าสนใจกว่าที่จะใช้ IMO บางทีฉันควรจะท้าทายความสามารถของตัวเองฉันดูเหมือนจะไม่เป็นที่น่าพอใจอย่างง่ายดาย ...
หยุดหันมาคุยกันเมื่อ

@leftaroundabout เริ่มเลย คุณสามารถสร้างบางสิ่งเช่น "จำลองระบบสุริยะทั้งระบบโดยใช้สมการเชิงอนุพันธ์" หรือบางอย่างที่แฟนซีเช่นนั้นหรืออาจเพิ่มในมิติที่สาม
PhiNotPi

คำตอบ:


6

Python 178 170 ตัวอักษร

p=input
a,b,c,d=p()
x=a+b*1j
v=c+d*1j
P=(p(),p(),p())
R='escape'
for i in' '*10000:
 for a,b,g,r in P:
  d=a+b*1j-x;v+=g*d/abs(d)**3
  if abs(d)<r:R='crash'
 x+=v
print R

2
วันนี้คุณอารมณ์ซับซ้อนใช่มั้ย
หยุดหมุนทวนเข็มนาฬิกาเมื่อ

8
ใช่แล้วi....
Keith Randall

ฉันจะแข่งขันกับสิ่งนั้นได้อย่างไร
Neil

@ Neil: รหัสหรือล้อเล่นที่มีไหวพริบ?
Keith Randall

รหัสที่ดี ล้อเล่นที่มีไหวพริบที่ฉันสามารถติดตามได้
Neil

2

Golfrun / GolfScript ?, 243 232 ตัวอักษร

10000:M;n%(','%2/{{~}%}/{{M*}%}:_~:v;_:x;'escape':R;{[','%2/{{~M*}%}/]}%:P;
M,{;P{~\x{0\-}%{+~@+@@+[\]}:|~:d.[~0\-]{[+.2%~*\.-2%~*@\-\.3%~*\(;);~*+]}:&~);~sqrt:z
..**\~d@[`~0]\&@M.*/\{1$/}%v|:v;;z\<{'crash':R;}{}if}/x v|:x;}/R puts

Golfrun เป็นภาษาที่ฉันกำลังทำงานเกิดมาในฐานะล่าม GolfScript C แต่ในไม่ช้าก็ลอยไปไกล แม้ว่าฉันจะเขียนโค้ดนี้โดยไม่ใช้ฟีเจอร์ Golfrun ที่รู้เท่าทัน (ยกเว้นsqrt) การทดสอบกับ GolfScript ดั้งเดิมล้มเหลว (ฉันต้องเพิ่มฟีเจอร์ sqrt ให้กับโค้ดต้นฉบับฉันไม่ใช่กูรูทับทิม แต่ฉันเชื่อว่าปัญหาคือ ไม่ได้ปรับแต่งของฉัน)

ปัญหาแรกของการแก้ปัญหานี้คือ Golfrun ในฐานะ GolfScript ไม่มีเลขทศนิยม มันคือ "จำลอง" การขยายตัวเลขหวังว่าในวิธีที่ถูกต้อง (แต่ฉันไม่มั่นใจ 100% ที่ฉันได้ทำมาอย่างต่อเนื่อง) ถึงกระนั้นโซลูชันไม่ได้จัดการกับตัวเลขจุดลอยตัวเป็นอินพุตดังนั้นฉันจึงต้องขยายด้วยมือเพื่อให้มีตัวเลขจำนวนเต็มเท่านั้น

พยายามใช้อัลกอริทึมในรหัส Python ฉันยังใช้บิตของคณิตศาสตร์ที่ซับซ้อนในทางที่ค่อนข้าง "ทั่วไป" จัดการอัลกอริทึมเพื่อหลีกเลี่ยงปัญหานี้และ / หรือการอินไลน์เมื่อเป็นไปได้การหน่วงเวลาคำจำกัดความสามารถบันทึกตัวอักษรอื่น ๆ ...

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

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