回答:
*
出力に使用スタックに文字列を残すことで出力できるため、で*
出力するのではなく、を使用して文字列を蓄積すると便利な場合がありますS
。「文字列を取得してスペースを追加する」ことが課題だったとすると、出力でそれを行う方法は次のようになります。
S( )S
*
一方、でそれを行う方法は1バイト短くなります。
( )*
問題は、出力に大量の蓄積がある場合、スタック上の出力要素を処理するのにバイトがかかる可能性があることです。
コードを大量に使用する必要がある場合は、そのコードをスタックに保存し、そのコードをときどき複製して評価するのが理にかなっています。これまでのところ、それは通常のUnderloadプログラミングです。残念ながら、スタックに値を長期間保持することは難しく、コードが冗長になる傾向があります。値がデータではなく関数であっても、それは事実です。繰り返し再利用する必要がある複数の関数がある場合、これはさらに悪化します。
いくつかの再利用された関数の恩恵を受けるかもしれない一種の大きなプログラムでは、あなたが使用できる解決策は、代わりに呼び出される方法に応じて目的のいずれかを満たすことができる1つの大きな関数を作成することですあるいは単なる呼び出しシーケンスを長く使用して経由して^
、慎重に書かれた機能を区別することができます^^
から^:^
から^*^
から^~^
あなたの4つの異なる、かなり短い配列)を与えます。この「辞書」には、複数回使用する文字列など、他の便利なものを保存することもできます。辞書を頻繁に使用する場合、それを一種の馬鹿にして、自分自身のコピーをスタックにプッシュすることは理にかなっているので、手動でコピーする必要がないことに注意してください:
将来使用する能力を失うことなく使用できるように。
^!!!!^
ました(特に、最小化セクションのページの他のいくつかの例でも使用しました)。
単純な例として、最も一般的に見られるブール値の実装は!()
false(つまり整数0)、およびnull文字列(true 1)ですが、論理XORに大きく基づく問題がある場合は、より多くのfalseおよび~
trueにnull文字列を使用する感覚(このデータ形式は(false)~(true)~^!
、を使用して他のブール形式に変換でき、*
XORの非常に簡潔な実装を可能にします。
この一般原則をさらに進めて、データ値の一部としてプログラムが後で必要とする関数を使用することができます。これにより、関数とデータを別々にスタックに保存する必要がなくなります。これにより、制御フローがかなり混乱する可能性がありますが、ゴルフをする場合、保守性はしばしば後部座席を取る必要があり、Underloadがとにかく使いやすいというわけではありません。
(!)
and (~!)
をブール値に使用していましたが、あなたのやり方はより良いようです。
教会の数字を減らす機能的に純粋な方法は、ラムダ計算の先行機能を使用することです。
\n.n(\p.\z.z($(pT))(pT))(\z.z0[whatever you define the predecessor of 0 to be])
ここで、0 = \ x。\ yy、T = \ x。\ yx、および$は後継者です。
Underloadで書き直され、これは28バイトです。
(!())~(!())~(!:(:)~*(*)*~)~^!
これは問題:!
あり()*
ませんが、Underloadの便利なプロパティの一部、つまり、no-ops を活用できます。番号ため、この手段n
、:ⁿ!!()()*ⁿ
(cⁿ
されたc
繰り返しn
回数)をN-1が得られます。たとえば、教会の数字3に対してこれを行うと、次のようになります。
:::!!()()***
ノーオペレーションペアを削除すると、次のようになります。
:*
どちらが2です。
したがって、これは新しく、より短い先行操作です。
:(:)~^(!!()())*~(*)~^*
これは7バイト短くなります。
(()~(:))~:(^!!())*~(*)~^**
は、まだ3バイト短くなっています。
アンダーロードには、実際には2つのスタックがあります。文字列のスタックと、ソースコードを構成するコマンドのスタックです。Underloadの^
命令により、文字列を前者のスタックから後者に移動できます。これを行うことで、不必要なスタック操作を大幅に節約できます。
たとえば(a)(b)(c)
、メインスタックにあり(c)
、get に無視して、下の2つの要素を連結したいとします(ab)(c)
。これを行う(c)(a)(b)
単純な方法は、スタックを回転させて取得し、次に連結してスワップバックすることです。
a~a~*~a*^*~
これは悪いです。使用してa~a~*~a*^
、このようなスタックを回転させることは非常にコストがかかり、かつ可能な場合は避けるべきです。(c)
代わりにプログラム空間に置くことにより、これを4バイト短くすることができます。
a(*)~*^
目的は、実行する命令を取得(c)
し、最後にプッシュバックする命令を追加して、結果を評価することです。これは、(c)
終了後にプッシュバックされるまで心配する必要がないことを意味します。
(*)~a*^
ますが、もう少し構成可能だと思います。基本的にジョイから~a*^
のdip
コマンドです。
eval
コマンドであることが好きです、私はそのような言語を見たことがありません。