ローダでのゴルフのヒント


12

ロダはによって作成されたストリームベースのスクリプト言語であるfergusq

ローダでゴルフをするための一般的なヒントは何ですか?私は、コードゴルフの問題に適用でき、少なくともRödaに固有のアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。

回答ごとに1つのヒントを投稿してください。


ゴルフで私を倒すためのヒントを得ようとしていますか?:P(おそらくPythonページのヒントを見てください)
-HyperNeutrino

すごい、PCG.SEからの質問で、Hot Network Questionsに入りましたが、プログラミングのパズル/チャレンジではありません!:)
ペドロA

1
@HyperNeutrino Shhh .... :)
user41805

回答:


7

アンダースコアを使用する

これはおそらく最も重要なヒントです。ほぼすべてのゴルフローダプログラムでは、アンダースコアが使用されます。

アンダースコア構文は、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] */

3

一部のセミコロン/改行はオプションです

Rödaコードを記述するときは、一般に改行またはセミコロンを使用してすべてのステートメントを区切ることをお勧めします。しかし、ゴルフをするとき、すべてのセミコロンが本当に必要なわけではないことを知っておく価値があります。

これはセミコロン/改行がオプションである場所の不完全なリストです。次の文は、オペレータ(で始まるとき、それらのほとんどは適用されません([+、など)。

  • 割り当て後
  • 関数呼び出し後、少なくとも1つの引数がある場合(例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

1

サフィックス制御構造を使用する

それはほとんどありません決してあなたが使用できるように、接尾文を使用して最適ではない{...}の代わりに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]代わりにできますか?
-user41805

@KritixiLithosいいえ、条件をANDではなくORにしたいので。現在、少なくとも1つの値が含まれxているyかどうかもチェックしますが、条件は、すべてのxも含まれているかどうかをチェックしyます。(例はここからコピーされました)。
-fergusq

1

入力にストリームを使用する

入力が要素のリストである場合、値を配列として取得するのではなく、ストリームから値を取得することが有益な場合があります。

ほとんどの場合、配列要素はストリームにプッシュされ、forループ(またはアンダースコア)を使用して配列要素が繰り返されます。とにかくストリームから要素が繰り返されるので、最初からそこにあるべきだと定義してみませんか?

たとえば、入力の数値の二乗和を計算するには:

{|a|a|[_^2]|sum} /* Removing a redundant argument */
{[_^2]|sum}      /* saves 5 bytes */

1

文のコンテキストでは、括弧はオプションです。これは、引数が演算子で始まる場合でも適用されます。たとえば、[a()|sqrt-_]はより短いです[a()|sqrt(-_)]。ステートメントコンテキストではなく、式コンテキストの場合とa同様に、後の括弧は必須aです。

ただし、書き込み[a()|sqrt(_+1)*2]は不可能であり、パーサーを支援するために追加の括弧が必要です[a()|sqrt((_+1)*2)]。多くの場合、括弧で始まらないようにこのような式を書き換えることができます。[a()|sqrt 2*(_+1)]


括弧を必要とせずに関数に複数のパラメーターを渡すことも可能ですか?
-user41805

@KritixiLithosはい。例えば。[a()|atan2 _,_]許可されます。
fergusq

1

in / ステートメントの,代わりに使用..[]push

関連:の代わりに使用,and

push関数(ならびにprint機能)任意の数の引数を取り、無デリミタでそれらのそれぞれを出力することができます。

それはこのようなことを意味します

["a"..b]        /*8 bytes (string "a" concatenated with variable b)*/

に短縮することができます

["a",b]         /*7 bytes*/

1バイト節約。


1

[]/ push>print

printステートメントを使用しないでください。[]pushステートメントは常にゴルファーです。差printとは、push前者の出力改行後者はそうではないということです。ただし、これは回避できます。

print"a"              /* 8 bytes */
["a                   /* 6 bytes; uses a literal newline */
"]

print"a",b            /* 10 bytes */
[`a$b                 /* 8 bytes; uses a literal newline and `` strings */
`]

1

``文字列を使用する

では""、文字列、あなたはそれらを使用するために特定の文字をエスケープする必要があります。たとえば、バックスラッシュを印刷するには、などの文字列が必要"\\"です。バックスラッシュをエスケープするための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 */

1

,代わりに使用and

Rödaの条件はストリームであり、複数の値で構成できます。これらの値は、を使用して1つのブール値に削減されますand

これは、条件に置き換えand,複数の値をストリームにプッシュできることを意味します。

x if[a and b]
x if[a,b]

空の状態は真実です

値を含まない条件を持つこともできますが、これは真実です。

x while true
x while[]

1

フォームに置換リストを書く *"...;..."/";"

replace関数は通常、文字列のリストを引数として受け取ります。ただし、リストが非常に長い場合は、単純に正規表現と置換のペアを文字列に保存し、文字列を分割してスター演算子を使用すると便利です。

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