कोड गोल्फ: अंतरिक्ष यान का भाग्य क्या है? [ASCII कला संस्करण]


14

पृष्ठभूमि

एक आकाशगंगा में (और संभवतः एक ब्रह्मांड) दूर, दूर ... एक अंतरिक्ष यान और ग्रहों का एक समूह था। बोर्ड में खराबी के कारण अंतरिक्ष यान ईंधन से बाहर चला गया। यह अब ग्रहों के एक समूह के पास एक खतरनाक धीमी गति से आगे बढ़ रहा है, जिससे इसे बच जाना चाहिए! चालक दल का भाग्य क्या होगा?

चुनौती

आप USS StackExchange पर प्रमुख प्रोग्रामर हैं। जैसे, आप एक सिम्युलेटर लिखने की इच्छा रखते हैं जो यह बताएगा कि आप किसी ग्रह पर दुर्घटनाग्रस्त भूमि को बर्बाद कर रहे हैं या नहीं, ग्रह प्रणाली से बच जाएंगे, या हमेशा के लिए कक्षा में फंस जाएंगे।

आपके अंतरिक्ष यान पर विस्फोट, का अर्थ है कि बहुत सीमित कम्प्यूटेशनल संसाधन थे। आपका कार्यक्रम यथासंभव छोटा होना चाहिए। इसके अलावा, इसका मतलब है कि चलाने के लिए सिमुलेशन इनपुट का एकमात्र संभव तरीका ASCII कला के माध्यम से है।

सिमुलेशन

मल्टीवर्स के इस चतुर्थांश में, ASCII कला को समायोजित करने के लिए भौतिकी के नियमों को थोड़ा बदल दिया गया है। इसका मतलब है कि ब्रह्मांड को कोशिकाओं में विभाजित किया गया है। आंदोलनों को कोशिकाओं की इकाइयों में वर्णित किया जाएगा, और समय समय चरणों की इकाइयों में होगा।

जहाज में ही गति है। यदि जहाज x अक्ष पर +2 सेल और y अक्ष पर -1 सेल चला (पिछले समय के चरण में (2, -1) के रूप में शॉर्टहैंड किया गया है) और कोई गुरुत्वाकर्षण क्षेत्र नहीं है, तो जहाज सटीक रूप से आगे बढ़ेगा अगले समय कदम पर एक ही वेग।

कई ग्रह होंगे, जिनमें से सभी इसके चारों ओर आठ कोशिकाओं पर एक गुरुत्वाकर्षण क्षेत्र का विस्तार करते हैं, जो जहाज के वेग को प्रभावित करेगा और जहाज को ग्रह के करीब खींच लेगा। किसी ग्रह के "उत्तर" होने के परिणामस्वरूप (-1,0) के बल के साथ जहाज को एक सेल को "दक्षिण" में एक क्षेत्र में खींच लिया जाएगा। ग्रह के केवल "उत्तर-पूर्व" होने के परिणामस्वरूप जहाज को एक सेल को "दक्षिण" और एक यूनिट को "पश्चिम" में (-1, -1) के बल के साथ खींचने पर बल मिलेगा।

गुरुत्वाकर्षण क्षेत्र जहाज की गति के लिए एक सदिश जोड़ते हैं क्योंकि यह गुरुत्वाकर्षण के साथ कोशिका को छोड़ रहा है। यदि एक जहाज अभी पहले (2, -1) कोशिकाओं में चला गया और अब (-1,1) के गुरुत्वाकर्षण क्षेत्र में है, तो अगली बार इस कदम में (1,0) कोशिकाएं चलेंगी। यदि जहाज कई ग्रहों के करीब है, तो जोड़ने के लिए कई वैक्टर होंगे।

इनपुट

STDIN पर, आपको ग्रह प्रणाली का एक ASCII कला प्रतिनिधित्व प्राप्त होगा जो ग्रहों और आपके जहाज के वर्तमान वेग के निर्देशांक को दिखाएगा। @ संकेतों के रूप में कई ग्रह होंगे, जबकि av ^ <> चिन्ह के रूप में एक स्थान होगा। जहाज के लिए प्रतीक का चुनाव जहाज के वर्तमान वेग (गुरुत्वाकर्षण को जोड़े जाने से पहले) को इंगित करता है। उदाहरण के लिए, <a का अर्थ है पश्चिम में एक सेल का वेग, जबकि ^ का अर्थ है उत्तर में एक सेल का वेग। सभी खाली स्थान में समयावधि शामिल होगी, जो प्रत्येक पंक्ति को समान चौड़ाई का पैड देती है। एक रिक्त रेखा इनपुट के अंत का प्रतिनिधित्व करती है। यहाँ एक इनपुट का एक उदाहरण है:

.................
...@.@........v..
......@..@..@@...
..@..............
.......@..@......
.................

उत्पादन

आउटपुट STDOUT पर एक एकल शब्द होगा, जो यह बताएगा कि क्या जहाज गुरुत्वाकर्षण से बच जाएगा, एक ग्रह में भूमि दुर्घटनाग्रस्त हो जाएगा, या हमेशा के लिए परिक्रमा करेगा।

गुरुत्वाकर्षण से बचने को मानचित्र से दूर जाने वाले जहाज के रूप में परिभाषित किया जाता है। यदि जहाज बच जाता है, तो आपके कार्यक्रम को "बच" शब्द को प्रिंट करना होगा।

क्रैश लैंडिंग तब होती है जब कोई जहाज किसी ग्रह के ऊपर से सीधे गुजरता है या एक ही कदम के दौरान एक ही सेल में समाप्त हो जाता है। ध्यान दें कि जहाज हर बार कदम रखने के लिए केवल गणना करना पर्याप्त नहीं है। (5,5) के वेग से चलने वाला एक जहाज (1,1) स्थित एक ग्रह में दुर्घटनाग्रस्त हो जाएगा, भले ही सीधी गणना का मतलब होगा कि यह उस सेल पर कभी नहीं जाएगा। (5,6) के वेग वाला एक जहाज, हालांकि, ग्रह में भूमि दुर्घटना नहीं करेगा। यदि आपका स्पेसशिप क्रैश लैंड करता है, तो आपके प्रोग्राम को "क्रैश" शब्द प्रिंट करना होगा।

परिक्रमा करना सबसे मुश्किल हो सकता है। परिक्रमा तब होती है जब अंतरिक्ष यान एक ही वेग के साथ एक ही कोशिका के जुड़ाव का दौरा करता है। यदि जहाज परिक्रमा करता है, तो आपको "कक्षा" शब्द को प्रिंट करना चाहिए।

यहाँ उपरोक्त उदाहरण के लिए आउटपुट है:

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 में लिखा जाना चाहिए। आपको किसी भी प्रकार के बाहरी डेटाबेस तक पहुँचने की अनुमति नहीं है।

अंत संचरण


INPUT सेक्शन के ठीक ऊपर की लाइन में एक टाइपो प्रतीत होता है ... मेरा मानना ​​है कि आप ग्रह हैं? :-)
गफ्फी

दरअसल, उस पूरे आंशिक पैराग्राफ को हटाने की जरूरत है, जानकारी आउटपुट सेक्शन के तहत दोहराई जाती है।
फीनोटपी

1
मुझे यह थोड़ा कम बदली हुई भौतिकी के साथ बेहतर लगता है ... यह साइट अधिक समस्याओं के साथ कर सकती है जिसमें थोड़ा अच्छा महंगा फ्लोटिंग-पॉइंट अंकगणित भी शामिल है।
को बंद कर दिया

1
@leftaroundabout मेरी अगली चुनौती हो सकती है।
फीनोटपी

किसी ग्रह के कितने करीब होने की जरूरत है कि उसमें दुर्घटना हो?
पीटर टेलर

जवाबों:


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 काम करता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.