Rubyで作成したQuine
ruby quine.rb次のバージョンで動作確認しています。
- ruby 3.3.10 (2025-10-23 revision 343ea05002) [arm64-darwin24]
- ruby 3.4.8 (2025-12-17 revision 995b59f666) +PRISM [arm64-darwin24]
- ruby 4.0.0 (2025-12-25 revision 553f1675f3) +PRISM [arm64-darwin24]
アニメーション時にコード部分が削られていますが、誤り訂正を行っているのでどのフレームで切り取っても Quine として実行することが可能です。 誤り訂正は tompng さんの TRICK 2022 受賞作品で使われている手法をベースにしています。誤り訂正をするコードが非常に短いコードで実現されていて驚きです。
-a オプションでコード部分を全て出力することもできます。
ruby m3_logo_quine.rb画像のビットマップデータを Base64 エンコードしたものをコードに埋め込み、それを元にビットマップを復元して自身のコードをビットを元に当てはめて出力しています。 ロゴ画像中の文字を描画する箇所が少なく、zlib や 36 進数にするなどの圧縮ではコードに収まりきらないため、 画像のビットマップデータの圧縮をランレングス符号化を使って独自形式にしています。 具体的には 1 バイト中のうち、下位 1bit でビットマップのビット種別(0 か 1)を表現し、上位 7bit にビット種別が何個続くかを埋め込んでいます。
+-----------------------------------------------+-----------+
| Count (7bit data) | Type Flag |
+-----------------------------------------------+-----------+
またランレングス符号化なので画像データ中の 0 や 1 がより連続するほど圧縮率が高くなります。 Quine を見るとわかりますが、横にそのまま並べるより縦に並べた方が 0 or 1 の列がより長く続くため、ロゴ画像データの行列の転置を行って何とか Quine 中に収めています。