机器
台球式游戏机仅由符号\
_
/
以及大小写字母,空格和数字组成1
。
\
和/
是坡道。来自上方的球将分别偏转到右侧或左侧。对于两个坡道,如果球从任一侧进来,它将向下偏转。
_
是一个逻辑元素。它执行的逻辑是计算机中最像台球的部分。首先,来自左侧或右侧的球沿相同方向连续。来自上方的球将停止。然后,执行结束后(请参见下面的“运行机器”),如果横穿/着陆在其上的球的数量为正偶数,则从元素底部释放单个球。
一个空格什么都不做。来自任何方向的任何球都将由于重力而直线下降。
小写字母是输入。所有输入将是单个1或0。
大写字母为输出。输出的数字将是撞到其位置的台球数。
该号码1
在该位置释放了一个额外的台球。它代表逻辑1。
除此以外的所有字符都会\_/
导致任何方向的球由于重力而掉落。
球永远不会合并,分裂或碰撞。它们仅在从输入a _
或a 释放时创建1
。只有当它们掉落到地上时才会被摧毁_
。
示例机器-
1 a
\_/ b
\_/
\/
/\ /
_ _
A B
机器中永远不会有任何空白行,但是_
可能会使显示空白行。
运行机器
机器按层或行运行。顶层上的所有台球运动都在第二层发生任何事情之前进行。
机器
ab
\_A
C
运行如下:
首先,它提示您输入a
形式a:
。然后,用户将输入1或0(接着回车)。它对输入重复此操作b
。这是第一层的结尾。我将假设用户为两个输入都输入了1。
然后,它会跟踪第一个球(从a
)的路径,该球沿着\
,穿过_
,进入A
,然后下降到下方的位置A
。然后,它跟踪出第二个球(从b
)的路径,该球直接向下进入_
并终止。这是第二层的结尾。
现在,在第三层之前,由于上面_
有两个球交叉,因此释放了一个球。输出A
上有一个球越过,因此输出A:1
。
对于第三层,它跟踪第一个球的路径(从_
),该球经过C
并直线下降。第二个球(落入A
)也直线下降。
现在,在第四层之前,由于输出上C
有一个滚珠,因此输出C:1
。
由于第四层为空白,因此程序终止。
总结果应该像
a:1 (the user entered the one)
b:1 (same here)
A:1
C:1
目标
您的目标是从STDIN中提取一台机器,并通过根据需要将输入和输出打印到STDOUT来对其进行仿真。程序输入的第一部分将由要运行的机器组成,后跟空白行。遇到的任何输入字母都应使您的程序以输入名称的形式提示输入,后跟冒号。任何输出都应以输出名称的形式显示,后跟冒号,然后是通过该点的球数。
这是高尔夫。
例子
电线穿越
ab
\/
AB
异或门
ab1
\_/
C
完整的加法器
1 a
\_/ b
\_/
\/
/\
_ __/
\_/
\/c
\\_/
_S1
\ \/
__/
/
_
\__
C
\_/
?