(重力ベースの)ビリヤードボールタイプのコンピューターのシミュレーション


12

この機械

ビリヤードボールタイプのマシンは、記号\ _ /、大文字、小文字、スペース、および数字のみで構成されてい1ます。

\そして/ランプです。上から来るボールは、それぞれ右側または左側に偏向されます。両方のランプについて、ボールがどちらかの側から来る場合、ボールは下向きに偏向されます。

_論理要素です。それによって実行されるロジックは、コンピューターの最もビリヤードに似ていない部分です。最初に、左または右から来るボールは同じ方向に続きます。上から来るボールは停止します。次に、実行の終了後(以下のマシンの実行を参照)、その上を通過する/着地するボールの数が正の偶数である場合、1つのボールが要素の下部から解放されます。

スペースは何もしません。任意の方向から来るボールは、重力により真っ直ぐに落ちます。

小文字は入力です。すべての入力は、単一の1または0になります。

大文字は出力です。出力される数は、その場所にヒットしたビリヤードボールの数になります。

番号1は、その場所で追加のビリヤードボールをリリースします。論理1を表します。

以外のすべてのキャラクター \_/、あらゆる方向から来るボールを重力により真っ直ぐに落下させます。

ボールが結合、分割、衝突することはありません。入力、a _、またはa から解放された場合にのみ作成され1ます。彼らはまっすぐに倒れたときに破壊されます_

サンプル機

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

マシンには空白行はありませんが、_'を使用すると、空白行があるように見える場合があります。

マシンの実行

マシンは、レイヤーまたは行で実行されます。最上層のビリヤードボールの動きはすべて、2番目の層で何かが起こる前に実行されます。

この機械

ab
\_A
 C

次のように実行されます。

最初aに、フォームの入力を求められますa:。その後、ユーザーは1または0を入力します(その後にEnterが続きます)。入力に対してこれを繰り返しますb。これで最初のレイヤーの終わりです。ユーザーが両方の入力に1を入力したと仮定します。

その後、最初のボール(からのパスを描くaに沿って行く)、\越えて、_にし、Aし、下のスポットに落ちますA。次に、2番目のボール(からb)のパスをトレースし_ます。これで第2層の終わりです。

さて、3番目のレイヤーの前に、_2つのボールがクロスしているので、1つのボールをリリースします。出力Aには1つのボールが交差しているため、が出力されますA:1

3番目のレイヤーでは、最初のボール(から_)のパスをトレースしますC。2番目のボール(から落ちたA)もまっすぐ落ちます。

これで、4番目のレイヤーの前に、出力Cが1つのボールを通過したため、出力されますC:1

4番目のレイヤーは空白なので、プログラムは終了します。

合計結果は次のようになります

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

目標

あなたの目標は、STDINからマシンを取得し、必要に応じて入力を取得し、STDOUTに出力することで、それをシミュレートすることです。プログラムへの入力の最初の部分は、実行するマシンで構成され、その後に空白行が続きます。入力文字が検出されると、プログラムは入力名の後にコロンが続く形式で入力を求めます。出力は、出力名の形式で表示され、その後にコロン、その場所を通過するボールの数が続きます。

これはゴルフです。

ワイヤークロッシング

ab
\/
AB

XORゲート

ab1
\_/
 C

全加算器

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C

最初の例では、なぜ最初のボールがAの下に落ちますか?ボールがそうでないキャラクターに渡ったときにボールが止まるという、書かれていないルールはあり\_/ますか?
ピーターテイラー

@PeterTaylorはい、ボールに影響を与えることになると、すべての文字が空のスペースとして動作し、重力がボールを引き下げることを追加する必要があります。
PhiNotPi

1
たぶん、あなたは「ビリヤード」ではなく「フリッパー」を意味しますか?
ユーザー不明

ESOLANGを作る
マシュー

1
@AlexL。関連性:Marbelous
PhiNotPi

回答:


3

JavaScript(392 423)

machineという変数にmachineが設定されていると想定mし、最終出力に警告します。

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

サンプルソース(加算器を実行します。ゴルフの少ないソースの履歴を参照):http : //jsfiddle.net/96yLj/12/

ネタバレ:

- r現在の行のボール数を追跡し、n次の行のボール数を追跡します。
-アルゴリズム:文字ごとに各行を処理しますが、_最後のものを処理します。
-アルゴリズム:\->に従い_r非になるまで増加し_ます。同じです/が、逆方向です。最後にn、重力を下げてボールを引き下げます。g方向を保持します。
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];は、編集1で言及したバグ用です。私たちは言うことができない理由がr[d]+=r[c];あるためである\_/処理するときに、ボールカウント倍になる/
- else if(C<'2')ハンドルの両方の例'1'' '、その~~Cターン1と0にし、それぞれ。


編集1:サンプルコードに_含まれていないボールオーバーのバグを修正A


STDINとSTDOUTの要件は無意味な制限なので、私は常に無視することに注意してください。JavaScriptのかなり標準的なprompt入力とalert出力に使用しています:
mellamokb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.