@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是一种2D语言,其值由8位大理石表示,该大理石在每个刻度上掉落一个单元格,除非某些设备阻止它们掉落。这个Marbelous计划包含3个委员会;让我们从最简单的一个开始:
:O
}0
+Z
+C
{0
:O是板的名称(准确地说,O是名称,并且:告诉解释器此行是名称。通过给板命名,其他板可以在其}0上调用的
是输入设备,这可以看作是此函数的参数。调用此函数时,此单元格将被输入大理石(值)替换。
+Z将35传递到经过它的大理石上并让其掉落。+C这样做相同,但只添加12。{0是一个输出单元格,当大理石到达此单元格时,该函数将退出并返回此输出设备中的值。
因此,总的来说,该评估板取一个值,然后加47。对我们来说,这意味着它将任何单个数字转换为数字-1的ASCII码(这当然也适用于10)。
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
该板看起来有点复杂。您应该能够识别:I出板的名称,并找到一些输入和输出设备。您会注意到我们有两个不同的输入设备,}0和}1。这意味着该功能需要2个输入。您还将注意到}1设备有两个实例。调用函数后,这两个单元格将包含相同的值。所述}0输入设备是一个直接上述\/装置中,这充当垃圾桶并除去在其上立即落入任何大理石。
让我们看一下}1输入设备放到板上的大理石中发生了什么:
}1
=9 &1
&0
{>
它将在第一次滴答声中掉落并击中=9设备。这会将大理石的值与9进行比较,如果语句=9评估为贯通,则使大理石通过。如果没有,大理石将被推到右边。&0并且&1是同步器。他们抓住掉落在上面的大理石,直到所有其他&n同步器都装满为止。如您所料,这将有条件地触发电路板其他部分的不同行为。
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
如果我告诉您这++是一个增量器,则您应该已经能够知道将使用哪些不同的同步器。左边&1将包含输入值}1+ 1,&0其次将包含0(00是语言文字,以十六进制表示)。第二个&1将包含值1,右边&0将填充一个F7,从一个值中减去9,因为Marbelous中的加法为256模。
// 是一种偏转器设备,它将任何大理石推向左侧而不使其掉落。
将所有这些放在一起即可得到:如果大理石}1为9,则将&0充满同步器。这将导致值0落入{0输出,F7(或-9)落入{1输出。如果}1不是9,{0则将用}1+ 1 填充并{0包含1。还有一个{>设备,这是一种特殊的输出,它在木板旁边而不是在木板下面输出大理石。}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)。有一些同步器,还有一个偏转器。让我们一步一步地走过去。
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
因此,输入值(由于是主板,所以是命令行输入)从位于顶部的第二个单元格开始}0。它会掉落并到达>0另一个比较设备。任何大于0的大理石都将掉落,其他大理石将被推向右侧。(由于Marbelous变量是无符号的,因此只有恰好0会被推到右边)。然后,此零值大理石将撞击@6设备。这是一个门户,将大理石运送到另一个相应的门户,在此情况下位于其上方。然后,0大理石将到达&0同步器,并在其他位置触发一些操作。
如果大理石不为0,则大理石会掉落,然后通过\\撞击将其向右偏斜--,然后将其递减1,然后落入/\克隆器上。该设备取一枚大理石,并向右输出一个副本,向左输出一个副本。左边的一个将向上移动到另一个@0,大理石将再次通过该序列。左边的将带到其他地方。这给了我们一个循环,每个循环减少一次命令行输入,并在每个循环上触发一些行为,直到达到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
这里(FF)有3种语言文字,它们将立即进入门户。这些门户会将它们带到其中三个II设备。II指的是:I我们在文件中进一步定义的董事会。由于:I具有2个不同的输入设备,因此在另一块板上的表示必须为2个单元宽。由于我们有6个包含的单元格II,因此我们可以告诉我们板上有3个此函数的实例。
该FF(或256或-1,如果你会)弹珠会坐在输入细胞:I功能等待,直到有足够的输入大理石STO启动功能(多一个即是)。这就是@4门户的所在。递减的命令行输入的副本在每个循环中都从那里通过。这将触发最左边的:I板。初始值为256(或-1),并且无论命令行输入为-1。左边的大理石将被放入木板的}0装置中,右边的大理石将被放入:I木板的装置中}1。如果您回想起该委员会的工作,您将能够知道结果如何。它将在左侧输出上输出右侧输入的递增版本(并将9变成0,而不是10),并在右侧输出1或-9。
增量值将由门户网站直接带回到右侧输入单元格,右侧的值将落入同步器中。如果同步器已经装有大理石,则两个大理石将发生碰撞。碰撞的弹珠以256为模加在一起。因此,同步器中的值将遵循以下操作:它们开始为空,然后变为1、2、3、4、5、6、7、8、9、10,然后变为再次为1(因为247以模256为模加)。
您可能还记得,当输入值循环回到0时,弹子会向右输出。由于:I板子彼此相邻,因此将触发板子一次向右。这将使三个同步器的值高出一个值,该值比循环输入为0时作为命令行输入的shortlex表示形式高。
您可能还记得该:O函数将一个值转换为代表值-1的数字的ascii值。这些OO单元的输出将落在板上,然后将其相应的ascii字符打印到STDOUT。
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
那么当命令行输入大理石达到0并填充&0同步器时会发生什么呢?好吧,一些0值的弹珠掉落并触发了三个同步器,这些同步器在板的底部保持shortlex数字的数字(+1)。&3最先被触发,因为它包含了最显著位,然后是&2其次&1。然后,该大理石会被传送到其他@5设备,最后撞到!!电池,从而终止了电路板。
19, 20, 21, 22十进制中的序列映射到08, 09, 10, 11shortlex中。这就是为什么我感到困惑的原因100 -> 89!