6種類のフルーツループ、と言いますか?それはHexagonyが何であったかで作られたため。
){r''o{{y\p''b{{g''<.{</"&~"&~"&<_.>/{.\.....~..&.>}<.._...=.>\<=..}.|>'%<}|\.._\..>....\.}.><.|\{{*<.>,<.>/.\}/.>...\'/../==.|....|./".<_>){{<\....._>\'=.|.....>{>)<._\....<..\..=.._/}\~><.|.....>e''\.<.}\{{\|./<../e;*\.@=_.~><.>{}<><;.(~.__..>\._..>'"n{{<>{<...="<.>../
さて、そうではありませんでした。なんてこった、私は自分自身に何をした...
このコードは、辺の長さが10の六角形になりました(19から始まりました)。おそらくもう少し、おそらくサイズ9までゴルフすることができますが、私の仕事はここで完了したと思います...参考のために、ソースには175個の実際のコマンドがあり、その多くは不必要なミラーです(またはキャンセルするために追加されました)交差するパスからコマンドを出力します)。
見かけの直線性にもかかわらず、コードは実際には2次元です。Hexagonyは通常の六角形に再配置します(これも有効なコードですが、Hexagonyでは空白はすべてオプションです)。以下に、展開されたコードを示します...「美」とは言いたくありません。
) { r ' ' o { { y \
p ' ' b { { g ' ' < .
{ < / " & ~ " & ~ " & <
_ . > / { . \ . . . . . ~
. . & . > } < . . _ . . . =
. > \ < = . . } . | > ' % < }
| \ . . _ \ . . > . . . . \ . }
. > < . | \ { { * < . > , < . > /
. \ } / . > . . . \ ' / . . / = = .
| . . . . | . / " . < _ > ) { { < \ .
. . . . _ > \ ' = . | . . . . . > {
> ) < . _ \ . . . . < . . \ . . =
. . _ / } \ ~ > < . | . . . . .
> e ' ' \ . < . } \ { { \ | .
/ < . . / e ; * \ . @ = _ .
~ > < . > { } < > < ; . (
~ . _ _ . . > \ . _ . .
> ' " n { { < > { < .
. . = " < . > . . /
説明
このゴルフバージョンのすべての複雑な実行パスを説明しようとはしませんが、アルゴリズムと全体的な制御フローはこのアルゴリズムなしと同じです。
) { r ' ' o { { \ / ' ' p { . . .
. . . . . . . . y . b . . . . . . .
. . . . . . . . ' . . { . . . . . . .
. . . . . . . . \ ' g { / . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . > . . . . < . . . . . . . . .
. . . . . . . . . . . . . . > . . ) < . . . . .
. . . . . . . . . . / = { { < . . . . ( . . . . .
. . . . . . . . . . . ; . . . > . . . . . . . . . <
. . . . . . . . . . . . > < . / e ; * \ . . . . . . .
. . . . . . . . . . . . @ . } . > { } < . . | . . . . .
. . . . . / } \ . . . . . . . > < . . . > { < . . . . . .
. . . . . . > < . . . . . . . . . . . . . . . | . . . . . .
. . . . . . . . _ . . > . . \ \ " ' / . . . . . . . . . . . .
. . . . . . \ { { \ . . . > < . . > . . . . \ . . . . . . . . .
. < . . . . . . . * . . . { . > { } n = { { < . . . / { . \ . . |
. > { { ) < . . ' . . . { . \ ' < . . . . . _ . . . > } < . . .
| . . . . > , < . . . e . . . . . . . . . . . . . = . . } . .
. . . . . . . > ' % < . . . . . . . . . . . . . & . . . | .
. . . . _ . . } . . > } } = ~ & " ~ & " ~ & " < . . . . .
. . . \ . . < . . . . . . . . . . . . . . . . } . . . .
. \ . . . . . . . . . . . . . . . . . . . . . . . < .
. . . . | . . . . . . . . . . . . . . . . . . = . .
. . . . . . \ . . . . . . . . . . . . . . . . / .
. . . . . . > . . . . . . . . . . . . . . . . <
. . . . . . . . . . . . . . . . . . . . . . .
_ . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
正直なところ、最初の段落では、私は半分冗談を言っていました。6つの要素のサイクルを扱っているという事実は、実際に大きな助けになりました。Hexagonyのメモリモデルは無限の六角形グリッドで、グリッドの各エッジにはゼロに初期化された符号付き任意精度整数が含まれます。
このプログラムで使用したメモリのレイアウトの図を次に示します。
左側の長い直線ビットa
は、文字rに関連付けられている任意のサイズの0で終わる文字列として使用されます。他の文字の破線は同じ種類の構造を表し、それぞれが60度回転しています。最初に、メモリポインターは、北を向いた1というラベルの付いたエッジを指します。
コードの最初の、線形のビットは、内部文字の縁の「星」を設定roygbp
ならびに初期エッジを設定し1
、我々はここで、サイクル終了/(間始まる知っているように、p
そしてr
:)
){r''o{{y''g{{b''p{
この後、1というラベルの付いたエッジに戻ります。
アルゴリズムの一般的な考え方は次のとおりです。
- サイクル内の各文字について、STDINからの文字を読み続け、現在の文字と異なる場合は、その文字に関連付けられている文字列に追加します。
- 現在探している文字を読むと、?
e
というラベルの付いたエッジにを格納します。サイクルが完全でない限り、このキャラクターも食べなければならないと仮定する必要があるためです。その後、サイクル内の次のキャラクターにリングを移動します。
- このプロセスを中断するには、次の2つの方法があります。
- いずれかのサイクルを完了しました。この場合、サイクルの別のクイックラウンドを作成
e
し、?のすべてのを置き換えます。エッジn
sが、今はそのサイクルがネックレスに残りたいので。次に、コードの印刷に進みます。
- または、 EOFをヒットします(これは負の文字コードとして認識されます)。この場合、負の値を?に書き込みます。現在の文字の端(
e
との両方から簡単に区別できるようにn
)。次に、印刷コードに移動する前に、1つのエッジを検索します(潜在的に不完全なサイクルの残りをスキップします)。
- 印刷コードは再びサイクルを通過します。サイクル内の
e
各文字について、各文字の印刷中に保存された文字列をクリアします。次に、?に移動します。キャラクターに関連付けられたエッジ。否定的な場合は、単にプログラムを終了します。肯定的な場合は、単に印刷して次の文字に進みます。サイクルが完了したら、ステップ2に戻ります。
もう1つ興味深いのは、任意のサイズの文字列を実装した方法です(Hexagonyで無制限のメモリを使用したのは初めてだからです)。
ある時点でrの文字を読み続けており(図をそのまま使用できる)、a [0]とa 1がすでに文字で埋められていることを想像してください(それらの北西はすべてゼロです) )。たとえばog
、入力の最初の2文字をこれらのエッジに読み込んで、現在aを読み込んでいる可能性がありy
ます。
新しい文字がに読み込まれている中のエッジ。?を使用します この文字がに等しいかどうかを確認するためのエッジr
。(ここには巧妙なトリックがあります:六角形は正と非正を簡単に区別できるため、減算による同等性のチェックは厄介で、少なくとも2つのブランチが必要です。しかし、すべての文字は互いに2倍未満です。モジュロを取ることで値を比較できます。モジュロは、等しい場合にのみゼロを返します。
y
とは異なるためr
、(ラベルのない)エッジをinの左に移動し、y
そこにコピーします。ここで、六角形の周りをさらに移動して、inのy
反対側のエッジにあるまで、文字を1エッジずつコピーします。ただし、a [0]には既に上書きしたくない文字が既にあります。代わりに、y
次の六角形の周りを「ドラッグ」して1をチェックします。しかし、そこにもキャラクターがいるので、さらに六角形を進めます。これでa [2]はまだゼロなので、コピーしますy
それに。メモリポインタは、文字列に沿って内側のリングに向かって戻ります。a [i]の間の(ラベルのない)エッジはすべてゼロであるのに対し、?ポジティブです。
これはおそらく、一般的にHexagonyで自明でないコードを書くのに役立つテクニックでしょう。