您说六种不同的水果圈吗?这就是Hexagony被制成了。
){r''o{{y\p''b{{g''<.{</"&~"&~"&<_.>/{.\.....~..&.>}<.._...=.>\<=..}.|>'%<}|\.._\..>....\.}.><.|\{{*<.>,<.>/.\}/.>...\'/../==.|....|./".<_>){{<\....._>\'=.|.....>{>)<._\....<..\..=.._/}\~><.|.....>e''\.<.}\{{\|./<../e;*\.@=_.~><.>{}<><;.(~.__..>\._..>'"n{{<>{<...="<.>../
好吧,不是。天哪,我对自己做了什么...
该代码现在是边长为10的六角形(始于19)。它可能可以打更多的球,甚至可以打到9号,但我想我的工作在这里完成了...作为参考,源中有175个实际命令,其中许多命令可能是不必要的镜像(或添加为取消)从交叉路径发出命令)。
尽管有明显的线性关系,但代码实际上是二维的:Hexagony会将其重新排列为规则的六边形(这也是有效的代码,但是在Hexagony中所有空格都是可选的)。这是展开的代码的全部...嗯,我不想说“ beauty”:
) { r ' ' o { { y \
p ' ' b { { g ' ' < .
{ < / " & ~ " & ~ " & <
_ . > / { . \ . . . . . ~
. . & . > } < . . _ . . . =
. > \ < = . . } . | > ' % < }
| \ . . _ \ . . > . . . . \ . }
. > < . | \ { { * < . > , < . > /
. \ } / . > . . . \ ' / . . / = = .
| . . . . | . / " . < _ > ) { { < \ .
. . . . _ > \ ' = . | . . . . . > {
> ) < . _ \ . . . . < . . \ . . =
. . _ / } \ ~ > < . | . . . . .
> e ' ' \ . < . } \ { { \ | .
/ < . . / e ; * \ . @ = _ .
~ > < . > { } < > < ; . (
~ . _ _ . . > \ . _ . .
> ' " n { { < > { < .
. . = " < . > . . /
说明
我什至不会尝试开始解释这个高尔夫球版本中所有复杂的执行路径,但是算法和总体控制流程与此非高尔夫球版本相同,在我对算法进行解释之后,对于真正好奇的人可能更容易研究:
) { r ' ' o { { \ / ' ' p { . . .
. . . . . . . . y . b . . . . . . .
. . . . . . . . ' . . { . . . . . . .
. . . . . . . . \ ' g { / . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . > . . . . < . . . . . . . . .
. . . . . . . . . . . . . . > . . ) < . . . . .
. . . . . . . . . . / = { { < . . . . ( . . . . .
. . . . . . . . . . . ; . . . > . . . . . . . . . <
. . . . . . . . . . . . > < . / e ; * \ . . . . . . .
. . . . . . . . . . . . @ . } . > { } < . . | . . . . .
. . . . . / } \ . . . . . . . > < . . . > { < . . . . . .
. . . . . . > < . . . . . . . . . . . . . . . | . . . . . .
. . . . . . . . _ . . > . . \ \ " ' / . . . . . . . . . . . .
. . . . . . \ { { \ . . . > < . . > . . . . \ . . . . . . . . .
. < . . . . . . . * . . . { . > { } n = { { < . . . / { . \ . . |
. > { { ) < . . ' . . . { . \ ' < . . . . . _ . . . > } < . . .
| . . . . > , < . . . e . . . . . . . . . . . . . = . . } . .
. . . . . . . > ' % < . . . . . . . . . . . . . & . . . | .
. . . . _ . . } . . > } } = ~ & " ~ & " ~ & " < . . . . .
. . . \ . . < . . . . . . . . . . . . . . . . } . . . .
. \ . . . . . . . . . . . . . . . . . . . . . . . < .
. . . . | . . . . . . . . . . . . . . . . . . = . .
. . . . . . \ . . . . . . . . . . . . . . . . / .
. . . . . . > . . . . . . . . . . . . . . . . <
. . . . . . . . . . . . . . . . . . . . . . .
_ . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
老实说,在第一段中,我只是在开玩笑。实际上,我们处理六个元素的周期实际上是一个很大的帮助。六边形的内存模型是一个无限的六边形网格,其中网格的每个边都包含一个有符号的任意精度整数,该整数初始化为零。
这是我在该程序中使用的内存布局图:
左侧的长直位用作a
与字母r关联的任意大小的0终止字符串。其他字母上的虚线表示相同类型的结构,每个结构旋转60度。最初,内存指针指向标记为1的边,朝北。
代码的第一个线性位将边的内部“星号” roygbp
设置为字母,并将初始边设置为1
,以便我们知道循环的结束/起点(p
和之间r
):
){r''o{{y''g{{b''p{
之后,我们回到标记为1的边缘。
现在,该算法的总体思路是:
- 对于循环中的每个字母,请继续从STDIN读取字母,如果它们与当前字母不同,则将它们附加到与该字母关联的字符串中。
- 当我们阅读我们正在寻找的字母时,我们
e
在标记为?的边中存储一个。,因为只要周期还没有结束,我们就必须假设我们也必须吃掉这个角色。之后,我们将在环上移动到循环中的下一个字符。
- 有两种方法可以中断此过程:
- 要么我们已经完成了循环。在这种情况下,我们将在循环中进行下一轮快速替换,替换?中的所有那些
e
。边加上s,因为现在我们希望该循环保留在项链上。然后我们继续打印代码。n
- 或者我们点击EOF(我们将其识别为负字符代码)。在这种情况下,我们将负值写入?中。当前字符的边缘(以便我们可以轻松地将其与
e
和区别开n
)。然后,在移至打印代码之前,搜索1边(以跳过可能不完整的循环的其余部分)。
- 打印代码再次经过该循环:对于循环中的每个字符,它会在打印
e
每个字符时清除存储的字符串。然后它移动到了?与角色关联的边缘。如果结果是否定的,我们只需终止程序即可。如果是正数,我们只需打印它,然后移至下一个字符。完成周期后,我们将返回第2步。
另一件可能有趣的事情是我如何实现任意大小的字符串(因为这是我第一次在Hexagony中使用无边界内存)。
试想一下,我们在某个地步,我们还在读书的角色- [R (所以我们可以使用图原样)和一个[0]和一个1已经充满了字符(一切西北部他们仍然是零)。例如,也许我们刚刚og
将输入的前两个字符读入这些边,现在正在读取y
。
新字符被读入in边缘。我们用?边检查此字符是否等于r
。(这里有一个巧妙的技巧:六边形只能轻松区分正数和非正数,因此通过减法检查相等性很烦人,并且至少需要两个分支。但是所有字母之间的相乘系数均小于2,因此我们可以通过取模来比较这些值,如果它们相等,它们只会给出零。)
由于y
是从不同的r
,我们向左移动的(未标记的)边缘中并复制y
那里。现在,我们围绕六边形进一步移动,每次将字符复制到另一个边缘,直到在iny
相对的边缘上。但是现在a [0]中已经有一个字符,我们不想覆盖它。相反,我们“拖”的周围跟旁边的六边形,检查一1。但是那里也有一个角色,所以我们进一步扩大了另一个六边形。现在a [2]仍为零,因此我们复制y
y
进去。现在,内存指针沿着字符串向内环移动。我们知道何时到达字符串的开头,因为a [i]之间的(未标记)边全为零,而?是?是积极的。
一般而言,这可能是一种有用的技巧,可以用Hexagony编写非平凡的代码。