Most underscored argument
もっともアンダースコアな引数
受賞者:Ferenc Deak
引用元:https://www.ioccc.org/2014/deak/prog.c
審査員・作者による説明:https://www.ioccc.org/2014/deak/hint.html
動作
マンデルブロ集合を端末に描く。
$ gcc -o prog prog.c
$ ./prog
-------------.......................................................-------------
-----------................................ ................-----------
---------.............................. ..............---------
--------............................ ++@++++ .............--------
------........................... +++@+@@@+++ .............------
-----.......................... ++++@@.- --.++ ............-----
----......................... ++++@@-.+@@@ @+++ ............----
--......................... +++++@@--.+ ++.-@+++ .............--
-........................ +++++@@-..@@@ + .@@++++ ............-
....................... +++++@@@@-. @- -@@-@@+++++ .............
..................... +++++@@@@--..@ ++.-@@@+++++ ............
................... ++++++@@-----. @- +@ .--@@@@@++ ...........
................. +++++++@@- - @ - -.@ @+.-@@ .--. -++ ..........
............... ++++++++@@@-. @ @ .. @ -+.@@ @++ ..........
............ ++++++++++@@@--.+ - ++ @-@++ .........
.......... ++++++++++@@@@@--. @ - ++.@@++ ........
....... +++@@@@@@@@@@@@--- . .. ..+.-@++ ........
..... ++++@@+-----------.. -. @ -++ ........
... +++++@@ . .. @ ..... +@ + +.@+ .......
.. +++++@@-.--@ @--.- + ++ + @-@++ .......
. ++++++@@--.+. @+@ + @-@-@ . -@++ .......
+++++@@@--.+@ - +++ @-+++ ......
++++@@@@-.+ @. -+ +.@+++ ......
+++++@@@@@--. . - + -@+++ ......
+++@@- .--... +@ -@@+++ ......
++.-@@+++ ......
+++@@- .--... +@ -@@+++ ......
+++++@@@@@--. . - + -@+++ ......
++++@@@@-.+ @. -+ +.@+++ ......
+++++@@@--.+@ - +++ @-+++ ......
. ++++++@@--.+. @+@ + @-@-@ . -@++ .......
.. +++++@@-.--@ @--.- + ++ + @-@++ .......
... +++++@@ . .. @ ..... +@ + +.@+ .......
..... ++++@@+-----------.. -. @ -++ ........
....... +++@@@@@@@@@@@@--- . .. ..+.-@++ ........
.......... ++++++++++@@@@@--. @ - ++.@@++ ........
............ ++++++++++@@@--.+ - ++ @-@++ .........
............... ++++++++@@@-. @ @ .. @ -+.@@ @++ ..........
................. +++++++@@- - @ - -.@ @+.-@@ .--. -++ ..........
................... ++++++@@-----. @- +@ .--@@@@@++ ...........
..................... +++++@@@@--..@ ++.-@@@+++++ ............
....................... +++++@@@@-. @- -@@-@@+++++ .............
-........................ +++++@@-..@@@ + .@@++++ ............-
--......................... +++++@@--.+ ++.-@+++ .............--
----......................... ++++@@-.+@@@ @+++ ............----
-----.......................... ++++@@.- --.++ ............-----
------........................... +++@+@@@+++ .............------
--------............................ ++@++++ .............--------
---------.............................. ..............---------
-----------................................ ................-----------
-------------.......................................................-------------
解説
ひさびさにマクロで引っ掻き回した作品。
プリプロセスをかけただけだと、わりと巨大になってしまう。
#define __(...)
がsizeof
を使った式を出しているが、少し観察すると、単にこのマクロの引数の数になるだけとわかるので、そこに注意して処理すれば解読できる。
マンデルブロ集合の描画範囲は/* <-- Configure here: X1, X2, Y1, Y2 */
というコメントがあるところをいじれば変更可能。
作者コメントによると、C言語っぽいと感じさせるコード断片を極力隠すというテーマで作ったもので、そうでなければ次のようなコードを書いただろうとのこと。
double _[]={-2
,1,-1.3 ,1.3, 0, 0,0,0
,0 ,0,50, 80, 0,0,0 ,255
, 8,0}; int main (
int j) {if (j== 1 ){ if(
_[12] >_[10] )_[17]=1 ;} if
(_[13] >_[11 ] ||_[17]==1) return
;_[6] = _ [13] / _[11]*(_[1]-_[ 0])
+_[ 0]; _ [7]=_[12]/_[10]*(_[3]-_[2] )+_
[2];_[8]=_[9]=_[14]=0;l2:_[4]=_[8] * _ [8]
;_[ 5]= _ [9]*_[9];_[9]=2*_[8]*_[9]+ _[7
];_[8 ] = _ [ 4 ]-_[5]+_[6];_[14 ]++
;if((_ [14]< _ [15])&&(_[4]+ _[ 5]
<_[16 ])) goto l2; putchar(
" #@*+ "[( int) _[14]%
5 ]);_ [13 ] ++ ; main (
0) ;_[12]++; _[13] =0
;if(_ [17] !=1) putchar
(0xa); main(1);}
賞名の”underscored”はコードに多数のアンダースコアが使われていることを指しているが、英単語としては「強調された」という意味もある。