Befungeでゴルフをするための一般的なヒントは何ですか?私は、少なくともBefungeに特有のゴルフ問題全般のコーディングに適用できるアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。回答ごとに1つのヒントを投稿してください。
Befungeでゴルフをするための一般的なヒントは何ですか?私は、少なくともBefungeに特有のゴルフ問題全般のコーディングに適用できるアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。回答ごとに1つのヒントを投稿してください。
回答:
条件の後に値をドロップする必要があります(たとえば、他のパスは値に依存しますが、このパスは依存しません)。>$
またはを使用する代わりに$<
、変数の真理値を知っているという事実を利用して、_
両方の変化方向に代わり、スタックをポップ。
'* : v >$ .. @ Prints number in binary followed by the original
decimal number.
> :2%\2/ :!#^_ \.
になります
'* : v _ .. @ Since we know that the topmost value on the stack
will be 0, we combine `>$` into `_`.
> :2%\2/ :!#^_ \.
15より大きい数値をプッシュする必要がある'
場合は、次の文字のASCII値を取得するために使用します。
'*
以下よりも42をプッシュします。
4a*2+
67*
あまりにも機能します
'
命令をサポートしませんでした。
を使用する代わりに|
、別の行(多くの場合は余分なスペースが必要)を要求する代わりに、を使用してみてくださいj
。例えば:
01-`j@more code here
スタックの一番上の数字が負の場合は停止し、それ以外の場合は続行します。あなたが複数の文字が必要な場合は、使用n*j
場所はn
に渡された値がときに必要な文字数ですj
です0
。例:
01-`4*j01-*more code
これは負の数を無効にします。
j
命令をサポートしませんでした。
Befunge-93では、スタックに最初にプッシュする文字列が文字列である場合、開始引用符をドロップすることで逃げることができます。例えばこれは:
"!iH",,,@
これに簡略化することができます:
!iH",,,@
何が起きているかは、インタプリタが最初に引用符で囲まれていない文字列の文字を実行しようとすることです。!
無害を実行しない、とi
とH
(いくつかの実装にあなたが警告を受けるかもしれないが)、彼らは無視しているので、有効な指示ではありません。
ときに"
遭遇され、その文字列の先頭と考えられているが、ない終了引用符がないのでなるまで、それはすべての方法、プレイフィールドを包む"
二度目に遭遇しています。最終的にスタックにプッシュされるのは次のとおりです。
,,,@ ···72 spaces··· !iH
ただし、私たちは最後の数文字しか気にしないので、他のことは重要ではありません。したがって、引用の後、最終的に3つの,
コマンドを実行し、メッセージを書き出し、@
コマンドを終了します。
これはBefunge-98では通常動作しないことに注意してください。認識されない命令は、インタプリタが無視するのではなく反映するためです。
",,,@!iH
。Pyfungeは余分なスペースを追加しますが、FBBIは追加しないことに注意してください。
Befunge-93では、ループを1行にフラット化して、コードのループセクションを両方向で実行すると有利な場合があります。
たとえば、文字をa
8回出力する次のコードを考えます。
"a"9>1-:#v_@
^\,:\<
これは、ループシーケンスにブリッジ命令(#
)を散在させることにより、1行にフラット化できます。
"a"9>1#\-#,:#:>#\_@
空白以外の文字だけを見ると、これが元の文字よりも長い印象を受けるかもしれません。ただし、2行バージョンで必要な改行と追加のパディングを考慮すると、実際には4バイトを節約できます。
この特定のケースでは、そのシーケンス:#:
を単にに置き換えることができることに注意して、コードをさらに圧縮し:
ます。
"a"9>1#\-#,:>#\_@
実際には、同じ命令がどちらかの側で繰り返されるたびに #
コマンドの使用する場合はいつでも、それを1つの命令に単純化することができます。したがって、これはループを平坦化するときに常に注意する必要があるものです。
これがどのように機能するかを理解するには、ループシーケンスを2回書きます。1回は#
削除後のすべての文字(左から右に実行すると何が起こるか)、1回は#
削除前の文字(つまり右から左に実行)。
"a"9>1#\-#,:>#\_@
>1 - :> _ ; executing left to right
> \ ,: \_ ; executing right to left
これが、元の2行バージョンのコードとどのように一致するかを明確に見ることができます。
終了コードによる出力。これは許可された出力フォームです。チャレンジで1つの数字を印刷するように要求された場合、プログラムを終了するq
代わりに1バイトを保存できます。.@
q
命令に異なる機能(キューモード)があったか、サポートされていませんでした。
Befunge-93では、文字入力コマンド(~
)は、EOFで返される値であるため、-1のショートカットとしてよく使用されます。
例として、以下のコードは-1を出力します。
~.@
これは、プロダクションコードではお勧めしません。対話型環境で実行すると、プログラムが一時停止してユーザー入力を待つためです。また、ユーザーが何かを入力した場合、結果は-1でなくなります。
とはいえ、 PPCGのルールは、プログラムが空の入力ストリームを想定し、それが通常TIOで実行される方法です。
また、プログラムが入力ストリームから何かを読み取る必要があるという理由だけで、必ずしもこのトリックの使用を排除されるわけではないことに注意してください。入力を前もって処理し、その後のすべての使用が~
-1を返すことを確認する必要があります。
0k
次の命令を実行しないことを忘れないでください。これは、次のことを行う代わりに:
;some boolean test;!jv;code if false;
;code if true;<
キャラクターを保存するには
;some boolean test;kv;code if false;
;code if true;<
k
命令をサポートしていませんでした。
忘れないで k
オペレーターを。代わりに"!dlroW olleH",,,,,,,,,,,,@
、行います"!dlroW olleH"bk,@
。注k
操作を行うことがであることをセルにそう9k,
ではない9回が、10を印刷します。で9回k
、で1回,
。
k
命令をサポートしていませんでした。
スタックに小さな数字を押すと、あなたはおそらく簡単に十分なことを把握することができ45*
ますを取得します20
、と67*
あなたを取得します42
。しかし、より大きな数になると、最も効率的な表現を計算できるプログラムが本当に必要になります。
これに対する最も簡単なオプションは、MikeSchwörerのBefunRepのオンラインインターフェイスです。数字を入力するだけで、同等のBefunge表現が吐き出されます。常に最適であるとは限りませんが、十分に近いため、手で思いつくものよりも優れていることはほぼ確実です。
オンラインシステムは0〜16777215の範囲の数値に制限されているため、それより大きなものが必要な場合は、スタンドアロンのBefunRepユーティリティをダウンロードして、自分で計算を実行します。
Befunge-98でプログラミングしている場合、考慮すべきもう1つのオプションはFungifyです。一般に、BefunRepほど最適ではありませんが、16進数と一重引用符が最も効果的である一部の低い数値では、より良い結果が得られる場合があります。
'
。例42
:'*