@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0
Marbelousは8ビット言語であるため、256未満の値に対してのみ機能します。
使い方
Marbelousは、8ビットのビー玉で表される値を持つ2D言語であり、デバイスが落下を防止しない限り、各ティックで1つのセルに落下します。このMarbelousプログラムは3つのボードで構成されています。最も簡単なものから始めましょう:
:O
}0
+Z
+C
{0
:Oはボードの名前です(正確にはOは名前で、:はこの行が名前であることを解釈します。ボードに名前を付けると、他のボードはそれら}0を入力デバイスとして呼び出す
ことができ、これはこのセルの引数は、関数が呼び出されたときに入力大理石(値)に置き換えられます。
+Z通過する大理石に35を追加し、通過させます。+C同じことを行いますが、12を追加します。{0が、、大理石がこのセルに到達すると、関数は終了し、この出力デバイスに値を返します。
したがって、このボードは1つの値を取り、47を加算します。これは、1桁の数字を数字-1のASCIIコードに変換することを意味します(もちろん10でも機能します)。
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
このボードはもう少し複雑に見えます。:Iボードの名前として識別でき、入力デバイスと出力デバイスをいくつか見つけているはずです。2つの異なる入力デバイスとが}0あり}1ます。これは、この関数が2つの入力を取ることを意味します。また、}1デバイスには2つのインスタンスがあることに気付くでしょう。関数を呼び出すと、これらのセルの両方に同じ値が含まれます。}0入力装置は、Aの真上にあります\/このゴミ箱として作用し、すぐにそれに当たる任意の大理石を削除し、デバイス。
}1入力デバイスによってボードに入れられたビー玉の1つに何が起こるか見てみましょう。
}1
=9 &1
&0
{>
最初のティックで落ち、=9デバイスにヒットします。これは、大理石の値oifを9と比較し、ステートメントが=9評価された場合に大理石を通過させます。そうでない場合、大理石は右に押されます。&0そして、&1シンクロしています。それらは、他のすべての&nシンクロナイザーが同様に満たされるまで、それらの上に落ちるビー玉を保持します。ご想像のとおり、これはボードの他の部分で条件付きで異なる動作をトリガーします。
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
それ++がインクリメンターであると言えば、あなたはすでに異なるシンクロナイザーが何で満たされるかを伝えることができるはずです。左側&1には入力値}1+ 1 が含まれ、その&0隣には0が含まれます(0016進数で表される言語リテラルです)。2番目&1には値1が含まれ、右側に&0はが入力されF7ます。Marbelousでの加算は256を法とするため、値から9を減算します。
// はデフレクターデバイスで、大理石を落下させる代わりに左に押します。
これをすべてまとめると、これが得られます。大理石}1が9の場合、&0シンクロナイザーがいっぱいになります。これにより、値0が{0出力およびF7(または-9)に{1出力されます。}19以外の場合は{0、}1+ 1 で埋められ、1 {0が含まれます。{>デバイスもあります。これは、ボードの下ではなくビー玉を出力する特別な出力です。これは、}19に等しい場合に満たされます。
@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
さて、今は大きなものです。このボードはファイルのメインボードであるため、明示的な名前はありません。暗黙の名前はMbです。いくつかの細胞を認識できるはずです。入力デバイス、いくつかの言語リテラル(00およびFF)があります。シンクロナイザーとディフレクターがあります。このピースを1つずつステップスルーできます。
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
したがって、入力値(これはメインボードであるためコマンドライン入力)は、}0配置されている上から2番目のセルから始まります。落下して、>0別の比較デバイスであるデバイスに到達します。0より大きい大理石はすべて通過し、他の大理石は右に押されます。(Marbelous変数は符号なしなので、正確に0だけが右にプッシュされます)。このゼロ値の大理石は、その後ヒットします@6デバイスにます。これはポータルであり、大理石を別の対応するポータル、この場合はそのすぐ上に移動します。0マーブルは&0シンクロナイザーに到達し、他の場所で何かをトリガーします。
ビー玉が0でない場合、ビー玉は落下し、\\ヒットによって右に偏向され、1減り、クローンに--落ちます/\。このデバイスは大理石を取り、そのコピーを右に1つ、左に1つ出力します。左側@0は、大理石が再び同じシーケンスを通過するもう一方に上向きになります。左側のものは他の場所で撮影されます。これによりループが作成され、ループごとに1回コマンドライン入力をデクリメントし、すべてのループで0に達するまで何らかの動作をトリガーします。その後、他の動作をトリガーします。
@4各ループに押し込まれた大理石で何が起こるか見てみましょう。
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
ここには3つの言語リテラル(FF)があり、すぐにポータルに分類されます。これらのポータルは、3つのIIデバイスにそれらを連れて行きます。ファイルのさらに下で定義IIしたボード:Iを指します。以来:I、2つの異なる入力デバイスを持って、別のボード上のそれの表現は広い2個の細胞でなければなりません。を含む6つのセルがあるためII、この関数の3つのインスタンスがボード上にあることがわかります。
FF(または256または-1あなたがする場合)ビー玉は、入力セルに座って:I十分な入力大理石のSTOである(1以上)の機能を起動するがありますそれまでは待っている機能。それが@4ポータルの出番です。デクリメントされたコマンドライン入力のコピーは、各ループでそこを通過します。これにより、左端の:Iボードがトリガーされます。初期値は256(または-1)で、コマンドライン入力は-1でした。左の大理石はボードの}0デバイスに:I、右の大理石はボードのデバイスに入れられます}1。このボードが何をしたかを思い出せば、これがどんな結果をもたらすかを知ることができます。右側の入力の増分バージョンを左側の出力に出力し(9を10ではなく0に変換します)、右側に1または-9を出力します。
インクリメントされた値はポータルによって右側の入力セルに戻され、右側の値はシンクロナイザーに分類されます。シンクロナイザーが既に大理石を保持している場合、2つの大理石が衝突します。衝突するビー玉は256を法として加算されます。したがって、シンクロナイザーの値は次のようになります。再度1(247が256を法として加算されるため)。
また、入力値が0にループバックすると、大理石が右に出力されることを覚えているかもしれません。:Iボードは隣り合っているため、thsiはボードを右に1回トリガーします。これにより、3つのシンクロナイザーは、コマンドライン入力のshortlex表現になるはずの値よりも1つ高い値で満たされます。これは、ループが0になるまでになります。
また、:O関数が値を値-1を表す数字のASCII値に変換することを覚えているかもしれません。これらのOOセルの出力はボードから落ち、対応するASCII文字がSTDOUTに出力されます。
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
それでは、コマンドライン入力の大理石が0に達し、その&0シンクロナイザーを埋めるとどうなりますか?まあ、いくつかの0の値のビー玉が落ちて、ボードの下部にショートレックス番号の数字(+1)を保持している3つのシンクロナイザーをトリガーします。&3最上位の数字が含まれているため、最初にトリガー&2され、その後にが続き&1ます。その後、この大理石は他の@5デバイスにテレポートされてから!!セルに到達し、ボードが終了します。
19, 20, 21, 2210進数のシーケンス08, 09, 10, 11がshortlexにマッピングされることに注意することが重要です。だから混乱して使用したの100 -> 89です!