引用元: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);}