模拟(基于重力的)台球式计算机


12

机器

台球式游戏机仅由符号\ _ /以及大小写字母,空格和数字组成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

在您的第一个示例中,为什么第一个球落在A下方?是否有不成文的规定,当球传到不是这样的角色时球会停止\_/
彼得·泰勒

@PeterTaylor是的,我要补充一点,当涉及到影响球时,所有字母都表现为空白,并且重力将球拉下。
PhiNotPi 2011年

1
您是否有意指“拖鞋”而不是“比拉德”?
用户未知,

做一个独立的人
马修·

1
@AlexL。同样相关:Marbelous
PhiNotPi

Answers:


3

的JavaScript(392423

假设将机器设置在名为的变量中m,然后警告最终输出。

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

样本来源(运行加法器机器,请参见历史记录,了解较少的高尔夫来源):http : //jsfiddle.net/96yLj/12/

扰流板:

- r跟踪当前行中n的球数,跟踪下一行中的球数。
-算法:逐行处理每行字符,但处理_最后一行。
-算法:\->跟进_并增加r直到不行_。相同,/但方向相反。最后增加n重力使球下降。g保持方向。
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];用于编辑1中提到的错误。我们不能只说原因r[d]+=r[c];是因为\_/在处理时将双计数球/
- else if(C<'2')处理case '1'和和' ',分别~~C变为1和0。


编辑1:修复示例代码中_未包含球溢出的错误A


请注意,我总是忽略STDIN和STDOUT要求,因为它们是无趣的限制。我正在使用prompt输入和alert输出,这对于JavaScript是相当标准的:-)
mellamokb 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.