あなたの知らない超絶技巧プログラミングの世界

書籍の概要

この本の概要

「役に立たないプログラムには価値がない?」
「プログラミングは仕事以外でやりたくない?」
本書には,アスキーアート化,自己生成,縛りのあるプログラミングなど,実用性を追求するだけでは出会えないテクニックが満載。プログラミングが好きな方はもちろん,プログラミングが苦手な方でも楽しめる遊びをIOCCC入賞常連の著者が紹介します。ちょっぴり不思議なプログラミングの世界をのぞいてみませんか。

【特別寄稿】序文:まつもとゆきひろ

こんな方におすすめ

  • プログラミングが好きな方
  • IOCCC,TRICKなどの一風変わったコンテストに興味がある方

本書に寄せて

子供のときの気持ちを思い出してみましょう。サーカスを見に行きました。猛獣使いに空中ブランコ,ナイフ投げ。素晴らしい技にワクワクします。これだけの技術を身につけるにはどれだけの訓練が必要なのでしょうか。感動します。でも,彼らがあまりにも自然にあまりにもかんたんそうに技を披露するのを見て,もしかしたら,ひょっとすると自分にも隠された才能があって,やってみたらあっさりできてしまうんじゃないだろうか,と思います。そうしたら自分もヒーローになれるかもしれない。期待に胸が膨らみます。

猛獣は身近にいないし,空中ブランコも用意できそうにありません。そこでナイフを投げてみることにしました。人を狙うのは危ないので(その程度の分別は持ち合わせています),ダンボール製の的を作って,それを狙うことにします。しかし,何度やっても狙ったところに刺さりません。それどころか的から遠く離れた壁にナイフが突き刺さって穴を開けてしまい,母親にひどく怒られてしまいます。全然うまくいかないし,ちっとも楽しくありません。とうとうあきらめて投げ出してしまいました。すごく悔しい思いでいっぱいです。

よくありそうな思い出ではないでしょうか。これは私自身の実際の経験です。おバカな子供だったんですね。最近も私の子供がまったく同じようなことをしていました。傍から見るととてもかんたんで楽しそうに見えることが実はたゆまぬ訓練の賜物で,素人が容易に真似できるものではないことは,子供の遊びに限らずしばしば起きることです。たとえば自転車に乗ることも,自動車を運転することもそうですし,私自身が日常的に行っているプログラミングだって,未経験者から見たらとても真似できない「技」に見えることでしょう。

本書はプログラミング経験者から見てもさらに超越的な技巧を凝らした「プログラミング界の大サーカス」と言ってもよいでしょう。正直言ってかんたんに真似できるものではありません。しかし,サーカスの観客のほとんどが自分では曲芸をしないように,それを鑑賞するだけでも十分に楽しめます。おまけにそのタネの解説までついています。

それに,もしかしたら,ひょっとすると,あなたには隠された才能があって,やってみたら本書のような超絶技巧をあっさり使いこなせるようになるかもしれません。

そんなあなたの知らない世界へようこそ。

2015年7月
まつもとゆきひろ

この書籍に関連する記事があります!

プログラミング世界のフシギ
「役に立たないプログラム」という言葉を聞いて,みなさんはどう感じるでしょうか。

目次

本書に寄せて

まえがき

第1章 超絶技巧プログラムギャラリー

1-1 回り道するQuine

  • 1-1-1 Qlobe
  • 1-1-2 山の手Quine
  • 1-1-3 自己相似Quine
  • 1-1-4 般若心経Quine
  • 1-1-5 Quineリレー

1-2 アニメーションするプログラム

  • 1-2-1 ASCII Fluid
  • 1-2-2 Merry-Quine mas
  • 1-2-3 二重振り子時計
  • 1-2-4 凸包ビューア

1-3 音楽を奏でるプログラム

  • 1-3-1 Music-box Quine
  • 1-3-2 パガニーニによる超絶技巧練習Quine
  • 1-3-3 「ツイート可能」C言語ワンライナー

1-4 インタラクティブなQuine

  • 1-4-1 15quzzle
  • 1-4-2 ○×ゲームQuine
  • 1-4-3 Quineリバーシ
  • 1-4-4 Rating Quine

1-5 画像の中のプログラム

  • 1-5-1 画像Quine
  • 1-5-2 Q(uine)R(uby) code
  • 1-5-3 Game of Gife
  • COLUMN タッパーの自己言及式

1-6 数を数えるプログラム

  • 1-6-1 章番号Quine
  • 1-6-2 PiE in the sky
  • 1-6-3 FizzBuzz Quine

1-7 非CUIのプログラム

  • 1-7-1 Quine in Air
  • COLUMN Quineでいう「自分自身」の意味
  • 1-7-2 カーネルモードQuine
  • 1-7-3 Quine web server
  • 1-7-4 記念碑Quine

1-8 制限されたHello, world!

  • 1-8-1 アンダースコアだけでHello, world!
  • 1-8-2 数字だけでHello, world!
  • 1-8-3 純粋に記号だけでHello, world!
  • 1-8-4 純粋に小文字アルファベットだけでHello, world!

1-9 堅牢なQuine

  • 1-9-1 宇宙線耐性Quine
  • 1-9-2 リポグラムQuine
  • 1-9-3 “XXX”耐性Quine

1-10 その他

  • 1-10-1 Quineclock
  • 1-10-2 チェスボード上のQuine
  • 1-10-3 二重らせんRubyプログラミング
  • 1-10-4 C用Lazy Kライブラリ
  • 1-10-5 inline-ook

関連章対応表

  • COLUMN 「超絶技巧」の言葉の由来

第2章 アスキーアートでプログラミング

2-1 Rubyでアスキーアートグログラム

  • 2-1-1 アスキーアート化の手順
  • 2-1-2 アスキーアート化の際に気をつけるべきこと
  • 2-1-3 アスキーアート化の自動化

2-2 C言語でアスキーアートプログラム

  • COLUMN 超絶技巧は日本の伝統?
  • 演習

第3章 Quine - 自己生成プログラミング(基本編)

3-1 実践Quine

  • 3-1-1 まずはやってみる
  • 3-1-2 自分自身を再構築する
  • COLUMN Quineの名前の由来

3-2 もっとかんたんにQuine

  • 3-2-1 重複を減らす
  • 3-2-2 String#dumpを省く

3-3 他言語でのQuine

  • 3-3-1 C言語でQuine
  • 3-3-2 重複を減らす汎用的な方法
  • 3-3-3 言語特有の機能を使ったQuine
  • COLUMN 「反則」なQuine
  • 3-3-4 文字列リテラルを使わないQuine
  • COLUMN Quineの存在を証明する
  • 演習

第4章 Quine - 自己生成プログラミング(応用編)

4-1 アスキーアートQuine

  • 4-1-1 元の形に再成形する方法
  • 4-1-2 成形済みの文字列を保持する方法
  • COLUMN Quineの「自己復元力」

4-2 エンコードするQuine

  • 4-2-1 ゆっくりと出力する
  • 4-2-2 出力を暗号化する(1)
  • 4-2-3 出力を暗号化する(2)

4-3 「進化」するQuine

  • 4-3-1 状態を持たせる
  • 4-3-2 状態を変化させる

4-4 ウロボロスQuine

  • 4-4-1 基本的な考え方
  • 4-4-2 エスケープを施す
  • COLUMN 言語を行き来するQuine
  • COLUMN Quineの有効利用!?
  • 演習

第5章 ○○禁止プログラミング(初級編)

5-1 アンダースコアだけでRubyプログラム

  • 5-1-1 プログラム=整数の列
  • 5-1-2 整数をアンダースコアに置き換える
  • 5-1-3 見た目をスマートに
  • COLUMN 何進数を使うべきか

5-2 数字だけでRubyプログラム

  • 5-2-1 プログラム=整数
  • 5-2-2 巨大整数への参照を得る
  • COLUMN 「プログラム=整数の列=整数」の由来
  • COLUMN 難解プログラミング言語
  • 演習

第6章 ○○禁止プログラミング(上級編)

6-1 記号だけでRubyプログラム

  • 6-1-1 アルファベットを排除
  • 6-1-2 数字を排除
  • 6-1-3 任意のプログラムを変換する

6-2 アルファベットだけでRubyプログラム

  • 6-2-1 アルファベットと数字と.と=だけ
  • 6-2-2 ピリオドを排除(1回目)
  • 6-2-3 ピリオドを排除(2回目)
  • 6-2-4 小文字アルファベットと数字だけ
  • 6-2-5 小文字アルファベットだけ

6-3 他言語での事例

  • 6-3-1 C言語で括弧とセミコロン禁止
  • 6-3-2 Perlの事例
  • 6-3-3 Pythonで小文字アルファベットと括弧とカンマだけ
  • COLUMN リポグラムの反対
  • 演習

第7章 「堅牢」なプログラミング

7-1 「宇宙線耐性」のあるRubyプログラム

  • 7-1-1 原理
  • 7-1-2 実装の詳細
  • 7-1-3 改良:重複の除去

7-2 リポグラム耐性のあるRubyプログラム

  • 7-2-1 原理
  • 7-2-2 コード(B)の実装
  • 7-2-3 コード(A)の実装
  • 7-2-4 落穂拾い

7-3 “XXX”挿入耐性のあるRubyプログラム

  • 7-3-1 原理
  • 7-3-2 コード(A)と(B)の実装
  • COLUMN RubyでもPythonでもあるプログラム
  • 演習

第8章 超絶プログラムを彩るテクニック

8-1 端末でアニメーション

  • 8-1-1 アニメーションの基本
  • 8-1-2 アスキーアートの生成(1):サブキャラクターレンダリング
  • 8-1-3 アスキーアートの生成(2):マーチングスクエア
  • 8-1-4 アニメーションとQuineの組み合わせ

8-2 音楽再生

  • 8-2-1 とりあえず音を出してみる
  • 8-2-2 ドレミを再生する
  • 8-2-3 和音を作る
  • 8-2-4 音色を変える

8-3 画像出力

  • 8-3-1 PNGの生成(zlib使用)
  • 8-3-2 PNGの生成(zlib不使用)

8-4 データの詰め込み

  • 8-4-1 テーブルとしての巨大整数
  • 8-4-2 表示可能文字での巨大整数の埋め込み
  • 8-4-3 圧縮アルゴリズムの活用
  • COLUMN ショートコーディング

第9章 コンテストに挑戦

9-1 コンテスト紹介

  • 9-1-1 IOCCC
  • 9-1-2 TRICK
  • 9-1-3 ほかのコンテスト

9-2 テーマの考え方

付録

A-1 ASCIIコード表

A-2 エスケープシーケンス表

Proggy Fontsライセンス

あとがき

参考文献

著者プロフィール

遠藤侑介(えんどうゆうすけ)

超絶技巧プログラミング提唱者。技巧的だが役に立たないプログラムを多数開発し,公開している。C 言語プログラムの難読化で競うプログラミングコンテストInternational Obfuscated C Code Contest(IOCCC)に通算8回入賞(入賞数歴代 2位)。Ruby の難読化で競うプログラミングコンテストTranscendental Ruby Imbroglio Contest for RubyKaigi(TRICK)主催。
本業は某電機メーカーの研究員。Ruby の開発者(コミッタ)。訳書に『抽象によるソフトウェア設計』『型システム入門』(オーム社)。