web-dev-qa-db-ja.com

コードゴルフの問題を解決するためにどのようなテクニックが使用されていますか?

「レギュラー」ゴルフとコードゴルフ:

どちらも競技会です。どちらにも明確に定義された一連のルールがありますが、簡単にするために省略します。どちらにも明確な目標があります。つまり、「競合他社よりも少ないヒット/キャラクターを使用する」ということです。

試合に勝つために、アスレチックゴルファーは頼りにしています

  • 装置
    • いくつかの状況では、サンドウェッジが必要です。その他、9番アイアン。
  • テクニック
    • ドライブは、足が肩幅ほど離れていて、腕がリラックスしているときにうまく機能します。
  • と戦略
    • 確かに、あなたはその穴への直接の近道を取ることができます...しかし、あなたはそれらの木が邪魔で風がとても強いときにウォーターハザードやサンドバンカーを危険にさらしたいですか?長い道のりを回ったほうがいいかもしれません。

コードゴルファーは、アスリートゴルファーの装備、テクニック、戦略に類似しているものは何ですか?

これを始めるための回答例:適切なクラブを使用してください! C#の代わりにGolfScriptを選択してください。

4
Pops

あなたの言語の構文上の奇妙さについての完全な知識が助けになると思います。これが私がRubyコードゴルフをしているときに見つけたものです:

の代わりに

require "sequel"
require "nokogiri"
require "chronic"

あなたはこのようなことをすることができます:

 body_of_your_program if %w{sequel nokogiri chronic}.each{|i| require i}

このようなことで、あなたも信じられないほど手の込んだRubyワンライナー!

RubyおよびPerlでは、文字列や正規表現を使用してあらゆる種類の魔法を実行するために使用できる「$ _」のような魔法の変数も取得します。データは文字列ではありませんか?文字列に変換したい。

明らかに、Cではプリプロセッサがあなたの友達です。

3
Tom Morris

そしていつものように:あなたの図書館を知ってください!

ほとんどの問題について、重要な機能はすでに出荷されたライブラリにあります。もちろん、これには非冗長言語を選択する必要があります。そうしないと、必要な関数のインポートが短いインライン定義よりも長くなります。

2
FUZxxl

コードゴルフチャレンジを行うと、必然的にコードが短くなる一般的なデザインパターンのセットにたどり着きます。このセットは、コードゴルフチャレンジが増えるにつれて、または言語の通常の使用の過程で、時間の経過とともに増加します。

たとえば、インクリメンタルループが必要な場合、通常行うことの1つは次のとおりです。

_for ($i = 1; $i <= 10; $i++) {
  // code
}
_

または

_$i = 1;

while ($i < 10) {
  // code

  $i++;
}
_

しかし、これも常に機能します。

_while ($i++<10) {
  // code
}
_

その他のものは次のとおりです。

  • 標準ライブラリ関数の短いバージョンを使用する(fwrite()の代わりにfile_put_contents()
  • 変数を使用して式を繰り返す
  • 言語が角かっこと改行を処理する方法を利用する。ほとんどのコードゴルフでは、出力に複数の行にまたがる複雑なコードブロックが必要になることはめったにありません(空白が多い言語を使用している場合を除く)
  • 言語が出力を処理する方法を利用する(_<?=_はprintまたはechoよりも短い)
2
user8

ゴルフコードの課題に応じて、コーディングから始めます。最初のキャラクターの量を集めるのではなく、それが最初のステップです。最小の文字で最初からコーディングしようとすると、それが難しくなる可能性があります。その後、コードを最適化できる場所を探します(1文字の変数を使用する、チェーン操作を行うなど)。この部分では、ゴルフコードを実行している言語を習得する必要があります。それをよく理解すればするほど、キャラクターを救うTweakをよりよく知ることができます。

この戦略/テクニックの例:
https://stackoverflow.com/questions/3173415/code-golf-2d-platformer/3173614#3173614

装備に関しては、ほとんどのゴルフコードチャレンジでは、理想的な装備はチャレンジ専用に作られたカスタム言語を使用することです。その言語がすでに存在する場合もあれば、それを発明してそのインタプリタをコーディングできる場合もあります。

1
HoLyVieR