はじめに
PHPerKaigi 2025 では、3/21 の day0 に track A で「PHPer コードバトル」という対戦型企画を実施予定です。
このたびオンライン予選のエントリーを開始しましたので、企画趣旨や参加方法について紹介しようと思います。
PHPer コードバトルとは
PHPer コードバトルは、指示された動作をする PHP コードをより短く書けた方が勝ちという 1 対 1 の対戦コンテンツです。3/21(金)day0 に track A で、予選を勝ち上がったプレイヤー6名で、トーナメント形式でバトルを実施します。
プレイヤー6名の内訳は、先日 3/8 に実施されたオフライン予選の勝者4名と、当日まで開催しているオンライン予選の勝者2名です。
オフライン予選
どのような企画なのかを説明するために、3/8 におこなわれたオフライン予選の様子をご紹介します。
https://phperkaigi.connpass.com/event/346294
オフライン予選では、集まったプレイヤーが3つの問題を解き、その合計スコアで進出を争いました。そのうちの1問を見てみましょう。
予選ラウンド1
問題文
標準入力にスペース区切りの整数col rowが与えられます。「かける数」は1〜col、「かけられる数」は1〜rowまでの連続した整数です。全ての組み合わせのかけ算の結果が右揃えに整列するように出力してください。空白の個数は最も横幅が長いマスに合わせてください。
サンプルコード
fscanf(STDIN, "%d %d", $col, $row);
for ($i = 1; $i <= $row; $i++) {
for ($j = 1; $j <= $col; $j++) {
printf(str_repeat(" ", strlen($col * $row) - strlen($j * $i) + 1));
printf("%d", $i * $j);
}
printf("\n");
}
サンプルコードからスタートし、制限時間15分間でコードの短縮がおこなわれました。1位の takaram さんの回答がこちらです。
fscanf(STDIN, "%d %d", $c, $r);
for ($i = 0,$l = strlen($c * $r); $i++ < $r;){
for ($j = 0; $j++ < $c;)
printf(" %{$l}d", $i * $j);
echo "\n";
}
※ このシステムでは、コードの空白を除去したバイト数がスコアになります。
for 文の条件式と更新式をマージしたり、波括弧を排除したりといったテクニックを使ってコードゴルフをおこなっています。
このように、与えられた問題文のような動作をするプログラムを、制限時間内になるべく短く書こうというのが PHPer コードバトルです。
オンライン予選を開始します
残りの決勝進出者を決めるため、オンライン予選をおこないます。
オンライン予選についても、オフライン予選と同様の形式でコードを短縮していただきます。ただしそちらは制限時間が大幅に長くなっており、決勝当日の昼 12:00 まで挑戦が可能です。
決勝に進出できるのは、2つの予選用問題を両方解いたプレイヤーのうち、合計スコアが最も小さい2名です。
こちらの URL やパンフレットに記載された QR コードから、是非ご参加ください!
https://fortee.jp/phperkaigi-2025/go/phper-codebattle-qualifying
※ ログインには fortee の ID とパスワードが必要です。なお、決勝への参加には別途 PHPerKaigi のチケットが必要となります。
みなさまの挑戦をお待ちしています!