回答:
これが冗談の質問であるかどうかは完全にはわかりませんので、真剣に受け止めてfor笑されないことを望みますが...
仕様では、プログラムは3つの改行で終了する必要が[LF][LF][LF]
あります。最初はフロー制御IMP、次の2つは終了コマンドですが、多くのインタープリターは適切な終了なしでコードを実行します。任意のプログラムで3文字を保存します。
ループのカウントなどにヒープを頻繁に使用していましたが、実際には非常に効率が悪いことに気付きました。最初にアドレスをプッシュし、現在のカウントを取得し、アドレスを取得/追加し、アドレスを再プッシュするなど。
スタックに値をプッシュしてループカウンターとして機能させ、[Space][LF][Tab]
swapコマンドを使用して必要なときにその値に戻ります。周りで多くの作業が必要になりますが、取得すると文字数を減らすことができます。
[LF][Space][Space][LF]
(フロー制御-ラベル ''でマーク)は、ジャンプまたはサブルーチン呼び出しの有効なターゲットである空のラベルを作成します。これにより、ラベルを宣言するときのバイトと、呼び出されるたびにバイトが節約されます。
功績@LukStormsに同様のアプローチを使用して、Hello Worldの挑戦のために彼の答え。
(STN
スペース、タブ、改行にそれぞれ使用されます。)
文字の値をプッシュするのは常に11バイトです(つまり、文字「A」の値65をSSSTSSSSSTN
プッシュするのは、文字「z」の値122をプッシュするのはSSSTTTTSTSN
)です。大量のテキストを出力したい場合、これは高価になる可能性があります。代わりに、印刷するすべての文字の値を一定量下げて、印刷するループでこの一定量を追加できます。
これは、次のコードで実行できます(この場合、固定値は100であると仮定しましょう)。
NSSN
(Label_0を作成します;基本的にループを開始します)
SSSTTSSTSSN
(定額100を押す)TSSS
(スタックの上位2つの値を一緒に追加します)TNSS
(現在正しい値を文字としてポップして印刷します)NSNN
(Label_0にジャンプし、ループの次の反復に移動します)これにより、スタック上にそれ以上何も追加しないでAdd()を実行しようとするとすぐに、エラー(metaに従って許可されます)でプログラムが停止TSSS
します。私はこれを使用して、この答えをゴルフに当てました(バイトカウントを下げるために行ったことの項目5および6を参照)。
100の固定量が最短のアプローチであるかどうかは、印刷する内容によって異なります。たとえば、@ LukStormはHello Worldの回答で107を使用しました。
SNS
同じ隣接する2つの文字のトップ値()のコピー(l
inなどHello
)、または他の位置からの値のコピーは、これに加えてさらに多くのバイトを使用できることに注意してください。
(STN
スペース、タブ、改行にそれぞれ使用されます。)
STS
+引数を使用して、スタック上の n 番目の項目(引数で指定)をスタックの一番上にコピーできます。場合によっては、これを使用してバイトを節約できます。
例えば、中に私のこの回答私は、第4項で説明したバイト数を下げるためにやったI第1回(0インデックス)値を(コピーする方法STSSTN
()文字「p」を作成するために、12を押しよりも短くなっていますSSSTTSSN
)"pop"
出力の一部。(注:文字 'p'には112ではなく値12を使用します。これは、ループ内の文字を印刷する前に追加する固定量だけすべての値を下げるという別のヒントを適用したためです。)