ホワイトスペースでのゴルフのヒント


14

ホワイトスペースでゴルフをするための一般的なヒントは何ですか?私はコードゴルフの問題に適用できるアイデアを探していますが、少なくとも空白に固有のアイデアも探しています(たとえば、「コメントの削除」は答えではありません)。

回答ごとに1つのヒントを投稿してください。


82
不要な空白を削除します。
KSFT

1
s / [^ [:space:]] // g
デジタル外傷

回答:


11

これが冗談の質問であるかどうかは完全にはわかりませんので、真剣に受け止めてfor笑されないことを望みますが...

ヒント1:プログラムを終了しないでください

仕様では、プログラムは3つの改行で終了する必要が[LF][LF][LF]あります。最初はフロー制御IMP、次の2つは終了コマンドですが、多くのインタープリターは適切な終了なしでコードを実行します。任意のプログラムで3文字を保存します。


6

ヒント2:できるだけ少ないヒープを使用する

ループのカウントなどにヒープを頻繁に使用していましたが、実際には非常に効率が悪いことに気付きました。最初にアドレスをプッシュし、現在のカウントを取得し、アドレスを取得/追加し、アドレスを再プッシュするなど。

スタックに値をプッシュしてループカウンターとして機能させ、[Space][LF][Tab]swapコマンドを使用して必要なときにその値に戻ります。周りで多くの作業が必要になりますが、取得すると文字数を減らすことができます。


5

任意のヒープアドレスを使用する

多くのインタープリターでは、0または1で開始してカウントアップする代わりに、任意のヒープアドレスへの読み取り/書き込みが可能です。新しい値(最小4バイト)をプッシュする代わりに、既存のスタック値(3バイト)を複製してアドレスとして使用できます。


+1。これは、負でないヒープアドレスにのみ適用されることに注意してください。したがって、スタックの最上部が負の整数である場合、ヒープアドレスとして使用できません。
ケビンクルーッセン


5

すべての文字を一定量下げ、ループで印刷する直前に追加します

功績@LukStormsに同様のアプローチを使用して、Hello Worldの挑戦のために彼の答え

STNスペース、タブ、改行にそれぞれ使用されます。)

文字の値をプッシュするのは常に11バイトです(つまり、文字「A」の値65をSSSTSSSSSTNプッシュするのは、文字「z」の値122をプッシュするのはSSSTTTTSTSN)です。大量のテキストを出力したい場合、これは高価になる可能性があります。代わりに、印刷するすべての文字の値を一定量下げて、印刷するループでこの一定量を追加できます。

これは、次のコードで実行できます(この場合、固定値は100であると仮定しましょう)。

  1. 文字のすべての値(固定量100を差し引く)を逆の順序でプッシュします
  2. NSSN (Label_0を作成します;基本的にループを開始します)
    1. SSSTTSSTSSN (定額100を押す)
    2. TSSS (スタックの上位2つの値を一緒に追加します)
    3. TNSS (現在正しい値を文字としてポップして印刷します)
    4. NSNN (Label_0にジャンプし、ループの次の反復に移動します)

これにより、スタック上にそれ以上何も追加しないでAdd()を実行しようとするとすぐに、エラー(metaに従って許可されます)プログラムが停止TSSSします。私はこれを使用して、この答えをゴルフに当てましたバイトカウントを下げるために行ったことの項目5および6を参照)。

100の固定量が最短のアプローチであるかどうかは、印刷する内容によって異なります。たとえば@ LukStormはHello Worldの回答で107を使用しました。

SNS同じ隣接する2つの文字のトップ値()のコピー(linなどHello)、または他の位置からの値のコピーは、これに加えてさらに多くのバイトを使用できることに注意してください。


4

未定義のラベルにジャンプすると、プログラムが終了します(インタープリターによっては)

これにより、実装固有の動作が開始されますが、これは許可されいると思います。

TIO(およびおそらく他のインタープリターは、少なくともideoneでは動作しません)は、存在しないラベルにジャンプしようとすると実行を停止します。ループから抜け出すために比較を行う必要がある場合、これにより、ブレークラベルを宣言しないことでバイトを節約できます。(例については、非表示テキストの印刷に関する私のコメントを参照しください。)


4

値0は、2進数のない数字として宣言できます

空白のチュートリアルでは、数値はビット/バイナリ桁の任意の数の幅にすることができると述べています。(必要な符号ビットを超えて)ないビットの数が値0の有効な表現であり、この手段[Space][Space][Space][LF][Space][Space][Space][Space][LF]の両方がスタックに値0をプッシュするが、前者は1バイト短いです。


0

以前の整数をコピーすると、新しい整数を作成するよりも短くなる可能性があります

STNスペース、タブ、改行にそれぞれ使用されます。)

STS+引数を使用して、スタック上 n 番目の項目(引数で指定)をスタックの一番上コピーできます。場合によっては、これを使用してバイトを節約できます。

例えば、中に私のこの回答私は、第4項で説明したバイト数を下げるためにやったI第1回(0インデックス)値を(コピーする方法STSSTN()文字「p」を作成するために、12を押しよりも短くなっていますSSSTTSSN"pop"出力の一部。(注:文字 'p'には112ではなく値12を使用します。これは、ループ内の文字を印刷する前に追加する固定量だけすべての値を下げるという別のヒントを適用したためです。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.