私はコードゴルフの言語デザインで自分の実験をいじっています!私はまだマトリックストリックを標準のバッグに入れていません。GolfScriptのアイデアをコピーすることはおそらく役立つでしょう。しかし、今は基本的なギミックの改良に取り組んでいます。
とにかく、これが私の最初の試みです。コードには4つの内部スペースがそのまま必要ですが、改行は必要ありません。
.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
(最初のトークンが割り当てターゲットである場合)vs 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