Starry で quine

とりあえず書いてみた。長いです (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