Fueueは、実行中のプログラムがキューであるキューベースのエゾランです。
)$$4255%%1(~):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]](H-):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
オンラインでお試しください!
使い方
この説明は手に負えないかもしれません。その一方で、私は人々が従うことを望んでいる方法でそれをはるかに短く説明する方法を知りません。
Fueueチートシート
参照してくださいesolangウィキの記事、このプログラムで使用されていないいくつかの機能を含む詳細については、。
実行トレース構文
Fueueでは、数字の間を除き、空白はオプションです。次の実行トレースでは、特にプログラム構造の提案に使用されます。
- 関数を実行すると、その関数とその引数はスペースで囲まれた要素から引き離されます。引数の一部が複雑な場合、それらの間にもスペースが存在する場合があります。
- 多くの実行トレースは、左側で「遅延blob」に分割され、実質的なデータ操作を行う右側の部分から分離されています。次のセクションを参照してください。
中括弧{}
(Fueueでは使用されません)は、トレースで数式の整数結果を表すために使用されます。Fueueには負でないリテラルのみがあるため、これには負の数が含まれます。これは-
否定関数です。
さまざまなメタ変数名と...
値と略語を示すために使用されます。
戦術を遅らせる
直感的に、実行はキューを巡回し、通過するものを部分的に変更します。関数の結果は、次のサイクルまで再度作用することはできません。プログラムのさまざまな部分が相互作用しない限り、効果的に並行して進化します。
その結果、多くのコードは同期、特にプログラムの一部の実行を適切なタイミングまで遅らせることに専念しています。これをゴルフするための多くのオプションがあり、それらは実行サイクルをサイクルごとにトレースすることによってのみ理解できる読めないブロブにそれらの部分を変える傾向があります。
これらの戦術は、以下で常に個別に言及されるとは限りません。
)[A]
A
サイクルの遅延。(おそらく最も簡単で読みやすい方法です。)
~ef
要素e
を交換しますf
。これにより、要素の実行も遅延します。(おそらく最も読みにくいが、多くの場合、わずかな遅延で最も短い。)
$1e
単一の要素を遅延させますe
。
-
そして、%
(後者の数字を遅延させるために有用である0
と1
)。
- 行内の複数の等しい要素を遅延させる場合、
:
または$
単一の要素からそれらを作成するために使用できます。
(n
n
括弧で囲みます。これは、後で都合の良いときに削除できます。これは、数値を最初にブロックに入れずにコピーすることすらできないため、数値計算では特に重要です。
全体の構造
説明の残りの部分は、実行中のプログラムのセクションごとに7つの部分に分かれています。それらの大部分が繰り返されるより大きなサイクルは、「反復」と呼ばれ、キュー全体を通る単一パスの「サイクル」と区別されます。
初期プログラムがそれらの間でどのように分割されるかを以下に示します。
A: )$$4255%%1(~
B: ):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
C:
D: (H-
E:
F:
G: ):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
プログラムの最後にある大きな数字は、各ASCII値から30を引いて、文字ごとに2桁で残りを逆に10
エンコードします(たとえば、(
ます)。
より高いレベルでは、このプログラム(bignumで始まる)のデータは右から左に流れるが、制御は左から右に流れると考えることができます。ただし、低レベルでは、Fueueは常にコードとデータの区別を混乱させます。
- セクションGは、bignumをASCII数字(
0
整数としての数字など)にデコードし、48
最下位の数字を最初に分割します。15サイクルごとに1桁を生成します。
- セクションFには、セクションEが消費できるまで、生成された数字ASCII値(それぞれブロック内)が含まれます。
- セクションEは、生成された数字を一度に2つずつ処理し、フォームのブロックにペアにします
[x[y]]
、各ペアのエンコードされた文字を出力します。
- セクションDは、
[x[y]]
ブロックから徐々に構築された深くネストされたブロックで構成され、いったんすべての数字が含まれると、すべての数字を印刷してからプログラム全体を停止するように実行できます。
- セクションCはセクションDの構築を処理し、セクションEを再作成します。
- セクションBは、30サイクルごとにセクションCとそれ自体を再作成します。
- セクションAは、他のセクションの最後の反復までのサイクルをカウントダウンします。次に、セクションBを中断し、セクションDを実行します。
セクションA
セクションAは、プログラムの終了のスケジューリングを処理します。単一のスワップ関数に削減するには4258サイクルかかります~
。これにより、メインループを停止し、代わりにセクションDの実行を開始するセクションBを調整します。
)$ $4255% %1 (~
)$%%%...%% %0 [~]
)$%%%...% %1 [~]
⋮
)$ %0 [~]
) $1[~]
)[~]
~
$
関数は、次の4255のコピーを作成%
しながら、(
ラップ~
ブラケットです。
%
次の数値を0
との間で切り替えるために、最後のサイクルが使用されます1
。
- すべて
%
のが使い果たされる$1
と、[~]
(実質的にNOP)のコピーが1つ作成され、次のサイクルで)
ブラケットが削除されます。
セクションB
セクションBは、30サイクルごとにセクションCの新しい反復だけでなく、それ自体の再生成も処理します。
) : [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] [BkB]
)$ $24% %0 :< [~:)~)] ~ [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<] [BkB]
)$ %...%%% %1 < < [~:)~)] [BkB] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...%% %0 < [~:)~)[BkB]] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...% %1 [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
⋮
) $1 [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] (1)
~:) ~)[BkB] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
) : [BkB] ) [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<] (2)
) [BkB] [BkB] $11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<
- A
:
は次の大きなブロックを複製します(1つのコピーはとして省略されます[BkB]
))
最初のコピーからブラケットを除去します。
$$24%%0
セクションAと同様のカウントダウンを設定します。
- これはカウントダウンし、に
:<
変わり<<
、~
2つのブロックを交換して、新しいセクションCのコードを最後に配置します。
- 2つの
<
関数は、最後の2つのブロックを最初のブロックにパックします。これは通常の反復では冗長ですが、~
fromセクションAが最後にジョブを実行できるようにします。
- (1)カウントダウンが終了
)
すると、外側のブラケットが削除されます。次~:)
になる):
と~)
入れ替え)
部Cのコードの先頭に。
- (2)セクションBは初期サイクルに戻りました
)
が、a はブラケットを削除してセクションCの新しい反復の実行を開始しようとしています。
最後の反復では~
、上のセクション(1)にfromセクションAが表示されます。
~ ) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] (1)
[~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] )
~
スワップ)
から区間Bを防止ブロックを横切って、セクションCには、再度実行されます。
セクションC
セクションCは、新しい数字のペアをセクションDのブロックにマージし、セクションEの新しい反復を作成します。
以下は、数字のASCIIコードを使用x
したy
代表的な反復を示しています。非常に最初の反復では、入ってくる「D」および「E」の要素が最初である[H]
と-
以前のセクションEは任意の数字の文字ペアを生成するために実行していないように、代わりに。
C D E
$11~ ) ~<[[+$4--498+*-:~-10)):])<~] [)))~] < [)))~[...]] [x[y]]
~~~ ~~~ ~~~ ~~) [[+$4--498+*-:~-10)):])<~] < [)))~] [)))~[...][x[y]]]
~~~ ~~~ ) ~ [[+$4--498+*-:~-10)):])<~] [)))~[)))~[...][x[y]]]]
~~~ ~ ) [)))~[....]] [[+$4--498+*-:~-10)):])<~]
~~[)))~[....]] )[[+$4--498+*-:~-10)):])<~]
[)))~[....]] ~[+$4--498+*-:~-10)):])<~
- これは、この答えのために発見した別の同期方法を使用しています。
~
行に複数のスワップ関数がある場合、行は各サイクルで約2/3に縮小します(1 ~
つが2 つをスワップするため)が、時々、残りの~
sが破壊を引き起こすため、後続のものを慎重に操作します。
$11~
そのような行を生成します。次は、次のブロックで~
a <
を交換します。<
最後の別のセクションは、新しい数字ペアブロック(ASCIIコードとしての数字xとy)をセクションDブロックに追加します。
- 次のサイクルでは、
~
行に~~
残りがあり~
、次を上書きします)
。もう1つ<
は、セクションDを[)))~]
ブロックに追加します。
- 次に、スワップ
~
自体は、セクションDブロック全体で、次のブロックを新しいセクションEコードとスワップします。次に、新しい残り物が~
a )
をスワップし、最後~~
に~
行の最後の1つが)
ブラケットを削除したようにセクションEにスワップします。
最後の反復では、セクションA ~
が)
セクションBを横切ってセクションCに入れ替わりました。ただし、セクションCは非常に短命であるため、すでに消えており)
、セクションDの先頭で終わります。
セクションD
セクションDは、最後の大きな数字の印刷とプログラムの停止を処理します。プログラムの実行のほとんどで、セクションB〜Gが構築時に協力するのは不活性ブロックです。
(H -
[H]-
⋮
[)))~[H-]] After one iteration of section C
⋮
[)))~[)))~[H-][49[49]]]] Second iteration, after E has also run
⋮
) [)))~[...]] [49[48]] Final printing starts as ) is swapped in
))) ~[...][49[48]]
)) )[49[48]] [...]
)) 49 [48][...] Print first 1
) )[48] [...]
) 48 [...] Print 0
)[...] Recurse to inner block
...
⋮
)[H-] Innermost block reached
H - Program halts
- プログラムの最初のサイクルでは
(
、停止関数H
を括弧で囲みます。A-
は、数字のペアの代わりに、最初の反復のダミー要素として使用されます。
- 組み込まれる最初の実際の数字のペアは
[49[49]]
、11
数字の最後に対応します。
- 非常に最後の桁対
[49[48]]
(に対応する10
数字の開始時)は、実際にブロックに組み込まれていないが、これは、違いはありません)[A[B]]
と)[A][B]
の両方に旋回、等価ですA[B]
。
最後の反復の後、)
セクションBから右にスワップされたセクションが到着し、セクションDのブロックがブロック解除されます。)))~
各サブブロックの先頭には、すべての部品が正しい順序で実行されていることを確認します。最後に、最も内側のブロックにH
はプログラムの停止が含まれています。
セクションE
セクションEは、セクションGによって生成されたASCII数字のペアの結合を処理し、両方が対応するエンコードされた文字を出力し、結合されたペアのブロックをセクションCおよびDに左方向に送信します。
繰り返しますが、以下は、数字のASCIIコードを使用x
したy
代表的な反復を示しています。
E F
~ [+$4--498+*-:~-10)):] ) < ~ [y] [x]
) [+$4--498+*-:~-10)):] < [x] [y]
+ $4- - 498 +*- :~ -10 ) ) : [x[y]]
+--- -{-498} +*- ~~{-10} ) ) [x[y]] [x[y]]
+-- - 498 +* -{-10} ~ ) x [y] [x[y]]
+- -{-498} + * 10 x )[y] [x[y]]
+ - 498 + {10*x} y [x[y]]
+ {-498} {10*x+y} [x[y]]
{10*x+y-498} [x[y]]
[x[y]]
- 着信数字ブロックが交換され、次にyブロックがxブロックに追加され、ペアブロック全体がコピーされます。セクションCおよびDの最後まで1つのコピーが残されます。
- もう一方のコピーは再びブロック解除され、一連の算術関数が計算され
10*x+y-498
、エンコードされた文字のASCII値が計算されます。498 = 10*48+48-30
、48
SはASCII符号化を元に戻すx
とy
、一方30
のシフト符号化00–99
に30–129
すべての印刷可能なASCII文字を含みます。
- 結果の数値は実行するために残され、その文字が出力されます。
セクションF
セクションFは、ASCIIコードの数字を含む不活性ブロックで構成されています。セクションEは、Gが生成するのと同じ速度でそれらを消費するため、実行されるプログラムのほとんどについて、ここでは最大で2つです。ただし、最終印刷フェーズでは、いくつかの冗長な0
数字がここで収集されます。
[y] [x] ...
セクションG
セクションGは、プログラムの最後に大きな数字を分割し、最下位の数字を最初に分割し、ASCIIコードのブロックを他のセクションに左方向に送信します。
停止チェックがない0
ため、セクションDがH
関数を使用してプログラム全体を停止するまで、数字が0になったときに実際に数字を生成し続けます。
[BkG]
大きい開始コードブロックのコピーを省略します。これは、新しい反復を開始するための自己複製に使用されます。
最初のサイクルでの初期化:
) :~ : [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] ( 106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
) ~ ~ [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] [BkG] [10...11]
) [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] ~ [BkG] [10...11]
) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):] ~ : [10...11] [BkG]
典型的な反復N
は、分割する数を示します。
) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):] ~ : [N] [BkG]
) :~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+ :5 ) : [N] : [BkG]
) ~ ~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/] +5 5 ) [N] [N] [BkG] [BkG]
) [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/] ~ 10 N [N] [BkG] [BkG]
) ~:~ ~ ( [:~)*[):~[$1(+48]):~+]-:~~)10)~~] / N 10 [N] [BkG] [BkG]
) ~ : [:~)*[):~[$1(+48]):~+]-:~~)10)~~] ( {N/10} [N] [BkG] [BkG]
) [:~)*[):~[$1(+48]):~+]-:~~)10)~~] : [{N/10}] [N] [BkG] [BkG]
:~ )*[):~[$1(+48]):~+]- :~ ~)10 ) ~ ~ [{N/10}] [{N/10}] [N] [BkG] [BkG]
~~) *[):~[$1(+48]):~+]- ~~10 ) ) [{N/10}] ~ [{N/10}] [N] [BkG] [BkG]
) ~ * [):~[$1(+48]):~+] -10 ~ ) {N/10} [N] [{N/10}] [BkG] [BkG]
) [):~[$1(+48]):~+] * {-10} {N/10} ) [N] [{N/10}] [BkG] [BkG]
) :~ [$1(+48]) :~ + {-10*(N/10)} N [{N/10}] [BkG] [BkG]
) ~ ~ [$1(+48] ) ~ ~ {N%10} [{N/10}] [BkG] [BkG]
) [$1(+48] ~ ) {N%10} ~ [{N/10}] [BkG] [BkG]
$1( + 48 {N%10} ) [BkG] [{N/10}] [BkG]
( {48+N%10} BkG [{N/10}] [BkG] New iteration starts
[{48+N%10}] ....
- ここでの遅延blobは特に毛深いです。ただし、唯一の新しい遅延トリックは、2サイクルを遅延させる
+:5
代わりに使用することです。悲しいかな、プログラムのsの1つだけがこれに助けられました。--10
10
10
[N]
そして[BkG]
ブロックは、その後の一つのコピーが、重複しているN
ことにより、分割され10
。
[{N/10}]
が複製されると、さらに算術関数を使用してN
asの最後の桁のASCIIコードを計算し48+((-10)*(N/10)+N)
ます。このASCIIコードのブロックはセクションFに残されます。
[{N/10}]
のもう1つのコピーは[BkG]
ブロック間で交換され、新しい反復の開始を設定します。
ボーナスクイン(540バイト)
)$$3371%%1[~!~~!)!]):[)$$20%%0[):]~)~~[)$$12%%0[<$$7%~~0):~[+----48+*-~~10))]<]<~!:~)~~[40~[:~))~:~[)~(~~/[+--48):]~10]+30])):]]][)[H]](11(06(06(21(21(25(19(07(07(19(61(96(03(96(96(03(11(03(63(11(28(61(11(06(06(20(18(07(07(18(61(11(28(63(96(11(96(96(61(11(06(06(19(20(07(07(18(61(30(06(06(25(07(96(96(18(11(28(96(61(13(15(15(15(15(22(26(13(12(15(96(96(19(18(11(11(63(30(63(30(96(03(28(96(11(96(96(61(22(18(96(61(28(96(11(11(96(28(96(61(11(96(10(96(96(17(61(13(15(15(22(26(11(28(63(96(19(18(63(13(21(18(63(11(11(28(63(63(63(61(11(61(42(63(63
オンラインでお試しください!
どの方法が最も短いかわからなかったため、最初に文字を(
sで区切られた2桁の数字としてエンコードしようとしました。コアコードは少し短くなりますが、50%大きいデータ表現がそれを補います。他のゴルフほどゴルフはしていませんでした。1つの利点があります:bignumをサポートする実装は必要ありません。
その全体的な構造は、メインの構造といくらか似ています。データ表現がセクションFを直接埋めるため、セクションGがありません。ただし、セクションEは同様のdivmod計算を実行して、2桁の数字の桁を再構築する必要があります。