LL Ring[キミならどう書く 2.0 - ROUND 2 - ]がはじまっていた。
http://ll.jus.or.jp/2006/blog/doukaku2
で、Collazt予想なるお題が出ていた。
ネットサーフ中に見つけたので、素人ながらも、ちょっとPHPで書いてみた。
問題設定に従って$n=100になっているけれど、$nを換えればいくらでも上まで行く。
<?php $n = 100; $max_count = 0; $max_answers = 0; for ($i = 1;$i <= $n;$i++) { $appeared = array(); $count = 1; $value = $i; while ($value !== 1) { $value = ($value % 2) ? $value * 3 + 1 : $value / 2; if(isset($appeared[$value])) { echo "$value is cyclic\n"; continue 2; } else { $appeared[$value] = true; } $count++; } $answer[$i] = $count; $max_count = max($max_count,$count); } $max_answers = array_keys($answer, $max_count); echo "max g(k) is $max_count !\n answer k's \n"; print_r($max_answers); echo "all k => g(k)\n"; print_r($answer); ?>
一応、重複や循環してしまい1にならない数が存在する可能性も考慮したので、やってることのわりに冗長になった。
ちなみに、n =100での回答は97が119回のステップ、というのが唯一で最高のようだ。
関数型言語、といわれたにも関わらずPHP。そして手続き型万歳な書き方。申し訳ない。
とかいって、間違ってたりして。
私はアホだからよく間違えるし・・・。
まぁ、間違ってても、挑戦することはいい事、と割り切っておこう。
トラックバック付けるの、ある意味怖いな・・・。
もうちょっと洗練させられる気がしてならないのだが、その場合キャッシュを使いまわして・・・ということになる。
n=100程度では、キャッシュを考慮する処理を加えるのと、少ない処理でループさせるのと、どちらが効率的なのだ?