読みにくく書くのに、読める人にしかできない|コードゴルフの60年

コードを短く書く文化を表したアイキャッチ。ゴルフのスコアカードと等幅のコード Retro Computing
この記事は約7分で読めます。

デモページを開いて、自分の468文字を何度か動かしました。ブロックが落ちて、揃った行が消えて、右下の数字が増える。ソースを別のタブで開いて、画面と見比べる。どの文字がいま何をしているのかを追おうとして、途中で見失いました。

第2部で書いたとおり、私が削ったのは表面だけです。移動と回転の判定は、20年前に組まれたものをそのまま使っています。あそこを組んだ人たちが何をしていたのか、その周辺を調べました。

1960年代|メモリが足りなかった時代

コードを短く書く文化そのものは、遊びとして始まったわけではありませんでした。

スティーブン・レビーの『ハッカーズ』によると、1960年代の MIT の学生たちは、コードサイズを削ることに真剣だったそうです。使えるメモリが数キロバイトしかない環境では、短いことがそのまま動くかどうかを決めました。1命令削れば、その分だけ機能を足せる。

この事情は、Atari 2600 の記事で書いた128バイトの話と同じです。制約が先にあって、技法が後から生まれている。

1984年|読みにくさを競う

1984年に IOCCC(International Obfuscated C Code Contest)が始まりました。「最も読みにくい C 言語のコード」を競うコンテストです。

短さだけを競うものではなく、創造性や見た目の面白さも評価されます。ソースコードの形自体が絵になっている作品もある。ただ、極端に短いコードがしばしば入賞していて、後のコードゴルフの源流のひとつと見なされています。

「コードゴルフ」という呼び名が定着したのは1999年、Perl のニュースグループ上だとされています。ゴルフと同じく、少ない打数でゴールを目指す。打数が文字数にあたります。

2001年〜2004年|7行×79文字

日本では、2ちゃんねるのプログラム技術板が舞台になりました。七行プログラミングのスレッドです。

ここで生まれた作品は、テトリスだけではありません。7行オセロは C 言語で書かれていて、CPU 対戦まで入っています。ミニマックス法に類する探索を含めて7行×79文字に収まっている。ぷよぷよの JavaScript 版もあって、連鎖判定まで9行から10行に入っていたそうです。ほかにシューティング、迷路生成、ライフゲーム。

7行という制限の中で何ができるかを競う場所であって、単にコードを縮める遊びではなかった、というのが調べていての印象でした。

2007年|本になり、常設の場ができた

2007年、Ozy 氏がやねうらお氏の監修で『Short Coding ~職人達の技法~』を出版しました。ショートコーディングを体系的に扱った、世界的にも珍しい本だそうです。C 言語と Perl を中心に、圧縮の技法がまとめられています。いまも中古で高く取引されることがあると聞きます。

第1部で7行テトリスを削っていた Ozy 氏が、この本の著者です。掲示板で作品が生まれ、ブログで削られ、本になった。2007年前後の数年に、それが集中しています。

同じ年、Anarchy Golf が開設されました。日本発のコードゴルフサイトで、約50言語に対応していて、ユーザーが問題を出題できます。全盛期にはグローバルランキングの上位10人のうち6〜7人が日本人だった、という話を複数の場所で見かけました。裏は取れていません。

そして2ちゃんねるの七行プログラミングスレッドは、2007年ごろを最後に更新が止まります。

Anarchy Golf のサイト画面。出題された問題と、言語ごとのコード長のランキングが並んでいる

技法の一覧

ショートコーディングで使われる書き方を並べておきます。どれも通常の開発では避けるべきものですが、6行テトリスのコードにはほぼ全部が入っていました。

技法 やること 6行テトリスでの例
変数名の1文字化 意味のある名前を捨てる A 幅、B ブロック、Z 固定、X 描画
代入式の値を使う = が返す値を条件に使う if(e=!e)
カンマ演算子 複数の式を1文にまとめる (P++,c=l+=A)
ビット演算で型変換 |0 で切り捨て (p/9|0)
短絡評価 && || を分岐の代わりに 7行版の Z[5]||setTimeout(...)
for の初期化・更新式に詰める ループ本体を空にする for(C=[q=c=i=4];f=i--*K;c-=!Z[...])p=B[i]
id 属性をグローバル変数に getElementById を書かない <body id=D>D.innerHTML

|0Math.floor() より13文字短い。id=D を使うと document.getElementById('D') の28文字が1文字になります。どれも言語仕様を正確に知っていないと使えません。読みにくく書くのに、読める人にしかできない。

2011年以降|場所が変わった

七行プログラミングのスレッドは止まりましたが、同じ遊びは続いています。

2011年に Code Golf Stack Exchange が開設されました。Stack Overflow の姉妹サイトで、いまは世界最大のコードゴルフの場です。数十の言語で毎日競われています。

dwitter は、140文字の JavaScript でアニメーションを作るサイトです。Twitter の文字数制限から来た形式で、js1k という1KB の JavaScript で作品を作るコンテストもありました。AtCoder には正答をコード長順に並べる機能があって、非公式にコードゴルフを楽しむ人がいるそうです。

場所と言語は変わっていますが、やっていることは1960年代と同じです。制限を先に決めて、その中で何ができるかを試す。違うのは、制限が実際の制約から来ているか、自分で課したものかという点だけでした。

コードを短く書く文化の年表。1960年代の実際のメモリ制約から、IOCCC、七行プログラミング、Code Golf Stack Exchange までの流れ

コードを短く書く文化の年表。1960年代の実際のメモリ制約から、IOCCC、七行プログラミング、Code Golf Stack Exchange までの流れ

2026年|AIと削ってみて

第2部に書いたとおり、468文字版は Claude と一緒に作りました。7行版を渡して、削れる箇所を挙げてもらって、動かして採否を決める。この往復を何度か回しています。

やってみて分かったことが2つありました。

ひとつは、候補を出すのは速いということです。アロー関数への変換も、カラー表示の削除も、こちらから聞く前に出てきました。ショートコーディングの技法は文書として残っているので、それを知っている相手が提案してくるのは自然です。

もうひとつは、採否は自分で決めるしかなかったということです。ゲームオーバー判定を消すと15文字減る。減るのは事実で、そこに異論はありません。ただ、それを削ってテトリスと呼べるのかは、文字数の話ではない。私は削って、第2部でそれを負けと書きました。

2021年に476文字で6行に収めた方は、そこを残しています。記事を読むと、JavaScript の記法だけを触って、ロジックには手を入れなかったと書いてある。理解しきれなかった、とも。できなかったことをできなかったと書いてあるほうが、読んでいて信用できました。

短く書けるようになると、何が変わるか

実務でこの書き方を使うことはありません。使えば怒られます。それでも残るものがあるとすれば、2つだと思います。

ひとつは言語仕様の理解です。型の暗黙変換、演算子の優先順位、評価順序、自動セミコロン挿入。ショートコーディングは、この4つを避けて通れません。そして、これらはバグの原因を追うときに毎回出てきます。第2部で行を79文字に割るとき、自動セミコロン挿入のせいで切れない場所が出てきました。あれは普段の仕事でも同じ形で顔を出します。

もうひとつはアルゴリズムを疑う癖です。7行テトリスの回転は p*A-(p/9|0)*145 の1式で済んでいます。回転行列も座標テーブルも使っていない。文字数の制限がなければ、たぶん誰もこの形にはたどり着きません。制限があるから別の道を探す。これは組み込みやチューニングの場面で効きます。

ここまで3本書いてきて、いちばん印象に残っているのは、Ozy 氏が2007年に「明らかに縮みそうな箇所がありますね」と書いていたことでした。同じコードを見て、私は読むことすらできず、あの人には削れる場所が見えていた。20年経っても、その差は埋まっていません。

デモページのコードを、1文字ずつ追ってみてください。i がどこで増えて、K がいつリセットされるのか。私は途中で見失いました。あなたはどこまで追えますか。

参考

Retro Computing
この記事を書いた人
rapls

WordPressのプラグインを作っているフリーランスエンジニアです。Web開発はもう6年以上。WordPress.orgで Rapls AI Chatbot、Thanks Mail for Stripe、Rapls PDF Image Creator、Prime Cache の4本を公開し、保守を続けながら、日本語ロケールの翻訳エディター(PTE)も務めています。このブログに書くのは、現場で自分が実際にハマって、調べて、直した話です。

raplsをフォローする
raplsをフォローする

コメント

タイトルとURLをコピーしました