Best one liner

最高のワンライナー

受賞者:Taketo Konno

引用元:https://www.ioccc.org/2012/konno/konno.c

審査員・作者による説明:https://www.ioccc.org/2012/konno/hint.html

動作

基本セル・オートマトンのシミュレータ。

ルール30は比較的有名。

$ gcc -o konno konno.c

$ ./konno 30
               #
              ###
             ##  #
            ## ####
           ##  #   #
          ## #### ###
         ##  #    #  #
        ## ####  ######
       ##  #   ###     #
      ## #### ##  #   ###
     ##  #    # #### ##  #
    ## ####  ## #    # ####
   ##  #   ###  ##  ## #   #
  ## #### ##  ### ###  ## ###
 ##  #    # ###   #  ###  #  #
## ####  ## #  # #####  #######

ルール90。シェルピンスキーのギャスケット.

$ ./konno 90
               #
              # #
             #   #
            # # # #
           #       #
          # #     # #
         #   #   #   #
        # # # # # # # #
       #               #
      # #             # #
     #   #           #   #
    # # # #         # # # #
   #       #       #       #
  # #     # #     # #     # #
 #   #   #   #   #   #   #   #
# # # # # # # # # # # # # # # #

ルール102。

$ ./konno 102
               #
              ##
             # #
            ####
           #   #
          ##  ##
         # # # #
        ########
       #       #
      ##      ##
     # #     # #
    ####    ####
   #   #   #   #
  ##  ##  ##  ##
 # # # # # # # #
################

ルール109。

$ ./konno 109
               #
############## # ##############
             #####
############ #   # ############
           ### # ###
########## # ##### # ##########
         #####   #####
######## #   # # #   # ########
       ### # ##### # ###
###### # #####   ##### # ######
     #####   # # #   #####
#### #   # # ##### # #   # ####
   ### # #####   ##### # ###
## # #####   # # #   ##### # ##
 #####   # # ##### # #   #####
 #   # # #####   ##### # #   #

ルール165。

$ ./konno 165
               #
############## # ##############
############# ### #############
############ # # # ############
########### ####### ###########
########## # ##### # ##########
######### ### ### ### #########
######## # # # # # # # ########
####### ############### #######
###### # ############# # ######
##### ### ########### ### #####
#### # # # ######### # # # ####
### ####### ####### ####### ###
## # ##### # ##### # ##### # ##
# ### ### ### ### ### ### ### #
 # # # # # # # # # # # # # # #

解説

基本セルオートマトンは1次元のセルオートマトンで、各セルの状態が左上、真上、右上の3つのセルの状態から決まる。 上の3つのセルが000の場合、001の場合、010の場合、……、111の場合、の8通りの場合に対して0になるか1になるかを決めるので、ルールは2^8 = 256通りある。

このプログラムは、ルールの番号をコマンドライン引数で受け取り、生きているセルが1つだけある状態を第1世代として、16世代まで求める。 動作例で示したのは、比較的興味深いルールの挙動。

作者のコメントで「7&O>>29ではなく7&O<<!o>>!o+29と書いているのはなぜか?」という問いかけがある。 !oは改行直後にだけ1になる式で、この操作によってMSBを落としていると思われる(intが4バイトであることを利用している)。 ただしこれは符号付きintの負の数の右シフトになので、厳密には未定義動作のはず。 丁寧に書くならたとえば(o ? O : O & 0x7fffffff) >> 29だろうか。

審査員の問いかけとして、「64ビット整数を使って32行出力するための最小の変更は?」とある。 最小ではないが、解析ついでに作っておいた。

int _;f(O,l,o)long O,o;char**l;{_++>>11||f(1&(o?o:O)|O*2,l,putchar(_%64?atoi(1[l])>>(7&O<<!o>>!o+61)&64<_|_==32?35:32:10)%10);}main(O,l)char**l;{f(O,l,1);}