Collatz 予想
Collatz 予想の関数 を 1 〜 100 の整数に何度も作用させた時の値の変化をアニメーションにしてみた。例によって PostScript で書いて ImageMagick で変換し、作成。
ところで キミならどう書く 2.0 - ROUND 2 - — Lightweight Language Ring の問題ですが、h(20) や h(60) の場合は該当する値が複数あるので、それら全部を表示しなければならないのではないだろうか。そういった場合に対応してないプログラムは失格になるのだろうか。
このアニメーションは h(n) の値そのものは表示しない(最後のコマを見て自分で値を数えなければわからない)ので失格です。
以下 PostScript のソース。
%!PS %%BoundingBox: 0 0 245 235 gsave /N 100 def /keta 4 def /mag 2 def /fsize 14 mag div def /foo N array def 0 1 N 1 sub { foo exch dup 1 add put } for /Times-Roman findfont fsize scalefont setfont /draw { /bar exch def gsave 30 25 translate mag mag scale 0 0 0 setrgbcolor % axis 0 0 N 1 add N rectstroke % ticks 0 10 N { dup 0 moveto 0 fsize -0.5 mul rlineto currentpoint stroke moveto fsize -0.5 mul fsize -1 mul rmoveto ( ) cvs show } for 0 1 keta { dup keta div N mul 0 exch moveto fsize 0.5 mul 0 rlineto currentpoint stroke moveto fsize -2.3 mul fsize -0.3 mul rmoveto (1e) show ( ) cvs show } for % value 1 0 0 setrgbcolor 0 1 N 1 sub { dup 1 add 0 moveto bar exch get log keta div N mul 0 exch rlineto stroke } for grestore showpage } def /arraymax { mark exch aload pop { 2 copy exch mark eq {pop exit} if 3 -1 roll dup 3 -1 roll gt {exch pop}{pop} ifelse } loop exch pop } def /f { /bar exch def 0 1 N 1 sub { /i exch def bar i get dup 2 mod 0 eq {2 idiv} {3 mul 1 add} ifelse bar exch i exch put } for } def { foo draw foo f foo arraymax 4 le {exit} if } loop grestore