Underloadでのゴルフのヒント


11

過少はによって作成されたスタックベースのセミ機能ターピットあるais523。私は最近、驚くほどエレガントな言語であるため、ゴルフをしようとしています。

アンダーロードでゴルフをするためのヒントはありますか?(回答ごとに1つのヒント)


私は、制御フローの唯一の形式がevalコマンドであることが好きです、私はそのような言語を見たことがありません。
ETHproductions

回答:


3

*出力に使用

スタック文字列を残すことで出力できるため、で*出力するのではなく、を使用して文字列を蓄積すると便利な場合がありますS。「文字列を取得してスペースを追加する」ことが課題だったとすると、出力でそれを行う方法は次のようになります。

S( )S

*一方、でそれを行う方法は1バイト短くなります。

( )*

問題は、出力に大量の蓄積がある場合、スタック上の出力要素を処理するのにバイトがかかる可能性があることです。


2

繰り返し再利用される関数の辞書を使用する

コードを大量に使用する必要がある場合は、そのコードをスタックに保存し、そのコードをときどき複製して評価するのが理にかなっています。これまでのところ、それは通常のUnderloadプログラミングです。残念ながら、スタックに値を長期間保持することは難しく、コードが冗長になる傾向があります。値がデータではなく関数であっても、それは事実です。繰り返し再利用する必要がある複数の関数がある場合、これはさらに悪化します。

いくつかの再利用された関数の恩恵を受けるかもしれない一種の大きなプログラムでは、あなたが使用できる解決策は、代わりに呼び出される方法に応じて目的のいずれかを満たすことができる1つの大きな関数を作成することですあるいは単なる呼び出しシーケンスを長く使用して経由して^、慎重に書かれた機能を区別することができます^^から^:^から^*^から^~^あなたの4つの異なる、かなり短い配列)を与えます。この「辞書」には、複数回使用する文字列など、他の便利なものを保存することもできます。辞書を頻繁に使用する場合、それを一種の馬鹿にして、自分自身のコピーをスタックにプッシュすることは理にかなっているので、手動でコピーする必要がないことに注意してください: 将来使用する能力を失うことなく使用できるように。


P:私はこれが問題になったことを過少に任意のプログラムの大きな十分だ前に、私は長い怒っを行くだろう
Esolangingフルーツ

私はかつて、私の好みのスタイルルックアップで辞書を作成する方法のいくつかの例をesolangsページに書き^!!!!^ました(特に、最小化セクションのページの他のいくつかの例でも使用しました)。
Ørjanヨハンセン

2

問題が必要とする操作に特化したデータ形式を選択する

単純な例として、最も一般的に見られるブール値の実装は!()false(つまり整数0)、およびnull文字列(true 1)ですが、論理XORに大きく基づく問題がある場合は、より多くのfalseおよび~trueにnull文字列を使用する感覚(このデータ形式は(false)~(true)~^!、を使用して他のブール形式に変換でき、*XORの非常に簡潔な実装を可能にします。

この一般原則をさらに進めて、データ値の一部としてプログラムが後で必要とする関数を使用することができます。これにより、関数とデータを別々にスタックに保存する必要がなくなります。これにより、制御フローがかなり混乱する可能性がありますが、ゴルフをする場合、保守性はしばしば後部座席を取る必要があり、Underloadがとにかく使いやすいというわけではありません。


以前は(!)and (~!)をブール値に使用していましたが、あなたのやり方はより良いようです。
エソランジングフルーツ

2

「ダーティ」デクリメント

教会の数字を減らす機能的に純粋な方法は、ラムダ計算の先行機能を使用することです。

\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バイト短くなります。


ただし、n = 0で中断します。動作させる必要がある場合(()~(:))~:(^!!())*~(*)~^** は、まだ3バイト短くなっています。
Ørjanヨハンセン

@ØrjanJohansen一般的に、n = 0の場合は特別なケースになります。Underloadの数値では0をデクリメントしても意味がないためです。
エソランジングフルーツ

1

不要なスタック値をプログラム空間に配置する

アンダーロードには、実際には2つのスタックがあります。文字列のスタックと、ソースコードを構成するコマンドのスタックです。Underloadの^命令により、文字列を前者のスタックから後者に移動できます。これを行うことで、不必要なスタック操作を大幅に節約できます。

たとえば(a)(b)(c)、メインスタックにあり(c)、get に無視して、下の2つの要素を連結したいとします(ab)(c)。これを行う(c)(a)(b)単純な方法は、スタックを回転させて取得し、次に連結してスワップバックすることです。

a~a~*~a*^*~

これは悪いです。使用してa~a~*~a*^、このようなスタックを回転させることは非常にコストがかかり、かつ可能な場合は避けるべきです。(c)代わりにプログラム空間に置くことにより、これを4バイト短くすることができます。

a(*)~*^

目的は、実行する命令を取得(c)し、最後にプッシュバックする命令を追加して、結果を評価することです。これは、(c)終了後にプッシュバックされるまで心配する必要がないことを意味します。


1
として書くこともでき(*)~a*^ますが、もう少し構成可能だと思います。基本的にジョイから~a*^dipコマンドです。
Ørjanヨハンセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.