ペイントのしみの93%が有効なPerlプログラムだと判明(2019年)
(mcmillen.dev)- SIGBOVIK 2019の論文は、壁にペイントをこすりつけてもPerlプログラムにならないことがあり得るのかをOCR実験で検証し、100個のしみのうち93%がPerlとしてパースされた
- 実験は、ペイントのしみ画像をOCR文字列に変換した後、その結果が有効なPerlプログラムかどうかを検査する方式で行われた
- 93%は有効だったが、残りの7個のしみはPerlとしてパースされず、「常にPerlになる」という類いのジョークにも例外が残った
- 公開資料には、すべてのしみ画像と対応するPerlソースが含まれており、無効な画像は赤い「Not valid」表示で区別されている
- 投稿後に確認された一部のOCR結果は、Perlで数値
0や文字列c、E__として評価され、偶然生まれたコードの奇妙さを示している
ペイントのしみで検証したPerlのパース可能性
- この論文は、プログラミング言語コミュニティの古くからの公開問題のように仕立てられた問い、すなわち壁にペイントをこすりつけても有効なPerlを作らないことがあり得るのかを実験対象とした
- 結論は「可能だ」に近い
- OCRソフトウェアを使った実験で、ペイントのしみの**93%**のみが有効なPerlとしてパースされた
- したがって、一部のペイントのしみは有効なPerlプログラムではない
- 論文は、ペイントのしみPerlプログラムの性質を分析し、有効なPerlプログラムではないしみの7つの例もあわせて提示している
SIGBOVIK 2019論文と公開資料
- 論文は2019年4月1日にピッツバーグで開かれたSIGBOVIK 2019に採択された
- 「Unwitting Participation Ribbon」も受賞した
- このリボンは「本物の成果物」を含む論文に付与されるものとして紹介されている
- 論文とプロシーディングは複数の形式で公開されている
- Google Docs: 論文を見る
- PDF: 論文をダウンロード
- SIGBOVIK 2019 proceedings: 全体のプロシーディング、該当論文は174ページ
しみギャラリーと100枚画像データセット
- all the paint splatters は、すべてのペイントのしみを1ページにまとめて表示し、各画像に対応する有効なPerlソースコードもあわせて提供している
- 有効なPerlプログラムとしてパースされなかった画像は、赤い「Not valid」表示で区別されている
- 異なるOCR設定で複数の有効なPerlプログラムが認識された場合は、最も「面白い」と感じられた結果1つが選ばれている
- tarball of 100 paint-splatter images は、論文の主要データセットとして使われた100枚のペイントのしみ画像を収めている
投稿後に確認された追加事例
- SIGBOVIKへの投稿締切後にも、興味深いペイントのしみPerlプログラムが追加で確認された
- OCRが
lerzfijglpFiji-jと認識したしみは、Perlで数値**0**として評価される -*?と認識されたしみも、Perlで数値**0**として評価される;i;c;;#\\?z{;?;;fn':.;と認識された画像は、Perlで文字列**c**になる;E,'__'と認識された画像は、Perlで文字列**E__**として評価される
1件のコメント
Hacker News のコメント
連接型言語には、あらゆるトークン列が有効なプログラムになる性質がある
単一ビットをトークンとして使う言語なら、あらゆるビット列が有効なプログラムになる。Chris Barker の zot はそのような言語の一つ
zot に着想を得て、同じ性質を共有する Binary Lambda Calculus の連接型バージョンを定義した
[1] https://en.wikipedia.org/wiki/Concatenative_programming_lang...
[2] https://en.wikipedia.org/wiki/Iota_and_Jot#Zot
[3] https://cstheory.stackexchange.com/questions/32309/concatena...
連接型言語の性質は、a と b がどちらも有効なプログラムなら a || b も有効なプログラムだ、というもの。ここで || は「連結」を意味する
しかしこの性質は、あらゆるトークン列が有効だという意味ではない。例えば Cat では
[1 2は構文的に有効ではないJot もその文も、どちらも理解できたらいいのに
脚注 5 が面白かった
⁵ この機能により、きれいな quine が可能になる。Perl プログラム “Illegal division by zero at /tmp/quine.pl line 1.” を適切な場所に保存すると、“Illegal division by zero at /tmp/quine.pl line 1.” を出力する。この動作の理由は読者への練習問題として残しておく
そして一見関連していそうだが、実際にはかなり違う Python quine もある:
File "quine.py", line 1
File "quine.py", line 1
^
IndentationError: unexpected indent
REPL で試してみると、
"Illegal division"はパッケージ"division"のメソッド"illegal"を見つけられず、おそらくその部分は無視されるようだ。"zero"パッケージの"by"メソッドも同様で、"at /tmp"がそのエラーメッセージを作る最も単純な文字列らしい。このエラーはパッケージ欠落の警告より深刻なので、プログラムを終了させるようだ/が除算演算子で、"tmp"が変数として初期化された後に整数へ強制変換されるのかと思ったが、"/tmp"だけでは駄目で、"/tmp/"は正規表現関連の動作をするので、パーサーがなぜそこで割り算しているのか分からない関連記事:
93% of Paint Splatters Are Valid Perl Programs (2019) - https://news.ycombinator.com/item?id=27929730 - 2021年7月、コメント 163 件
別のリンク:
93% of Paint Splatters Are Valid Perl Programs (2019) - https://news.ycombinator.com/item?id=38754686 - 2023年12月、コメント 1 件
冗談はさておき、OCR ソフトウェアがテキストではない画像からも、いまだに常にテキスト結果を出すのはおかしいのでは?
10年以上前に古い本を OCR したことがあるが、小さな図や染み、ほこりから出てくるゴミテキストの処理にひどく苛立った記憶がある。この分野はそれ以来あまり進歩していないように見える
ランダムな落書きが Perl で有効な実行になるなら、何かがおかしいのでは?
自分で実験したところ、ChatGPT はかなり優秀な「賢く文脈を理解する」OCR エージェントだった
この記事は、特定の 光学文字認識 プログラムがペンキの飛び散りを文字として認識する問題を扱っているのだと理解した
そのプログラムは、ほとんど常にペンキを何らかの文字の組み合わせとして認識しようとする傾向があるようで、可能な実装方法がいくつもある中で、この方式は十分歓迎できるし趣旨にも合っている
ただ最初は、色の断片と空白を 0 と 1 と見なし、全体をプログラムとして解釈するような別の方式も思い浮かんだ。その場合はほとんどが無意味なノイズになりそうだ
結局、両極端がある。一方はほぼノイズだけで、もう一方は大部分に意味がある。ここでのゲームの中のゲームは、ペンキの飛び散りにできるだけ多くの意味を与えつつ、その意味が規則による無理やりの意味づけではなく、構造そのものからできるだけ生じるような 解釈方式 を探すことのようだ
生成 AI を使えば、実行可能なソフトウェアとして評価される新しく革新的なペンキの飛び散りを、これまでになく速く作れる
生成 AI は、新しいクリエイター層がテキストから画像へのワークフローを活用し、あらゆる規模の企業に価値を生み出せるようにする。新しい AI モデルは、動作するソフトウェアと機械可読なコードを多様な高解像度コンテンツに埋め込め、視聴者の関心を引きつけ、クリエイターが観客を増やすための新しく刺激的な方法を提供する
さらに最先端の 計算研究 はここにある: https://sigbovik.org/
昔からある「ラインノイズと区別がつかない」ジョークの巧妙な変奏だ
ラインノイズ にあまり触れてこなかった人のために説明すると、ASCII 文字のビデオ端末がバイトストリームを解釈して意味のあるテキストを表示すると想像すればよい。では通信チャネルが何らかの理由で壊れたとしよう。例えばモデム接続中に誰かが電話の受話器を取ったり、ケーブルに干渉が入ったりした場合だ
誤り訂正やチェックサムがなければ、解釈されるバイトは実質的にランダムになる。そのため任意の文字、数字、句読点、制御文字などが解釈されて画面に表示され、慣れた人ならそれがランダムで、なぜそうなるのかも分かる。ところがジョークは、それが実際にはなお有効な Perl プログラムだという点にある
こうなったらベルトにタマネギでも結びつけるか
「ソースコードはまだない。GitHub が使えないので」と言っていたから、永遠に失われたようだ
少なくとも https://git.mcmillen.dev/explore/repos にはない
Perl プログラマーとして、動作しない 7% はバグだと思う