ロダはによって作成されたストリームベースのスクリプト言語であるfergusq。
ローダでゴルフをするための一般的なヒントは何ですか?私は、コードゴルフの問題に適用でき、少なくともRödaに固有のアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。
回答ごとに1つのヒントを投稿してください。
ロダはによって作成されたストリームベースのスクリプト言語であるfergusq。
ローダでゴルフをするための一般的なヒントは何ですか?私は、コードゴルフの問題に適用でき、少なくともRödaに固有のアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。
回答ごとに1つのヒントを投稿してください。
回答:
これはおそらく最も重要なヒントです。ほぼすべてのゴルフローダプログラムでは、アンダースコアが使用されます。
アンダースコア構文は、for
ループの構文糖衣です。次のコード行は同等です。
ls""|fileLength x for x|sort|pull
ls""|fileLength _|sort|pull
各アンダースコアはfor
、ステートメントの周りにある目に見えないループに新しい変数を追加します。ループは、変数/アンダースコアごとにストリームから1つの値を取得し、値がなくなるまで繰り返します。
アンダースコアは、ステートメント内の任意の場所で使用できます。
a[x:y+1]=[1]*(1+y-x) /* Sets range x..y (inclusive) */
seq x,y|a[_]=1 /* 6 bytes less */
同じアンダースコア値を複数回参照する必要がある場合、または値を逆の順序で使用する必要がある場合は、アンダースコアの後に数値を配置できます。
a|[_^_1] /* maps x to x^x */
a|[_2-_1] /* maps each pair (x,y) to y-x, eg. [1,2,4,8] -> [1, 4] */
Rödaコードを記述するときは、一般に改行またはセミコロンを使用してすべてのステートメントを区切ることをお勧めします。しかし、ゴルフをするとき、すべてのセミコロンが本当に必要なわけではないことを知っておく価値があります。
これはセミコロン/改行がオプションである場所の不完全なリストです。次の文は、オペレータ(で始まるとき、それらのほとんどは適用されません(
、[
、+
、など)。
f x
)または括弧が使用されている場合(例f()
)|
、)
、]
または}
次のステートメントが演算子で始まる場合、セミコロン/改行はオプションです
{f(x)[y]}
と同じ){f(x);[y]}
。これはステートメントコンテキストでのみ機能し、関数呼び出しが式の場合は機能しません。x=(y)[z]
、x=(y);[z]
(と同じではありません)と同じx=((y)[z])
です。残念ながら、改行が必要な場所は次のとおりです。
++
と--
。[...]
。多くの場合、割り当てを再編成することでバイトを節約できます。例えば:
a=0;b=""c=[""]
b=""c=[b]a=0
x=f()y=i;z=a[0]
x=f()z=a[0]y=i
それはほとんどありません決してあなたが使用できるように、接尾文を使用して最適ではない{...}
の代わりにdo...end
。
いくつかの例:
x|unless[not(_ in y)]do[0]else[1]done
x|[0]unless[not(_ in y)]else[1]
if[p<0]do c+=p;a-=p done
{c+=p;a-=p}if[p<0]
if[_ in y]
代わりにできますか?
入力が要素のリストである場合、値を配列として取得するのではなく、ストリームから値を取得することが有益な場合があります。
ほとんどの場合、配列要素はストリームにプッシュされ、for
ループ(またはアンダースコア)を使用して配列要素が繰り返されます。とにかくストリームから要素が繰り返されるので、最初からそこにあるべきだと定義してみませんか?
たとえば、入力の数値の二乗和を計算するには:
{|a|a|[_^2]|sum} /* Removing a redundant argument */
{[_^2]|sum} /* saves 5 bytes */
文のコンテキストでは、括弧はオプションです。これは、引数が演算子で始まる場合でも適用されます。たとえば、[a()|sqrt-_]
はより短いです[a()|sqrt(-_)]
。ステートメントコンテキストではなく、式コンテキストの場合とa
同様に、後の括弧は必須a
です。
ただし、書き込み[a()|sqrt(_+1)*2]
は不可能であり、パーサーを支援するために追加の括弧が必要です[a()|sqrt((_+1)*2)]
。多くの場合、括弧で始まらないようにこのような式を書き換えることができます。[a()|sqrt 2*(_+1)]
[a()|atan2 _,_]
許可されます。
``
文字列を使用するでは""
、文字列、あなたはそれらを使用するために特定の文字をエスケープする必要があります。たとえば、バックスラッシュを印刷するには、などの文字列が必要"\\"
です。バックスラッシュをエスケープするための1バイトが追加されています。ただし、を使用する場合``
、この文字をエスケープする必要はなく、1バイトを節約できます。
print"\\" /* 9 bytes */
print`\` /* 8 bytes */
それだけでなく、``
文字列内に存在しない機能である$variableName
またはを使用して、文字列内の変数と式をエンコードできます。${expression}
""
これらの例"a"
では、変数の値と連結された文字列をb
末尾の改行で出力しています。
["a",b," /* 11
"] bytes */
[`a$b /* 8
`] bytes; encodes b in the string using $b */