@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, 11
shortlex中。这就是为什么我感到困惑的原因100 -> 89
!