私は最近多くの> <>提出物を見ているので、ヒントページを用意するのは良い考えだと思いました。
密接に関連している場合を除き、投稿ごとに1つのヒントを使用してください。
オンラインインタープリター(いくつかのバグが存在しますが、ほとんどの場合に適しています)
o
改行\n
はASCII 10 なので、できますao
。
CR
代わりにしようとしていて、の代わりLF
にプッシュしていd
ましたa
。
私は最近多くの> <>提出物を見ているので、ヒントページを用意するのは良い考えだと思いました。
密接に関連している場合を除き、投稿ごとに1つのヒントを使用してください。
オンラインインタープリター(いくつかのバグが存在しますが、ほとんどの場合に適しています)
o
改行\n
はASCII 10 なので、できますao
。
CR
代わりにしようとしていて、の代わりLF
にプッシュしていd
ましたa
。
回答:
これはあまりにも単純なヒントかもしれないので、もしそうなら私はそれを単に置き換えるか削除します。
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の方が優れています)。
場合によっては、さまざまな入力を受け取ったときにさまざまなことを行う必要がある> <>でプログラムを書くことになります。通常、?
これを解析するには条件()および方向変換器を使用します。場合によっては(特に処理する入力の数が少ない場合)正常に機能しますが、時々このような結果になることがあります。(このコードは他のトリックを使用して削減できるという事実を無視してください、それはデモンストレーションのためだけです)
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回実行してから、0に達するまでスタックをループして値を破棄し、その後ダウンします。ポインタはからこのループに入ります>
。これを達成するためにジャンプを使用できます、例えば
?!v80.>ao
(最初に改行を印刷したいとしましょう)
ただし、1回実行するコード(を>
超えるコード)によって行が16文字より長くなる場合、3文字のジャンプは使用できなくなります。ただし、これは前後に実行するのが簡単な例です...
?!v!?<>ao>
前方に進み、改行?!v
を出力し、値が0でない場合はそれを破棄します?
。トランポリンのため、次をスキップして後方に移動します。同じことが起こり、0に達するまでループが続きます。
これは奇妙な特定の例ですが、いくつかの(おそらく多くはない)アプリケーションがあります。