圆迷宫检查器


12

您知道那些带有小滚珠轴承的木制玩具,其目标是在迷宫中移动吗?这有点像。给定一个迷宫和一系列动作,确定球在哪里结束。

棋盘垂直固定,旋转棋盘时,球仅靠重力移动。每个“移动”都是一个旋转(以弧度为单位)。

迷宫是简单的同心圆墙,每堵墙正好有一个通向外部走廊的开口,类似于此(假定这些墙是圆形的而不是尖的):

迷宫

如您所见,球从中间开始,并试图滚出。一旦达到正确的方向,球立即掉落,即使它在旋转的中间。旋转一圈可能会导致球从多个开口掉落。例如,旋转>= n * 2 * pi足以逃脱任何迷宫。

出于游戏目的,位于0.001开口弧度内的球被认为是“合适的”球,并将掉落至下一个走廊。

输入:

输入分为两部分:

  • 迷宫由整数n表示,该整数表示迷宫中有多少个墙/洞。接下来是几n行,每行一个数字,代表通向下一个走廊的位置。

  • 给出的移动次数是一个整数,m表示已执行了多少移动次数,接着(再次在单独的行上)是以弧度为单位的板m顺时针旋转(负数是逆时针)。

所有通过位置均以给出0 rad = up,正弧度顺时针旋转。

对于上面的示例图像,输入可能如下所示:

7                        // 7 openings
0
0.785398163
3.14159265
1.74532925
4.71238898
4.01425728
0
3                        // 3 moves
-3.92699082
3.14159265
0.81245687

输出: 输出球在其中结束的走廊编号。走廊从中心开始为零索引,因此您从开始0。如果您通过一个开口,那么您就在走廊上1。如果您逃脱了整个迷宫,则输出任何整数>= n

对于样本输入,有三个动作。第一将导致球从两个开口掉落。第二个没有找到一个开口,第三认定一个。球现在在走廊中3,因此预期输出为:

3

对于无效输入,行为未定义。有效输入的格式正确,带有n >= 1m >= 0

评分是标准代码高尔夫,最少的字节数获胜。禁止出现标准漏洞。输入一定不能硬编码,而可以从标准输入,参数,控制台等中获取。输出可以是控制台,文件等,只要使其输出可见即可。


“对于无效输入,行为未定义。” <<-必须解决所有难题!
TheDoctor 2014年

在这种情况下,您还可以在需要时以可变的精度计算π,提高精度,直到足以判断球是否掉落为止。我对配合的容忍度(或至少是其当前措辞)存在一个问题,如果A)连续配合彼此之间的距离小于0.001,使得如果将容忍度考虑在内,则球仅落在两个水平上B)当球在一个孔的0.001以内,它会跳到该孔(如果您确实想在措词中读入一些内容)。
Wrzlprmft

@Wrzlprmft球没有跳到洞里。将阈值视为孔比球稍宽。它仍然掉落到同一位置,仅高出一级。如果您认为阈值是1,那么您将只处理较大的孔,而不会在球掉落时将球跳到孔的中心。
Geobits,2014年

为什么输入的格式不方便?/我敢肯定,我golfed比我需要阅读它缩短整个程序
塔尔

Answers:


2

Perl,211 191

带有换行符和缩进以提高可读性:

$p=atan2 0,-1;
@n=map~~<>,1..<>;
<>;
while(<>){
    $_=atan2(sin,cos)for@n;
    $y=abs($n[$-]+$_)<$p-.001
        ?$_
        :($_<=>0)*$p-$n[$-];
    $_+=$y for@n;
    $p-.001<abs$n[$-]&&++$-==@n&&last;
    $_-=$y;
    .001<abs&&redo
}
print$-

输入中的移动次数被丢弃,stdin的eof表示移动结束。


5

JavaScript 200

function f(i){with(Math)for(m=i.split('\n'),o=m.slice(1,t=+m[0]+1),m=m.slice(t+1),c=PI,p=2*c,r=0,s=1e-3;m.length;c%=p)abs(c-o[r])<s?r++:abs(t=m[0])<s?m.shift(c+=t):(b=t<0?-s:s,c+=p-b,m[0]-=b);return r}

编辑:这是一个动画示例,证明该求解器有效:http : //jsfiddle.net/F74AP/4/

动画的

该函数必须通过传递输入字符串来调用。
这是OP给出的示例的调用:

f("7\n0\n0.785398163\n3.14159265\n1.74532925\n4.71238898\n4.01425728\n0\n3\n-3.92699082\n3.14159265\n0.81245687");

3按预期返回。


2
从挑战出发,“ ...输入不得硬编码...”。除非我没有记错,否则这意味着您必须阅读它,并且还必须拥有完整的程序。这看起来就像一个函数。
Rainbolt 2014年

2
我不明白,这些值不是硬编码的!“ ...输入不得硬编码,但可以从标准输入,参数,控制台等中获取。 ” 关于完整程序,我看不到它的指定位置,无论如何,IMO,这是一个完整的JS解决方案。
Michael M.

我没有指定完整的程序,所以我只看功能没有问题。但是,输入指定为由换行符分隔,尚未排列到本机数组中。这应该很容易满足。
Geobits 2014年

1
@Geobits,我稍后将对其进行修改,看看这个小提琴:jsfiddle.net/F74AP/1
Michael M.

1
@Geobits,对!简单符号错误...已修复;-)
Michael M.
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.