methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

亀の子算

昨日帰省から帰ってきた。帰省ラッシュから時期を前にずらして帰省したから、高速楽ちんだった。
で、今日はダラケもーどなんで、挑戦してみる。(自分で解きたい人は下を見ないこと)
http://satoshi.blogs.com/life/2006/08/post_3.html

ルール1.亀には、親亀、子亀、孫亀の三種類がある
ルール2.地面に直接立つ(?)ことができるのは親亀だけ
ルール3.子亀は親亀の上にだけ乗ることができる
ルール4.孫亀は子亀の上にだけのることができる
ルール5.親亀の上に載っている子亀の数は0または6
ルール6.子亀の上に載っている孫亀の数は0または6
ルール7.親亀は他の亀の上に乗ることはできない

【例題1】親亀が11匹います。その上に何匹かの子亀、そしてさらにその上に何匹かの孫亀がいます。上に他の亀を乗せていない亀の数を数えた所、56匹でした。さて、亀は全部で何匹いるでしょう?

6匹を1セットって考えると楽。
上に何も載せていない1セットの亀を取り除くと、亀の数は6匹減るが、上に他の亀を載せていない亀の数は5匹しか減らない。56匹の上に他の亀を載せていない亀がいる状態から、何セットの亀を取り除くと親亀だけになるか?(56-11)÷5=9セット。9セットの亀の数は6×9=54匹。親亀も合わせた数は54+11=65匹。

さて、こういった問題で肝心なのは、法則を見つけ出すこと。上の例では、6匹とったら1匹新しい「上に他の亀を載せていない亀」が出てくるという法則から簡単に数式を導きだせた。
逆に、問題を作る側は、巧妙な法則をシンプルなルールの中に上手く隠さないと、難易度と解けたときの爽快感を両立するセンスの良いパズルを作れない。

そして、ソフトの仕様を決めるときには、簡単な法則が成り立つようにルール体系を作る必要がある。これはプログラマが担当しないと、殆どの文系人にはセンスがないので、大したこと無い機能仕様でもプログラムは複雑ってことになってしまう。