とりあえず書いてみた。長いです (60190B) 。
その前に、本に載ってる参照実装はちょっとバグっぽいのでパッチ。
--- starry.rb.orig +++ starry.rb @@ -129,8 +129,8 @@ def find_labels(insns) labels = {} insns.each_with_index do |(insn, arg), i| - raise ProgramError, "ラベル#{ arg }が重複しています" if labels[arg] if insn == :label + raise ProgramError, "ラベル#{ arg }が重複しています" if labels[arg] labels[arg] = i end end
以下が quine 。キラッ☆
+ + | | | '| ` + ' + + | | | | ' ` + . | + * + ' + + + * ' + | | + . + ' ` + + | + * + * + + * * . | ` ' + + ` | + . + * + ' + | | + . + + + * ` | + . + * + ' + | + . | + + . + . | + . + . + . + . + . + . . | + . + + + * ` | + . + * + ' + | + . + * + + '| + . | | + . ' ` + + + | ' ` + + + ' | ` + + + ' ` + + | + ' ` | | | | + + + ' | ` + + + ' ` | + + + ' ` | + + + ' ` + + | + ' ` + + | + ' ` + + | + ' ` + + | + ' ` + + | + ' ` | + + + ' ` | + + + ' | ` + + + ' | ` | | | | + + + ' | ` + + + | ' ` + + + | ' ` | + + + ' | ` + +| + ' | ` + + + ' | ` + + + | ' ` | + + + ' | ` + + + | ' ` | + + + ' | ` + + + | ' ` | + + + ' | ` + + + | ' | ` + + + | ' ` + + | + ' | ` + + + | ' | ` + + + | ' ` | + + + ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` | | + + + | ' | ` + + + | ' | ` + + + | ' | ` + + + | ' | ` | + + + | ' | ` + + + | ' | ` + + + | ' | ` + + | + | ' | ` + + + | ' | ` + + + | '| | ` + + + | ' | ` + + + | ' | | ` + + + | ' | ` + + + | '| | ` + + + | ' | | ` + + + | ' | ` + +| + | ' | ` + + + | ' | | ` + + + | ' | `| + + + | ' | ` + + | + | ' | ` + + + | | ' | ` + + + | ' | | ` + + + | ' | | ` + + + | ' | | ` + + + | ' | | ` + + + | ' | | ` + + + | ' | | ` + + + | ' | | ` + + + | '| | ` + + + | | ' | ` + + + | | ' | ` + | + + | ' | | ` + + + | ' | | ` + + + | | ' | ` + + + | | ' | ` | + + + | ' | | ` + + + | | ' | ` + + | + | ' | | ` + + + | | ' | ` + + + | | ' | | ` + + + | | ' | ` | + + + | | ' | ` + +| + | ' | | ` + + + | | ' | ` | + + + | ' | | ` + + +| | ' | | ` + + + | | ' | | ` + + + | | ' | ` + + | + | ' | | ` + + + | | ' | | ` + + + | | ' | | ` + + + | | ' | | ` + + + | | ' | ` | + + + | | ' | ` | + + + | | ' | ` | | + + + | | ' | | ` + + + | | ' | | ` + + + | | ' | | ` + + +| | ' | | ` + + | + | '| | ` | + + + | | ' | | ` + + + | | ' | | ` + + + | | ' | | ` + + + | | ' | | ` | + + + | | ' | | ` + + + | | ' | | ` + + + | | ' | | | ` + + + | | ' | | ` + + + | | ' | | ` | + + + | | ' | | | ` + + + | | ' | | ` + + + | | ' | | | ` + + + | | ' | | ` + + | + | | ' | | ` + + + | | ' | | ` | + + + | | ' | | ` + + + | | | ' | | ` + + + | | ' | | | ` + + + | | ' | | ` | + + + | | ' | | ` + + + | | | ' | | ` + + + | | | ' | | ` + + + | | '| | | ` | + + + | | ' | | | ` + + + | | ' | | `| + + + | | ' | | ` | + + + | | ' | | | ` + + + | | | ' | | ` + + | + | | ' | | ` + + | + | | ' | | ` | + + + | | ' | | | ` + + + | | ' | | | ` + + + | | | ' | | ` + + + | | | ' | | ` + | + + | | ' | | | ` + + + | | ' | | | ` + + + | | | ' | | ` | + + + | | | ' | | | ` + + + | | ' | | | ` + + + | | | ' | | ` | + + + | | ' | | | ` + + + | | | ' | | ` | + + + | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | ` + + | + | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | ` | + + + | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | `| + + + | | | ' | | ` | + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + | + | | '| | | ` | + + | + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` + + + | | | '| | | | ` + + + | | | ' | | | ` + + + | | | ' | | | ` | + + + | | | ' | | | ` + + + | | | ' | | | ` | + + + | | | ' | | | ` + + + | | | ' | | | | ` + + + | | | ' | | | ` + + + | | | | ' | | | ` + + + | | | ' | | | | ` + + + | | | ' | | | ` | + + + | | | ' | | | | ` + + + | | | ' | | | ` + | + + | | | ' | | | ` + + + | | | | ' | | | ` + + + | | | | ' | | | ` + + + | | | | ' | | | ` + + + | | | ' | | | | ` + + + | | | ' | | | | ` + + + | | | ' | | | | ` + + + | | | ' | | | | ` + + + | | | | ' | | | ` + + + | | | | ' | | | ` + + + | | | | ' | | | ` + + +| | | | ' | | | ` | + + + | | | | ' | | | ` + + | + | | | ' | | | | ` + + + | | | ' | | | | ` + + + | | | | ' | | | ` + + + | | | | ' | | | `| + + + | | | ' | | | | ` + + + | | | | ' | | | ` + | + + | | | ' | | | | ` + + + | | | | ' | | | ` + + | + | | | ' | | | | ` + + + | | | | ' | | | ` + + | + | | | ' | | | | ` + + + | | | | ' | | | ` | + + + | | | ' | | | | ` | + + + | | | | ' | | | ` +| + + | | | ' | | | | ` + + + | | | | ' | | | | ` + + + | | | | ' | | | | ` | + + | + | | | ' | | | | ` + + + | | | | ' | | | | ` + + + | | | | ' | | | | ` + + + | | | | ' | | | | ` + + + | | | | ' | | | | ` + + + | | | | ' | | | | ` + + + | | | | ' `
以下のように実行すればよい。
$ ruby starry.rb quine.starry > q1 $ ruby starry.rb q1 > q2 $ diff q1 q2 $ wc -c q1 60190 q1