@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が含まれます(00
16進数で表される言語リテラルです)。2番目&1
には値1が含まれ、右側に&0
はが入力されF7
ます。Marbelousでの加算は256を法とするため、値から9を減算します。
//
はデフレクターデバイスで、大理石を落下させる代わりに左に押します。
これをすべてまとめると、これが得られます。大理石}1
が9の場合、&0
シンクロナイザーがいっぱいになります。これにより、値0が{0
出力およびF7
(または-9)に{1
出力されます。}1
9以外の場合は{0
、}1
+ 1 で埋められ、1 {0
が含まれます。{>
デバイスもあります。これは、ボードの下ではなくビー玉を出力する特別な出力です。これは、}1
9に等しい場合に満たされます。
@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, 22
10進数のシーケンス08, 09, 10, 11
がshortlexにマッピングされることに注意することが重要です。だから混乱して使用したの100 -> 89
です!