Best Assembler

最高のアセンブラ

受賞者:Stephen Sykes

引用元:https://www.ioccc.org/2006/sykes1/sykes1.c

審査員・作者による説明:https://www.ioccc.org/2006/sykes1/hint.text

動作

Bedlam cubeというパズルを解く。

実行すると端末に解き方が描かれる。

$ gcc -o sykes1 sykes1.c

$ ./sykes1








                +----+                        +----+
        +----+-//////|-+              +----+-//////|-+
       ///////+----+/|/|             ///////+----+/|/|
      +----+--||||||/+/|            +----+--||||||/+/|
      ||||||||||||||///+            ||||||||||||||///+
      ||||||||||||||///             ||||||||||||||///
      +----+--||||||/+              +----+--||||||/+
              ||||||/                       ||||||/
              +----+                        +----+












                                              +----+
                       +----+         +----+-/    /|-+----+
                   +----+///|        /      +----+----+///|
                  //////|///|       +----+--|   //////|///|
                 +----+/|///+       |       |  +----+/|///+
              +--||||||/+///        |       +--||||||/+///
             ////||||||///+         +----+-////||||||///+
            +----||||||///                +----||||||///
            |||||||||||/+                 |||||||||||/+
            |||||||||||/                  |||||||||||/
            +----+----+                   +----+----+










                                              +----+
                                      +----+-/    /|-+----+
              +----+                 /      +----+----+  /|
             //////|                +----+-//////    /| + |
            ///////|                |     //////----+ |/  +
           ////////+                |    //////|    | +  /
          +----+///                 +---+----+/|    |   +
       +--||||||/+----+              +--||||||/+----+  /
      ////||||||//////|             ////||||||//////| +
     +----||||||----+/|            +----||||||----+/|/
     ||||||||||||||||/+            ||||||||||||||||/+
     ||||||||||||||||/             ||||||||||||||||/
     +----+----+----+              +----+----+----+



             +----+                        +----+
            //////|                       //////|
           +----+/|                      +----+/|
           ||||||/+                      ||||||/+
           ||||||/|                      ||||||/|
           +----+/|                      +----+----+
          ////////+                   +-//////    /|-+----+
         +----+///                   / +----+----+----+  /|
         ||||||/+                   +--||||/    /    /| + |
         ||||||/|                   |  |||+    +----+ |/  +
         +----+/|                   |  +-/    /|    | +  /
        ////////+                   +-//+----+ |    |   +
       +----+///                     +--|    | +----+  /
       ||||||/+                     /   |    |/    /| +
       ||||||/                     +----+    +----+ |/
       +----+                      |              | +
                                   |              |/
                                   +----+----+----+



                                      +----+----+----+----+
                                     /         /         /|
                                    +----+    +----+----+ |
                                   /    /         /    /| +
              +----+              +    +----+----+----+ | |
             //////|             /         //////    /| + |
            /////+----+         +    +----/////+----+ | | +
           ///////////|        /    /    ///////////| + | |
          +----+----+/|       +----+----+----+----+/| | + |
          |||||||||||/+       |    |    |||||||||||/+ |/  +
          |||||||||||/        |    |    |||||||||||/  +  /|
          +----+----+         +----+    +----+----+  /| + |
            +----+            |    |    |         | + |/  +
                              |    |    |         | | +  /
                              +    +----+----+    + |   +
                              |         |    |    | +  /
                              |         |    |    |/| +
                              +    +----+    +----+ |/
                              |    |              | +
                              |    |              |/
                              +----+----+----+----+

そして同時に、より見やすいgifファイルも生成される。

Bedlem cubeの解を説明しているアニメGIF
図:Bedlem cubeの解を説明しているアニメGIF

解説

解は19186通りあるらしく、コマンドライン引数で何個目に見つかった解を表示するかを指定できる。

$ ./sykes1 10

コードの形状は立方体が5つ。 Bedlam cubeのパーツはほとんどがペンタキューブ(立方体が5つくっついた形)だからだと思われる。 正確には、12個のペンタキューブと1個のテトラキューブ(立方体4つ)とのこと。

コードはhtmlとしても解釈できる(validなhtmlではないが、多くのブラウザなら開ける)。 このhtmlは、生成されたgifを表示するものになっている。

生成されるGIFは無圧縮で2.2 MBもある。 GIFの圧縮アルゴリズムであるLZWはUnisysが利用料請求の方針を示していたことで有名だったが、2003年ごろに特許が失効したので、あまり関係ない。 “I don’t violate any of those old Unisys patents!”と言っているが、単に無圧縮のほうが出力しやすいためと思われる。 なお、本記事のGIF画像はImageMagickで圧縮をかけたものになっている。

賞名のassemblerは、「組み立てる人」という意味と、アセンブラ言語から機械語に翻訳するアセンブラとをかけている。