首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网格上的骰子路径

网格上的骰子路径
EN

Code Golf用户
提问于 2020-09-23 09:01:02
回答 2查看 2.2K关注 0票数 33

在二维网格的起源处放置一个标准的模具,该网格向各个方向无限延伸。放置模具时,1朝上,2朝负y方向,3朝正x方向,如下图所示:

然后,你继续执行一系列的移动与模具,旋转它90度的运动方向。例如,如果你首先在负x方向旋转模具,a 3向上,2朝负y方向,6朝正x方向。

+y, +y, +x, +x, -y的一系列动作如下图所示,以及用于澄清的模具网(有时称为“右手模具”)。

然后,在每次移动之后,我们开始读取模具的顶部。在本例中,它将读取2, 6, 4, 1, 2,我们称之为骰子路径。注意,我们不包括模具的顶部在其初始位置,但它始终是1。

如果模具的路径是这样的,它返回到它在运动结束时开始的正方形,我们称之为返回原点的骰子路径。

挑战

给定一个非空的骰子路径作为输入(在列表或任何其他合理的格式中),如果骰子路径返回原点,则打印一个真实的值,否则打印一个falsy值。请注意:

  • 你输出的真实值和虚假值不一定是一致的,但是你不能交换它们(例如。输出返回原点的路径的假值,否则输出真实值)
  • 输入将格式良好,并表示有效的骰子路径。
  • 模具偏离原点有多远是没有限制的。

测试用例

代码语言:javascript
复制
Path                            -> Output
2,1                             -> true
3,1                             -> true
5,4,1,5                         -> true
2,4,1,2                         -> true
4,2,4,1                         -> true
2,4,6,2,4,6,5,4                 -> true
2,4,5,1,4,5,3,6,5,1             -> true
5,6,2,3,5,4,6,3,1,5,6,2         -> true
2,4,1,3,5,1,3,5,6,3,5,6,4,5,6,2 -> true
2                               -> false
4,5                             -> false
5,1,2                           -> false
5,6,2,1                         -> false
5,4,6,5,4,6                     -> false
5,6,4,1,5,4,2,6,5,4             -> false
5,1,2,1,5,6,5,1,2,6,4           -> false
4,6,3,1,5,6,2,1,3,6,4,1         -> false

评分

以字节为单位的最短代码获胜。

EN

回答 2

Code Golf用户

发布于 2020-09-23 11:01:19

J,79字节

将骰子路径作为装箱0到5的反向列表。

代码语言:javascript
复制
0 0-:[:+/(0,(,-@|.)=i.2){~]i.~&>[:}.(]A.~0 224 283 389 489{~i.~)&.>/\.@,&(<i.6)

在网上试试!

是如何工作的

我们有起始骰子作为列表0 1 2 3 4 5。寻找下一个最高的数字,我们要么1 2 3 4作为它的索引(05将是非法的举动)。以anagram索引224 283 389 489为例,我们改变了列表,执行骰子移动。我们对整个路径都这样做,并收集中间结果:0 1 2 3 4 5│4 0 2 3 5 1│3 0 4 1 5 2。同样,在查找索引之后,我们将它们映射到协调更改_1 0, 0 _1, 1 0, 0 1,对它们进行求和,并检查它们是否在0 0结束。

应该通过重新映射骰子号6到4、5到3、…来保存字节。,以保存两个虚拟零(0,0 ),方法是将可能的索引移到0 1 2 3。但这感觉太不对劲了,所以我会先想出另一个解决方案。:-)

票数 8
EN

Code Golf用户

发布于 2020-09-25 08:52:14

Python 2,91字节

代码语言:javascript
复制
a=b=1
t=0
for c in input():t=1+t*1j**(a*c*(a*a-c*c)*b**5%7*2/3+2*(a==c));a,b=b,c
print t==0

在网上试试!

其思想是将每一个连续模具表面的三重奏转换为模具路径的相应转弯。可能的转弯方向是左转、右转、直转或倒转,所有这些都是相对于模具先前的移动而采取的。从旋转的顺序,我们跟踪模具的当前坐标,并检查它是否返回原点。而不是跟踪模具的面向方向,我们只是旋转整个坐标系围绕它旋转,然后移动它。

这样做意味着我们不需要跟踪模具本身的状态--只需要查看输入序列的本地片段就够了。我们也不使用任何硬编码的值或魔术数字。

棘手之处是从三个连续的模具面中提取转弯方向。我们可以检测到,如果第一和第三面相等的话,它会翻一倍,当第一和第三面是相反的时候,它会直接向前移动,所以它们加到了7。

在其余的情况下,它仍然要检测bug是左转右,即脸的三重是左手还是右手。为此,我们借用了从侧视图确定骰子值的CW解决方案的一个代数技巧。表达式3*a*c*(a*a-c*c)将等于b-b模块7,这取决于三元组是右手还是左手。在此基础上,将四个旋转方向的情况转化为等于0,1,2,3模4的数,这样就可以利用复指数1j**得到正确的复旋转。

票数 6
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/211527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档