> <>(魚)でのゴルフのヒント


14

私は最近多くの> <>提出物を見ているので、ヒントページを用意するのは良い考えだと思いました。

密接に関連している場合を除き、投稿ごとに1つのヒントを使用してください。

公式Pythonインタープリター

オンラインインタープリター(いくつかのバグが存在しますが、ほとんどの場合に適しています)


9
エソランのページを見ていると気がついた。> <>の作成者の名前は「 "」のように聞こえるかもしれない。
mbomb007

魚に改行を印刷するにはどうすればよいですか?
キャプテンマン

@CaptainManでコードポイントを出力できます。o改行\nはASCII 10 なので、できますao
Sp3000

@Spに感謝します。私はのCR代わりにしようとしていて、の代わりLFにプッシュしていdましたa
キャプテンマン

回答:


5

0に対するチェック

通常、?!代わりにを使用すると0=?、バイトが節約されます。

ただし、?少しの再構築を行う余裕がある場合は、標準だけでも良い場合があります

?!vA
  B

?vB
 A

4

EOFの確認

EOFに到達すると、> <>は-1をスタックにプッシュします。これは、次の2つの方法のいずれかで確認できます。

:0(?
:1+?

EOFをチェックするために、これら2つは否定であるため、どちらがより有益かはプログラムの構造によって異なります。


3

新しい行の開始を回避するためにジャンプする

新しい行を開始すると、次の行の先頭の空白を大量に無駄にすることがあります。このような状況では、ジャンプが役立ちます。

例えば、

[lots of code here]>[loop body]v
                   ^ ......... <

次のように1行に収まるようにすることができます。

[lots of code here][loop body][jump]

実際の例として、Hello Worldプログラムを1行で示します。

"!dlroW ,olleH"l?!;oe0.

3

モジュラスを使用して入力を簡素化する

これはあまりにも単純なヒントかもしれないので、もしそうなら私はそれを単に置き換えるか削除します。

2つの文字「a」と「b」を入力し、それぞれに1と2を返すとします。おそらく最も理にかなっているので、おそらくこれには条件を使用します。この特定の例では、より簡潔な形式を使用します。

i:"a")+1+n

これは、入力が「a」よりも大きいかどうかを確認し、1を追加します。「a」は0と「b」1を返すため、1と2を返します。入力があれば、さらに先に進むことができます。

i:3%n

mod 3では、「a」と同等の数値である97は1になり、「b」である98は2になります。2つの異なる数値に対して、両方に固有の結果を与えるmodが保証されます。3つ以上の場合、ユニークな結果をもたらすmodがありますが、簡単な方法で最小のものを見つける数学的能力はありません(たとえば、{100,101,102,103}のセットがある場合、mod 104はその中の各値は、非常に有用な方法ではありません)。ただし、ほとんどの場合、入力がアルファベットの数文字に制限されているため、多くの場合、動作するmodを見つけることができます。

2つの数値aとbに固有の結果をもたらす最小のモジュラスを見つけるには、次のようにします。aとbの差の絶対値(|a - b|)を取得し、それを分割しない最小数nを見つけます。たとえば、97と98の場合|98 - 97| = 1、2が最小のmodになります(ただし、テストプログラムでは、97に1を、98に0を与えるため、mod 3の方が優れています)。


3

ジャンプを条件として使用する

場合によっては、さまざまな入力を受け取ったときにさまざまなことを行う必要がある> <>でプログラムを書くことになります。通常、?これを解析するには条件()および方向変換器を使用します。場合によっては(特に処理する入力の数が少ない場合)正常に機能しますが、時々このような結果になることがあります。(このコードは他のトリックを使用して削減できるという事実を無視してください、それはデモンストレーションのためだけです)

i:"a"=?v:"b"=?v"c"=?v>
  .00n1< .00n2<.00n3<

これは問題ありませんが、いくつかの空白(個人的には見たくない)があり、繰り返しが多くあります(=?vおよび.00n)。その代わりに、ジャンプと異なる行を条件として使用できます。以下に例を示します。

i:"a")$"b")+1+0$.>
v1
v2
v3
<.00n

これにより、10バイト削減されます。ここで何が起こっているのですか:

i: 入力を1回複製して、2回評価できるようにします

"a")$"b")+これはそれ自体のヒントかもしれませんが、ここで行っているのは、入力が文字「a」よりも大きいかどうかを確認し、文字「b」よりも大きいかどうかを確認し、結果を追加することです。「a」の場合、これは0、「b」の場合は1、「c」の場合は2になります。

1+0$.ここで魔法が起こります。この前の単純化の結果を取得して1を追加し(「a」に1、「b」に2、「c」に3を与えます)、0を押して値を交換します。ジャンプに到達すると、これらの文字に割り当てた値に対応する行(たとえば、「a」の行1)に移動します。NB行0はプログラムの先頭です。


1

2つの方法で実行できるコードを書く

トランポリン(!)は、コードを前後に(または上下に)実行する場合に非常に便利です。これらのシナリオはいくぶんありそうにありませんが、回文や同様の課題の場合、このヒントは役に立つでしょう。

次に例を示します。コードを1回実行してから、0に達するまでスタックをループして値を破棄し、その後ダウンします。ポインタはからこのループに入ります>。これを達成するためにジャンプを使用できます、例えば

?!v80.>ao (最初に改行を印刷したいとしましょう)

ただし、1回実行するコード(を>超えるコード)によって行が16文字より長くなる場合、3文字のジャンプは使用できなくなります。ただし、これは前後に実行するのが簡単な例です...

?!v!?<>ao>

前方に進み、改行?!vを出力し、値が0でない場合はそれを破棄します?。トランポリンのため、次をスキップして後方に移動します。同じことが起こり、0に達するまでループが続きます。

これは奇妙な特定の例ですが、いくつかの(おそらく多くはない)アプリケーションがあります。

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