> <>(魚)、107 106 103バイト
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
オンラインでお試しください!
超ランダムではありませんが、ランダムです。文字列と整数をスタックに配置するだけです(例:「Hello world!」、5)。
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
完全な説明
説明を更新するまで、これはコードの少し古いバージョンです。ほとんど同じですが、読みやすいかもしれません。
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
文字列パラメータがsで、整数パラメータがのふりをしますi。
< v}:{r&" "
<ラップアラウンド左すぐに移動する魚、伝え" "スタックにcharactedスペースを追加し、。その後、魚がを通過し&、レジスタにスペースが追加されます。rスタックを反転し、スタックを{:}左に移動し(スタックiの最後に配置)、スタックの最後に値をコピーしてから、右に移動します。v魚が下方に動き始めるように指示します。
+1xv
+2<v
}
xランダムな方向に移動するように魚に指示し、最終的に魚は右に移動して下方に進むか、または通過する1+か2+事前に通過します。これらは、スタックの最後の数にそれぞれ1または2を追加します。魚が上方に移動すると、v再びヒットし、下方に移動します。}スタックを右に移動してから、スタックのi位置1に配置し、この新しい変数を位置0に配置します(これを呼び出しますm)。
:&:<~ v!?=&
このセクションは関数です。それをwhitespaceTrimmerと呼びましょう。そこから始まります<。スタックの最後(文字列の先頭)にあるスペースを、スペース以外の文字に達するまで削除します。
そのため、魚はすぐに泳ぎ<、左に移動しなければなりません。それから:&:&、スタックの最後に値をコピーし、レジスタのスペースをスタックの最後に配置し、コピーしてからレジスタに戻します。
次に、魚はをヒットし=?!v ~ます。具体的に=は、スタックから最後の2つの値(作成した2つ)をポップし、それらを比較し、等しい場合はスタックの最後に1を置き、0をオンにします異なる場合はスタックの最後。?それは、この場合にある次の命令、実行しない0である場合、スタックの末尾から新しい値をポップし!、それに代えて実行v下方(関数を出る)を移動し、注文魚。
ただし、1の場合はスペースが見つかったため!、トランポリンであるを実行します。これにより、魚は次の命令であるをスキップしv、魚は続行します。魚の前で、~スタックから最後の値(スペースであることが確認された)をポップするように指示していることがわかり、魚は続行し、関数を再度実行します。
?!;a6.>ol2-
魚はすぐにaによって右に泳ぐように指示さ>れ、スタックの最後の文字を出力しますo(これが最初に実行されるとき、これはの最初の文字ですs)。からスタックの長さを取得し、スタックの末尾にla 2を配置してから、-2を減算しlます。ヒットする?!;と、何?が起こるかを覚えて!、スタックが空の場合に魚がスキップし、着地します;、プログラムが終了します。
スタックに文字がまだある場合は、実行!して魚を跳ね返させ、;実行a6.してa(AKA 10)を保存し6、スタックの終わりに、のx, y座標であり.、を終了するスタックし、魚をテレポートします10, 6その位置の右側に命令を実行します(魚は右に泳いでいます)。
これはy、位置6がこの1つ下の行であることに気づいたときに聞こえるほど複雑ではありません。x位置10はでv、その右側はで、これはノーオペレーションです。これにより、魚は右に泳ぎ続け、実際にラインの先頭で実行を開始します...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
したがって、これは、文字の間にランダムテキストを追加する関数です。少し口が広いですが、それは私が少し余分にランダムにしようとしたからです。これをgenRandomCharsと呼びましょう。
これ:{{:}l1-[rvは実際には関数のセットアップであり、実際の関数自体のそれほど重要な部分ではありません。魚は最初に泳ぎ:{{、スタックの最後に値をコピーし、次に左に2回シフトします。iスタックの位置1にあったことを思い出すと、スタックiの終わりにいることがわかります。
次に、魚は:}そのコピーの上を泳ぎi、スタックを右にシフトし、スタックiの最初と最後の両方に配置します。l1-[魚にスタックの最後に長さを配置させ、そこから1を引いて[、新しいスタックを作成し、l-1(スタックの長さから1を引いた)値を新しいスタックに移動します(したがってi、古いスタックのままにします)。その後、魚は単にヒットrvし、スタックを再度反転します(新しいスタックを作成すると、何らかの理由でそれが反転すると思います)、魚がもう一度下に泳ぐように命令し、真に機能を開始します<真下でます。
それで、現在スタックの終わりにはm一時的なものiがありますti。すぐに魚が泳ぎ1-}、1を引いtiてスタックの先頭に移動します。その後:}、単にコピーmしてスタックの先頭に移動します(プットtiスタック位置1に配置)。
これは、私たちがこの小さなことをしたときです。
v2<
<1x|!
^3<
これは実際には非常に簡単です。これ!により、魚はスキップ|して実行されxます。何をxしているのかを思い出して、これにより魚が4方向に移動することを覚えています。|単に鏡であり、魚を泳がせるx。したがって、基本的に、魚はスタックの最後に1、2、または3を配置し、左に移動し続けます。
次に、魚が実行さ*+oれ、スタックの最後の2つの値がポップオフされ、乗算され、結果が押し戻され、同じものが加算され、最後の値がスタックからポップされて出力されoます。私たちのスタックは、[再びちょうど含む今比較的正常ですm、ti、s ]。
:}}:スタックの最後の値(基本的にはs位置0)をコピーし、スタックを右に2回シフト(ti前面に再度配置)してからtiコピーします。?!v今ではかなり簡単に理解できるはずです。基本的にti0の場合、で関数を終了しますv。それ以外の場合は、実行!してスキップしますv(別のループます)。
tiが0で、わずかにランダムな文字の出力が完了したら、実行して以下vを確認します。
v ~}}r]~<
.43<
ここであまり派手なものはありません。をti介してスタックから削除します~。それから]新しいもので、すべての値をスタックからポップし、古いスタックに配置します!逆転の問題のため、私たちがして、逆rに右二回スタックをシフトし、その後、}}~右にスタックをshufting、私たちを与える[ m、i、s]、~重複余分を削除することですs[0]、我々があれば、それを必要とするだろうとしての機能で以前からループを実行していました(しかし、そうではありません、終了しています)。vダウン泳ぐにするために魚を告げる>34.だけで、左とに泳ぐ魚を伝えている、(実行順序を示すために、反転)3, 4(ので.ジャンプであります!)。3, 4実際には始まりのすぐ右側ですwhitespaceTrimmer、これは私たちが左に移動しているので完璧です。
このすべてのロジックに従って、スタックが最終的に空になり、プログラムwhitespaceTrimmerが実行された直後に終了するまで、魚を追跡できます。