Befungeでのゴルフのヒント


12

Befungeでゴルフをするための一般的なヒントは何ですか?私は、少なくともBefungeに特有のゴルフ問題全般のコーディングに適用できるアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。回答ごとに1つのヒントを投稿してください。


これは、一般的にBefungeに変更する必要がある場合、私はわからないんだけど、Befunge 93は98よりもゴルフのためにはるかに少ない理想的です
ジャスティン

6
Befunge 93の最近のトピックがありましたが、代わりにこのトピックを一般化する方が良いと思います。大丈夫ですか?(そして、おそらくどのヒントがどのバージョンに適しているかをマークします
。Pythonの

回答:


9

複数行ループを使用する場合は、できるだけ多く使用するようにしてください。

>1234....v
^        <

>1234v
^....<

7

条件の後に値をドロップする必要があります(たとえば、他のパスは値に依存しますが、このパスは依存しません)。>$またはを使用する代わりに$<、変数の真理値を知っているという事実を利用して、_両方の変化方向に代わり、スタックをポップ。

'* : 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/ :!#^_ \.

6

0常にスタック上にあることを忘れないでください。たとえば、これは、空のスタックでgは、と同等で00gあり、と同等であることをp意味し000pます。


5

15より大きい数値をプッシュする必要がある'場合は、次の文字のASCII値を取得するために使用します。

'*

以下よりも42をプッシュします。

4a*2+

または、67*あまりにも機能します
ドアノブ

4
@Doorknob多分私は自分の主張を明確にするために素数を選択すべきだったかもしれませんが、42はそのような素晴らしい数です。
ジャスティン

2
このヒントはBefunge-96以降にのみ適用されることに注意してください。Befunge-93はこの'命令をサポートしませんでした。
ジェームズホルダーネス

4

を使用する代わりに|、別の行(多くの場合は余分なスペースが必要)を要求する代わりに、を使用してみてくださいj。例えば:

01-`j@more code here

スタックの一番上の数字が負の場合は停止し、それ以外の場合は続行します。あなたが複数の文字が必要な場合は、使用n*j場所はnに渡された値がときに必要な文字数ですjです0。例:

01-`4*j01-*more code

これは負の数を無効にします。


このヒントはBefunge-96以降にのみ適用されることに注意してください。Befunge-93はこのj命令をサポートしませんでした。
ジェームズホルダーネス

4

Befunge-93では、スタックに最初にプッシュする文字列が文字列である場合、開始引用符をドロップすることで逃げることができます。例えばこれは:

"!iH",,,@

これに簡略化することができます:

!iH",,,@

オンラインでお試しください!

何が起きているかは、インタプリタが最初に引用符で囲まれていない文字列の文字を実行しようとすることです。!無害を実行しない、とiH(いくつかの実装にあなたが警告を受けるかもしれないが)、彼らは無視しているので、有効な指示ではありません。

ときに"遭遇され、その文字列の先頭と考えられているが、ない終了引用符がないのでなるまで、それはすべての方法、プレイフィールドを包む"二度目に遭遇しています。最終的にスタックにプッシュされるのは次のとおりです。

,,,@  ···72 spaces···  !iH

ただし、私たちは最後の数文字しか気にしないので、他のことは重要ではありません。したがって、引用の後、最終的に3つの,コマンドを実行し、メッセージを書き出し、@コマンドを終了します。

これはBefunge-98では通常動作しないことに注意してください。認識されない命令は、インタプリタが無視するのではなく反映するためです。


Befunge-98では、代わりに行の末尾に必要な文字列を置くことができます。",,,@!iH。Pyfungeは余分なスペースを追加しますが、FBBIは追加しないことに注意してください。
ジョーキング

@JoKingあなたが指摘したように、振る舞いはインタープリターごとに異なるため、私はそれを提案したくありませんでした。そして、それが機能しているように見えても、一貫性がありません(この場合はFBBIに余分なスペースがあることに注意してください)。
ジェームズホルダーネス

うーん...スペースは実際には仕様の一部かもしれないと思う。複数のスペースがスキップされ、単一のスペースとしてカウントされることをどこかで読んだことを覚えています。PyFungeとFBBIの両方の。PyFungeが暗黙的に余分なスペースを追加する一方で、FBBIは最長の行の長さまで各行を埋めるようです。
ジョーキング

そのとおりです。仕様では、文字列内の複数のスペースは単一のスペースとして扱われるべきであるとしています。実際、このルールは、無限のプレイフィールドで文字列をラップする問題に対処するために特別に提案されました(したがって、PyFungeは明らかに正しいです)。しかし、仕様のラッピングアルゴリズムの説明は解釈に多少開かれているため、実装によっては異なる処理が行われる理由を理解できます。しかし、一番下の行は、これはかなり複雑な問題であり、Befunge-97 / 98に固有の別のヒントとしてカバーする方が良いと思います。
ジェームズホルダーネス

4

Befunge-93では、ループを1行にフラット化して、コードのループセクションを両方向で実行すると有利な場合があります。

たとえば、文字をa8回出力する次のコードを考えます。

"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行バージョンのコードとどのように一致するかを明確に見ることができます。


3

終了コードによる出力。これは許可された出力フォームです。チャレンジで1つの数字を印刷するように要求された場合、プログラムを終了するq代わりに1バイトを保存できます。.@


2
このヒントはBefunge-98以降にのみ適用されることに注意してください。Befungeの以前のバージョンでは、q命令に異なる機能(キューモード)があったか、サポートされていませんでした。
ジェームズホルダーネス

3

Befunge-93では、文字入力コマンド(~)は、EOFで返される値であるため、-1のショートカットとしてよく使用されます。

例として、以下のコードは-1を出力します。

~.@

オンラインでお試しください!

これは、プロダクションコードではお勧めしません。対話型環境で実行すると、プログラムが一時停止してユーザー入力を待つためです。また、ユーザーが何かを入力した場合、結果は-1でなくなります。

とはいえ PPCGのルールは、プログラムが空の入力ストリームを想定し、それが通常TIOで実行される方法です。

また、プログラムが入力ストリームから何かを読み取る必要があるという理由だけで、必ずしもこのトリックの使用を排除されるわけではないことに注意してください。入力を前もって処理し、その後のすべての使用が~-1を返すことを確認する必要があります。



2

0k次の命令を実行しないことを忘れないでください。これは、次のことを行う代わりに:

;some boolean test;!jv;code if false;
       ;code if true;<

キャラクターを保存するには

;some boolean test;kv;code if false;
      ;code if true;<

このヒントはBefunge-98以降にのみ適用されることに注意してください。Befungeの以前のバージョンはこのk命令をサポートしていませんでした。
ジェームズホルダーネス

1

忘れないで kオペレーターを。代わりに"!dlroW olleH",,,,,,,,,,,,@、行います"!dlroW olleH"bk,@。注k操作を行うことがであることをセルにそう9k,ではない9回が、10を印刷します。で9回k、で1回,


1
このヒントはBefunge-98以降にのみ適用されることに注意してください。Befungeの以前のバージョンはこのk命令をサポートしていませんでした。
ジェームズホルダーネス

1

スタックに小さな数字を押すと、あなたはおそらく簡単に十分なことを把握することができ45*ますを取得します20、と67*あなたを取得します42。しかし、より大きな数になると、最も効率的な表現を計算できるプログラムが本当に必要になります。

これに対する最も簡単なオプションは、MikeSchwörerのBefunRepのオンラインインターフェイスです。数字を入力するだけで、同等のBefunge表現が吐き出されます。常に最適であるとは限りませんが、十分に近いため、手で思いつくものよりも優れていることはほぼ確実です。

オンラインシステムは0〜16777215の範囲の数値に制限されているため、それより大きなものが必要な場合は、スタンドアロンのBefunRepユーティリティをダウンロードして、自分で計算を実行します。

Befunge-98でプログラミングしている場合、考慮すべきもう1つのオプションはFungifyです。一般に、BefunRepほど最適ではありませんが、16進数と一重引用符が最も効果的である一部の低い数値では、より良い結果が得られる場合があります。


Befunge 98で小さい数をプッシュするときは、を使用します'。例42'*
ジャスティン

@Justin最後の段落で言及しましたが、このヒントの要点は、単にツールを使用して数値を生成するためのこれらのトリックの多くを知る必要がないということです。
ジェームズホルダーネス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.