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程度では、キャッシュを考慮する処理を加えるのと、少ない処理でループさせるのと、どちらが効率的なのだ?