コードゴルフ:宇宙船の運命は?[アスキーアート版]


14

バックグラウンド

遠くの銀河(そして恐らくは宇宙)には、宇宙船とたくさんの惑星がありました。船内の故障により、宇宙船の燃料が不足しました。現在、惑星群の近くで危険なほど遅い速度で動いており、そこから脱出しなければなりません!乗組員の運命はどうなりますか?

チャレンジ

あなたはUSS StackExchangeのリードプログラマーです。そのため、あなたは、あなたが惑星に土地を衝突させる運命にあるかどうかを明らかにし、惑星系から逃れるか、永遠に軌道にとどまるシミュレータを書くことを望みます。

ただし、宇宙船の爆発は、計算リソースが非常に限られていたことを意味します。プログラムはできるだけ小さくする必要があります。また、これは、実行するシミュレーションを入力する唯一の可能な方法がASCIIアートを使用することであることを意味します。

シミュレーション

この多元宇宙の象限では、ASCIIアートに対応するために物理法則がわずかに変更されています。これは、コスモスが細胞に分割されることを意味します。移動はセル単位で記述され、時間は時間ステップ単位で記述されます。

船自体に勢いがあります。船が前のタイムステップでx軸に+2セル、y軸に-1セル((2、-1)と略す)を移動し、重力場がない場合、船は正確に移動します次のタイムステップで同じ速度。

いくつかの惑星があり、そのすべてがそのすぐ周囲の8つのセルに重力場を及ぼし、それが船の速度に影響を与え、船を惑星に近づけます。惑星の「北」になると、フィールドは(-1,0)の力で船を1つのセルから「南」に引き寄せます。ちょうど惑星の「北東」であると、船は1セルを「南」に、1ユニットは「-1、-1」の力で「西」に引っ張られます。

重力場は、重力でセルを離れるときに、船の運動量にベクトルを追加します。船が直前に(2、-1)セルを移動し、現在(-1,1)の重力場にいる場合、この次のタイムステップで(1,0)セルを移動します。船が複数の惑星に近接している場合、追加するベクトルが複数あります。

入力

STDINでは、惑星の座標と船の現在の速度を表示する惑星システムのASCIIアート表現を受け取ります。@記号の形で複数の惑星があり、av ^ <>記号の形で1つの宇宙船があります。船のシンボルの選択は、船の現在の速度を示します(重力が追加される前)。たとえば、<は西への1セルの速度を意味し、^は北への1セルの速度を意味します。すべての空のスペースはピリオドで構成され、すべての行が同じ幅になるようにパディングされます。空白行は入力の終わりを表します。入力の例を次に示します。

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

出力

出力はSTDOUTの1つの単語になり、船が重力から逃れるか、土地を惑星に衝突させるか、永久に周回するかがわかります。

重力からの脱出は、船がマップから移動することとして定義されます。船が脱出する場合、プログラムは「エスケープ」という単語を出力する必要があります。

クラッシュランディングとは、船が惑星を直接通過するか、タイムステップ中に同じセルに到達することです。タイムステップごとに船の位置を単純に計算するだけでは不十分であることに注意してください。(5,5)の速度で移動している船は、(1,1)にある惑星に衝突しますが、単純な計算では、そのセルを訪れることはありません。ただし、速度が(5,6)の船は、陸地を惑星に衝突させません。宇宙船がcrash落した場合、プログラムは「クラッシュ」という単語を出力する必要があります。

周回は検出が最も難しい場合があります。宇宙船が同じセルを2回、同じ速度で訪れるたびに、周回が行われます。船が周回する場合、「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で作成する必要があります。外部データベースへのアクセスは許可されていません。

伝送終了


INPUTセクションのすぐ上の行にタイプミスがあるようです。:
ガフィ

実際、その部分的な段落全体を削除する必要があり、情報は出力セクションの下で繰り返されます。
PhiNotPi

1
物理学を少し変更せずにこれを改善したいと思います...このサイトは、少し素敵な高価な浮動小数点演算を伴うより多くの問題を処理できます。
反時計回りに

1
@leftaroundaboutそれは私の次の挑戦かもしれません。
PhiNotPi

惑星にどれだけ接近して衝突する必要がありますか?
ピーターテイラー

回答:


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

改変されていない(およびわずかにリファクタリングされた)バージョンは、http: //pastebin.com/yAKYvwQfで入手できます。

実行中のバージョン:https ://compilify.net/1n9これは、complifyで実行されるように少し変更されています。

  • 暗黙的な配列作成なし-例: new[]{1,2}
  • 用途return <string>代わりにConsole.WriteLine、それがどのようにcompilify.net作品だから
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.