我正在修补我自己在 Code Golf 语言设计方面的实验!我还没有将矩阵技巧放入标准包中,复制 GolfScript 的想法可能会有所帮助。但现在我正在改进基本的噱头。
无论如何,这是我的第一次尝试。代码中需要四个内部空格,但不需要换行:
.fFS.sSC L{#o@}W|[l?fM]H|[l?m]Z|[Tre[wH]iOD?j[rvT]t]
Ca|[st[xY]a KrePC[[yBKx][ntSBhXbkY][ntSBhYsbWx][xSBwY]]ntJskPCmFkSk]
Ga|[rtYsZ[rtXfZ[TaRE[xY]iTbr]iTbr]t]B|[gA|[ieSlFcA[rnA]]]
MeFI?a[rlA]aFV[NbIbl?n[ut[++n/2 TfCnIEfLtBRchCbSPieTHlTbrCHcNsLe?sNsZ]]
gA|[TfCaEEfZfA[prT][pnT]nn]ulBbr JmoADjPC[3 1]rK4]
它可能看起来像一只猫在我的键盘上。但是一旦你通过了一个叫做“糊状”的节省空间的小技巧(字面意思是节省空间),它就不是那么糟糕了。这个想法是 Rebmu 不区分大小写,因此使用大写交替运行来压缩符号。我没有这样做,而是FooBazBar => foo baz bar
应用不同的含义。 FOObazBAR => foo: baz bar
(其中第一个令牌是分配目标)与fooBAZbar => foo baz bar
(所有普通令牌)。
运行 unmush 时,您会得到更易读的内容,但会扩展为 488 个字符:
. f fs . s sc l: {#o@} w: | [l? f m] h: | [l? m] z: | [t: re [w h] i od?
j [rv t] t] c: a| [st [x y] a k: re pc [[y bk x] [nt sb h x bk y] [nt sb
h y sb w x] [x sb w y]] nt j sk pc m f k s k] g: a| [rt y s z [rt x f z
[t: a re [x y] i t br] i t br] rn t] b: | [g a| [ie s l f c a [rn a]]]
m: e fi? a [rl a] a fv [n: b i bl? n [ut [++ n/2 t: f c n ie f l t br
ch c b sp ie th l t br ch c n s l e? s n s z]] g a| [t: f c a ee f z f
a [pr t] [pn t] nn] ul b br j: mo ad j pc [3 1] r k 4]
Rebmu 也可以扩展运行它。还有详细的关键字(first
而不是fs
),您可以混合搭配。这是带有一些注释的函数定义:
; shortcuts f and s extracting the first and second series elements
. f fs
. s sc
; character constants are like #"a", this way we can do fL for #"#" etc
L: {#o@}
; width and height of the input data
W: | [l? f m]
H: | [l? m]
; dimensions adjusted for rotation (we don't rotate the array)
Z: | [t: re [w h] i od? j [rv t] t]
; cell extractor, gives series position (like an iterator) for coordinate
C: a| [
st [x y] a
k: re pc [[y bk x] [nt sb h x bk y] [nt sb h y sb w x] [x sb w y]] nt j
sk pc m f k s k
]
; grid enumerator, pass in function to run on each cell
G: a| [rt y s z [rt x f z [t: a re [x y] i t br] i t br] t]
; ball position function
B: | [g a| [ie sc l f c a [rn a]]]
W
是宽度函数,H
是原始数组数据的高度。数据永远不会旋转......但是有一个变量j
告诉我们应该应用多少个 90 度右转。
Z
当考虑到旋转时,函数会为我们提供调整后的大小,并且函数C
接受坐标对参数并将序列位置(有点像指针或迭代器)返回到该坐标对的数据中。
有一个数组迭代器G
,您将函数传递给它,它将为网格中的每个单元格调用该函数。如果您提供的函数曾经返回一个值,它将停止迭代并且迭代函数将返回该值。该函数B
扫描迷宫中的球,如果找到则返回坐标,或none
。
这是带有一些评论的主循环:
; if the command line argument is a filename, load it, otherwise use string
m: e fi? a [rl a] a
; forever (until break, anyway...)
fv [
; save ball position in n
n: B
; if n is a block type then enter a loop
i bl? n [
; until (i.e. repeat until)
ut [
; increment second element of n (the y coordinate)
++ n/2
; t = first(C(n))
t: f C n
; if-equal(first(L), t) then break
ie f l t br
; change(C(B), space)
ch C B sp
; if-equal(third(L),t) then break
ie th L t br
; change(C(n), second(L))
ch C n s L
; terminate loop if "equals(second(n), second(z))"
e? s n s z
]
]
; iterate over array and print each line
g a| [t: f c a ee f z f a [pr t] [pn t] nn]
; unless the ball is not none, we'll be breaking the loop here...
ul b br
; rotate according to input
j: mo ad j pc [3 1] r k 4
]
这个程序并不是特别聪明。这是我想法的一部分,即看看一个人可以通过不依赖任何技巧的简单、无聊的方法获得什么样的压缩。我认为它展示了 Rebmu 的一些新颖潜力。
看看一个更好的标准库如何影响解决方案的简洁性将会很有趣!
GitHub 上提供的最新评论源:rotating-maze.rebmu