Brachylogでのゴルフのヒント


19

Brachylogは、最近、コードゴルフで目立つようになり始めている言語です(そして、より簡潔な構文のメジャーアップデートを受け取ったばかりです)。Prologのように、問題がどのように見えるかを十分に正確に説明するだけで問題を解決できることが多いという利点があります。これは、適切な種類の課題では、トップゴルフ言語

Brachylogでゴルフをする(つまり、可能な限り短いプログラムを書く)ためのヒントはありますか?これは主に、幅広い言語に適用できるアドバイスではなく、特にBrachylogに固有のアドバイスを探しています。(Prologでのゴルフのヒントも参照してください。ただし、Brachylog以外の言語に適用するアプリケーションの量によっては、宣言型言語でのゴルフに関するヒントがここで適切である可能性があります。)

回答:


4

ネストされた述語を活用して新しい変数を作成する

Brachylogには、2つの特別な変数?(入力/左パラメーター)および.(出力/右パラメーター)を使用するための特別な構文ケースがたくさんあります。つまり、述語?and にアクセスする必要はないが、.変数を使用する必要がある場合、ネストされた述語を作成してその ? and を使用することで、バイトを節約できることがよくあり.ます。

簡単な例として、次のようなプログラムを考えてみましょう。

… A … ∧A … B … B …

これは、長いプログラムではかなり一般的な形です。結局のところ、何かを含む可能性のあるギャップがたくさんあります。私たちはは必要ありませんと仮定?または.3つのギャップの中心の内側を。その後、次のように書き換えることができます。

… { … & … . … } …

ここでは、ネストされた述語のは?の役割を提供しているA、そしてそのは.の役割を提供していますB。これは元のコードより1バイト短いことがわかります。に変更AABB{?.}てもバイトの点で変更はありませんが、これにより∧?略語に簡略化することができました&

関連するトリックは変更することです

∧. … ?∧

~{ … }

(これは1バイト短くなります)、ただし、代わりに呼び出し側に引数を交換させる方がほとんど常に安価であることに注意してください(述部がプログラム内の少なくとも3つの異なる場所から呼び出されない限り、これはBrachylogではまれです)。


3

長さ2の述部をメタ述部内で分割します

これは、例によって最もよく説明されます。リストの最初と最後の要素を削除するには、次のように斬り込みます:

bk

リストのすべての要素でこの操作を実行する場合、マップ操作を使用できます。

{bk}ᵐ

ただし、述部を2つに分割し、各部分を個別にマッピングする方が1バイト短くなります。

bᵐkᵐ

同じトリックをかなりの数のメタ述語で使用できます。

{bk}ᵐ  →  bᵐkᵐ
{bk}ˢ  →  bˢkˢ
{bk}ᶠ  →  bᶠkˢ
~{bk}  →  ~k~b

のような一部のメタ述語では、2つの部分に分割する汎用的な方法はありませんが、それでも作業中の特定のタスクで機能する分解を見つけることができる場合があります。


3

空のリストを空の文字列にキャストする

文字列を操作する[]とき、空の文字列が必要な場合に、使用するアルゴリズムが空のリストで必要なものを統一することがあります""

を使用して空のリストを空の文字列にキャストできます,Ẹ。これにより、左の変数に空の文字列が追加されます(これ,は実装された方法の悪用です)。

これには、左の変数が文字列の場合は何もしないという利点もあります。だから、あなたのプログラムが

{  
   some predicate that should always output a string, 
   but actually outputs [] instead of "" in specific cases
}

それから

{
  some predicate that should always output a string, 
  but actually outputs [] instead of "" in specific cases
},Ẹ

あなたが望むように動作します。


2

リスト内の単一要素の実行

このスニペットを検討してください。

ḅ∋≠

入力がリストまたは文字列の場合、出力は長さ1のサブリスト/サブストリングに統合されますが、これは等しい要素のより長い実行の一部ではありません。リストを等しい要素のブロックに分割し、要素がすべて異なるブロックを見つけます。シングルトンリストの代わりに要素自体を取得するhには、最後まで追加します。ここでこの構成を使用oして、入力文字列に1回だけ出現する文字を見つけました。

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