デモページを開いて、自分の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年ごろを最後に更新が止まります。

技法の一覧
ショートコーディングで使われる書き方を並べておきます。どれも通常の開発では避けるべきものですが、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 |
|0 は Math.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年代と同じです。制限を先に決めて、その中で何ができるかを試す。違うのは、制限が実際の制約から来ているか、自分で課したものかという点だけでした。


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 がいつリセットされるのか。私は途中で見失いました。あなたはどこまで追えますか。
参考
- IOCCC ── 1984年から続く難読 C コードのコンテスト
- Anarchy Golf ── 日本発のコードゴルフサイト
- Code Golf Stack Exchange ── 世界最大のコードゴルフコミュニティ
- dwitter ── 140文字の JavaScript でアニメーションを作る
- 六行テトリス(Sotobato_Nihu 氏) ── 2021年、476文字で6行に収めた記録
- 482バイトテトリス(Ozy 氏) ── 『Short Coding』の著者による短縮


コメント