কোড গল্ফ: মহাকাশযানের ভাগ্য কী? [এএসসিআইআই আর্ট সংস্করণ]


14

পটভূমি

অনেক দূরে একটি গ্যালাক্সিতে (এবং সম্ভবত একটি মহাবিশ্ব) ... সেখানে একটি স্পেসশিপ এবং গ্রহের গুচ্ছ ছিল। বোর্ডে কোনও ত্রুটির কারণে স্পেসশিপটি জ্বালানীর বাইরে চলে যায়। এটি এখন গ্রহগুলির একটি গুচ্ছের কাছে বিপজ্জনকভাবে ধীর গতিতে এগিয়ে চলেছে, যেখান থেকে এটি পালাতে হবে! ক্রুদের ভাগ্য কী হবে?

চ্যালেঞ্জ

আপনি ইউএসএস স্ট্যাকএক্সচেঞ্জের শীর্ষস্থানীয় প্রোগ্রামার। এই হিসাবে, আপনি এমন একটি সিমুলেটর লেখার ইচ্ছা প্রকাশ করেছেন যা প্রকাশ করবে যে আপনি কোনও গ্রহে জমি বিধ্বস্ত হওয়ার উদ্দেশ্যে ডুবে আছেন, গ্রহ ব্যবস্থা থেকে বাঁচবেন, বা চিরকালের কক্ষপথে আটকে থাকবেন কিনা।

আপনার স্পেসশিপে বিস্ফোরণটির অর্থ, এখানে খুব সীমাবদ্ধ গণ্য সংস্থান ছিল। আপনার প্রোগ্রামটি যতটা সম্ভব ছোট হতে হবে। এছাড়াও, এর অর্থ এই যে সিমুলেশনগুলি চালনার একমাত্র সম্ভাব্য উপায় ASCII শিল্পের মাধ্যমে।

সিমুলেশন

মাল্টিভার্সের এই চতুর্ভুজগুলিতে, ASCII শিল্পকে সামঞ্জস্য করার জন্য পদার্থবিজ্ঞানের আইনগুলিকে কিছুটা পরিবর্তন করা হয়েছে। এর অর্থ মহাজাগতিক কক্ষগুলিতে বিভক্ত। চলাচলের ঘরের এককগুলিতে বর্ণনা করা হবে, এবং সময় সময় পদক্ষেপের এককগুলিতে হবে।

জাহাজ নিজেই গতি আছে। পূর্ববর্তী সময়ের ধাপে যদি জাহাজটি X অক্ষের উপর +2 কোষ এবং y অক্ষের (1 হিসাবে সংক্ষিপ্ত (2, -1)) কোষে স্থানান্তরিত করে এবং কোনও মহাকর্ষীয় ক্ষেত্র না থাকে তবে জাহাজটি যথাযথ সাথে সরে যাবে পরবর্তী সময় পদক্ষেপে একই গতিবেগ।

বেশ কয়েকটি গ্রহ থাকবে যার মধ্যে চারটিই তত্ক্ষণাত্ তার চারপাশের আটটি কোষে একটি মহাকর্ষ ক্ষেত্র ব্যবহার করবে, যা জাহাজটির গতিবেগকে প্রভাবিত করবে এবং জাহাজটিকে গ্রহের নিকটবর্তী করবে। কোনও গ্রহের কেবল "উত্তর" হওয়ার ফলে একটি ক্ষেত্র জাহাজের একটি কক্ষকে "দক্ষিণ" দিকে টেনে তুলবে (-1,0) এর বল দিয়ে। কোনও গ্রহের "উত্তর-পূর্ব" হওয়ার ফলে জাহাজের একটি কক্ষটি "দক্ষিণ" এবং একটি ইউনিটকে "পশ্চিম" দিকে টেনে আনবে (-1, -1) এর বল দিয়ে।

মহাকর্ষ ক্ষেত্রগুলি মহাকর্ষের সাথে ঘর ছেড়ে চলে যাওয়ায় জাহাজটির গতিতে একটি ভেক্টর যুক্ত করে। যদি কোনও জাহাজ সবেমাত্র (2, -1) কোষ সরিয়ে নিয়ে যায় এবং এখন মহাকর্ষীয় ক্ষেত্রের (-1,1) হয়, তবে পরবর্তী সময়ের পদক্ষেপে এটি (1,0) কোষে স্থানান্তরিত হবে। জাহাজটি যদি একাধিক গ্রহের সান্নিধ্যে থাকে তবে যুক্ত করার জন্য একাধিক ভেক্টর থাকবে।

ইনপুট

এসটিডিনে আপনি গ্রহ ব্যবস্থার একটি এএসসিআইআই শিল্প উপস্থাপনা পাবেন যা গ্রহগুলির স্থানাঙ্ক এবং আপনার জাহাজের বর্তমান গতিবেগ দেখিয়ে দেবে। @ চিহ্ন হিসাবে আকারে বেশ কয়েকটি গ্রহ থাকবে, সেখানে অ্যাভ ^ <> চিহ্ন হিসাবে একটি স্পেসশিপ থাকবে। জাহাজের জন্য প্রতীক নির্বাচনটি জাহাজের বর্তমান গতিবেগ নির্দেশ করে (মহাকর্ষ যুক্ত হওয়ার আগে)। উদাহরণস্বরূপ, একটি <এর অর্থ পশ্চিমে একটি ঘরের বেগ, অন্যদিকে ^ এর অর্থ উত্তরে একটি ঘরের বেগ। সমস্ত খালি স্থান পিরিয়ড নিয়ে গঠিত যা প্রতিটি লাইনকে একই প্রস্থে প্যাড করে। একটি ফাঁকা রেখা ইনপুটটির শেষ প্রতিনিধিত্ব করে। এখানে একটি ইনপুট উদাহরণ:

.................
...@.@........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)

বিধি, প্রবিধান এবং নোটসমূহ

এটি কোড গল্ফ। স্ট্যান্ডার্ড কোড গল্ফ বিধি প্রযোজ্য। আপনার প্রোগ্রামগুলি অবশ্যই প্রিন্টযোগ্য এএসসিআইআইতে লেখা উচিত। আপনাকে কোনও ধরণের বাহ্যিক ডাটাবেস অ্যাক্সেস করার অনুমতি নেই।

শেষ ট্রান্সমিশন


ইনপুট বিভাগের ঠিক উপরে লাইনে একটি টাইপো উপস্থিত রয়েছে ... আমি ধরে নিয়েছি আপনি গ্রহ বলতে চাইছেন? :-)
গাফি

আসলে, পুরো আংশিক অনুচ্ছেদটি মুছতে হবে, তথ্য আউটপুট বিভাগের অধীনে পুনরাবৃত্তি করা হয়।
PhiNotPi

1
আমি কিছুটা কম পরিবর্তিত পদার্থবিজ্ঞানের সাথে এটি আরও ভাল চাই ... এই সাইটটি আরও কিছু সমস্যা নিয়ে কাজ করতে পারে যা সামান্য সুন্দর ব্যয়বহুল ভাসমান-পয়েন্ট পাটিগণিতকেও জড়িত।
জবাব দেওয়া বন্ধ করে দিয়েছে

1
এই মুহূর্তে আমার পরবর্তী চ্যালেঞ্জ হতে পারে
PhiNotPi

কোনও গ্রহের সাথে এটি ভেঙে যাওয়ার কতটা কাছাকাছি দরকার?
পিটার টেলর

উত্তর:


6

সি # 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");}}

অব্যাহত (এবং কিছুটা রিফ্যাক্টর) সংস্করণ পাওয়া যায় 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.