あなごるとは
Web 上でコードゴルフができるサイト Anarchy Golf を略して「あなごる」と呼ぶ。
「問題」のタイプ
あなごるには 3 種類の問題が存在する。
- active:
- 通常の問題
- endless:
- 制限時間の無い問題
- post mortem:
- 制限時間を過ぎた問題
問題一覧のページを開くと、問題へのリンク一覧が表示される。2007 年頃からの合計で、すでに 700 問を超えている。
リンクのうしろには (post mortem) や (endless) と付加されており、これが問題のタイプを表している。active の場合は、制限時間データ表示がなされている。
「問題」のページ
まずは、問題一覧のページなどから、問題のページを開く。
ページは、いくつかのセクションに分かれており、上から下に向かって以下のような構成になっている。
- 問題名
- Submit セクション
- Problem セクション
- Options セクション
- Sample input セクション
- Sample output セクション
- Ranking セクション
- Language Ranking セクション
これらについて、順番に一つずつ説明していく。
問題名
一番上には、問題の名前が表示されている。しばしば、問題名自体が、問題を解く手がかりとなる。
Submit セクション
Submit セクションにて、回答コードを入力して、投稿することができる。
投稿オプション
投稿に際しては、いくつかのオプションを選択することができる。
- Your name 入力ボックス:
- 自分の名前を入れる。匿名の場合は、空のままにしておくのもいいだろう。ログインの仕組みはないので、いくらでも詐称ができる。書き間違いに注意だ。
- File 入力ボックス:
- 言語の拡張子付きファイルを選択する。C のコードで書いたのなら、ファイル名を "test.c" などにしておく。
- use form ボタン:
- あるいは use form ボタンを押して、出現した複数行入力ボックスに直接コードを書いて提出することもできる。その際、ドロップダウンリストから、言語を選択することを忘れずに。
- Open code-statistics チェックボックス:
- active, endless 問題の場合、投稿したコードの中身は、制限時間を過ぎるまで公開されない。ただし、このオプションを選択することによって、どのような文字種がいくつずつ含まれているかを露出することができる。
- 詳細: binary, alnum, symbol
投稿ログ
回答コードを投稿して、問題に正解すると、ランキングおよび履歴に、自分の名前やコードサイズなどが記録される。逆に、失敗すると、どこにも載らない。
正解するコード・失敗するコード
- 無限ループなど、処理に長い時間がかかるコードを投稿すると、たとえ正しい出力ができていたとしても、タイムアウトとなり、失敗する。
- コードがエラーを起こした場合でも、正しい出力ができていれば、正解となる。
- 最後に出力した文字が改行コードだった場合、それは出力に含まれない。
Problem セクション
Problem セクション には、出題者による、問題の概要が書かれている。
Options セクション
Options セクションには、問題のタイプや、制限時間の情報などが書かれている。
ここに「exec is denied」という表記がなければ、あなごるサーバー内のファイルにアクセスするようなコードの実行が可能である。
Sample input と Sample output セクション
Sample input と Sample output セクションは、最も重要な部分である。
参加者は、Sample output に書かれている文を出力するコードを書き、その短さを競う。
Sample output は最高で 3 つ設置される。
どう書く?
問題に正解するためには、全ての Sample output と同じ出力を行うコードを一つだけ書かなければならない。
たとえば、以下の Sample output 2 つが並んでいたとしよう。
- Sample output: A
- Sample output: B
「A」あるいは「B」を出力するコードを書けばいいのだが、一つのコードでどうやってそれを実現するのか。
方法 1
方法の一つとして、「ランダム要素を使う」というものがある。
たとえば、JavaScript には、Math.random()
という関数がある。この関数は、0 から 1 の間の小数をランダムに返す。これを利用して、以下のようなコードを書く。
var output, rand = Math.random(); if (rand > 0.5) { output = "A"; } else { output = "B"; } print(output);
rand 値が 0.5 より大きければ "A" を、そうでなければ "B" を表示する。
このコードを投稿すると、あなごるサーバーは、このコードを実行する。
重要なのは、その工程が Sample output の数だけ行われるということだ。
この場合は Sample output が 2 つなので、このコードは 2 回 実行されることになる。
Math.random()
は、呼び出すたびに数値が変わるため、2 回 実行されたこのコードの出力は、別のものになる可能性が高い。
出力の 1 回目と 2 回目が以下のようになれば、正解である。
- 出力1: A
- 出力2: B
これは、ちょうど、Sample output と同じ並びになっている。
方法 2
二つ目の方法として、「Sample input を使う」というものがある。
ある Sample output には、必ずそれに対応する Sample input が付属している。
空の場合もあるが、何かしらの文が含まれている場合が多い。
たとえば、Sample input と Sample output の組が以下のようになっていたとしよう。
- Sample input: A
- Sample output: A
- Sample input: B
- Sample output: B
Sample input を利用すると、以下のようなコードで正解することができる。
var output = readline();
print(output);
readline()
関数は、Sample input から、一行分、文を読み取り、返す。
入出力に利用できる関数
JavaScript
- 入力: readline()
- 出力: print(), putstr()
2013 年 5 月 現在、あなごるでは、SpiderMonkey の JavaScript shell が使われている。
参考: Introduction to the JavaScript shell - SpiderMonkey | MDN
C
- 入力: scanf(), gets(), read() など
- 出力: printf(), puts(), write() など
Ranking セクション
active, endless において、問題に正解すると、投稿した言語のランキングに、コードサイズや日付などとともに自分の名前が掲載される。
ある一つの言語のランキングにおいて、すでに jack という名前の記録があり、その上で jack という名前で、その記録を上回る短いコードを投稿すると、その記録は消えて、新しい記録が載る。
一度ランキングに名前が載ると、消すことはできない。
Language Ranking セクション
ページの一番下には、どの言語のコードが一番短いかランキングが表示される。有名どころでは、Perl, Ruby が安定して強い。
おわり
よいコードゴルフライフを。