Skip to content

ゴルフ出題するときに

公開日:

Download PDF

スライドテキスト

Page 1

ゴルフ出題するときに
考えていたこと

My thoughts on creating code golf challenges.

pixiv Inc.
USAMI Kenta

2025-04-23 #phpstudy
第175回 PHP勉強会@東京

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE / にゃんだーすわん
  • ピクシブ株式会社 pixiv事業本部 Webエンジニアリングチーム PHPer
    • 2012年末から現職、APIとかCIとかいろいろなところを見つめてきました
  • Emacs PHP Modeを開発しています (2017年-)
  • プログラミング言語にちょっとこだわりのある素人 (spcamp2010)

Page 3

さて

Page 4

コードゴルフを ご存じですか?

Page 5

コードゴルフはe-スポーツ

  • 普通のゴルフ:
    • ボールを叩いてホールまで運び、1打でも少ない方が勝ち

Page 6

コードゴルフはe-スポーツ

  • 普通のゴルフ:
    • ボールを叩いてホールまで運び、1打でも少ない方が勝ち
  • コードゴルフ:
    • キーを叩いて仕様を満たすコードを書き、1文字でも少ない方が勝ち

Page 7

コードゴルフはe-スポーツ

  • 普通のゴルフ:
    • ボールを叩いてホールまで運び、1打でも少ない方が勝ち
  • コードゴルフ:
    • キーを叩いて仕様を満たすコードを書き、1文字でも少ない方が勝ち
  • Vimゴルフ:
    • キーを叩いてテキストをゴールまで編集し、手順が少ない方が勝ち

Page 8

Page 9

Page 10

2020年

Page 11

2024年 (昨年)

Page 12

2025年 (今回)

Page 13

コードゴルフ作問体制

  • 2020年: 「PHPer Code Golf by pixiv」
    • tadsan(私)が単独でゴルフ場建設・作問
  • 2024年: 「コードゴルフ企画」
    • いまむらさん(ns¶sis)が単独でゴルフ場建設・作問
  • 2025年: 「PHPerコードバトル」
    • いまむらさんがゴルフ場建設・tadsan(私)が作問を担当

Page 14

ゴルフ場

(playground)

  • 参加者が自由に入力したプログラムが実行できる(≒任意コード実行)
  • 悪意を持った利用者が悪用できないようにする必要がある
    • ファイル書き込みでサーバのディスクを埋めて利用不能にするとか…
    • 無限ループでプログラムが永遠に終わらないとか…
    • 外部サービス攻撃の踏み台にされるとか、ビットコイン採掘されるとか…
  • いかに安全に実行できるようにするかは創意工夫の余地がある

Page 15

Page 16

出題

Page 17

今回の要件

  • 標準入出力だけを使う・デフォルト有効化されていないモジュールは不可
  • 競技プログラミング文脈に頼りすぎない
  • 模範解答を開示する
    • 参加者は問題解答だけでなく、文字数を縮めることに集中できる
  • (非機能要件) コンテンツとして観戦して楽しい・わかりやすくする

Page 18

予選問題

  • コードゴルフに不慣れな人も参戦するので、コードの難易度としては
    プログラミングの初年度授業の発展課題くらいを「意識」
    • ただし、ワンパターンにならないように難易度にこだわりすぎない

Page 19

作問方法

Page 20

php-play.devを使ったコーディング

  • 完全にブラウザ上で動くPHPランタイム
  • ここはstdioが実装されてないが…
    • これを逆手にとって自分で定義してやる
  • PHPで定数にオブジェクトを代入できる ようになったのはPHP 8.1からだが…

Page 21

php-play.devを使ったコーディング

  • 完全にブラウザ上で動くPHPランタイム
  • ここはstdioが実装されてないが…
    • これを逆手にとって自分で定義してやる
  • PHPで定数にオブジェクトを代入できる ようになったのはPHP 8.1からだが…
    • 実はfwrite()の戻り値はリソースなので昔から許されてた

Page 22

php-play.devのデメリット

  • タイムアウトが実装されていない
  • うっかりコードに while(true) とか書いてしまうとブラウザが固まる
    • 後で脱出条件を書こうとするとひっかかる
    • しばらく待ってるとChromeが処理を打ち切ってくれるが、それまで待つ
  • php-playはキーボードを打つたびにhistory.pushStateしてくれるので
    冷静に戻るボタンを1回押せば無限ループ直前まで帰ってこれる

Page 23

Page 24

Page 25

Page 26

ボツ問題

Page 27

Page 28

Page 29

Page 30

Page 31

Page 32