裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

成長と分裂

2016年02月18日 | ブログラミング

締め切りが 2/18 10:00 AM ということなので,1 分後に投稿されるように予約

バイバイマンのサイズを整数値で表します。
バイバイマンは 1 日毎に体の大きさが倍増します。
一番最初の大きさを「1」とし、1 日経つと 2 倍の「2」、さらに 1 日後は「4」というように、1 日毎に 2 倍になります。
また、一定の大きさをこえると分裂します。
バイバイマンは「1」→「2」→「4」→「8」→「16」と、大きさが 10 を超えたところで分裂します。
分裂後のサイズは、「16」なら「1」と「6」のように 10 の位の数と 1 の位の数になります。
分裂したバイバイマンは、再び大きくなります。
このようなルールで増えるバイバイマンの数を、1 日ごとに調べて、100 日目までを出力してください。
1 日目から 20 日目までは,1, 1, 1, 1, 2, 3, 3, 3, 5, 8, 9, 9, 13, 21, 26, 27, 35, 55, 73, 80 のようになります。

ブルートフォースでやると,とんでもない時間がかかる。
問題をよく調べて見ると,サイズが 1, 2, 4, 8, 6 のものがいくつあるかを数えておいて,次の段階でどのサイズがいくつになるかを整理するとよいことがわかる。
ということで,以下のような簡単なプログラムを得ることができる。
a[1]~a[5] は今の時点でサイズが 1, 2, 4, 8, 6 のものがいくつあるかを表す。次の段階ではそれぞれが 2 倍の大きさの場所に数えられる。ただし,前の段階でサイズ 8 のものは,次の段階では サイズ 1, 6 のものとして,前の段階でサイズ 6 のものは,次の段階では サイズ 1, 2 のものとして数えられる。

a = b = integer(5)
a[1] = 1
for (i in 1:100) {
    cat(sum(a), "\n", sep="")
    b[1] = a[4] + a[5]
    b[2] = a[1] + a[5]
    b[3:5] = a[2:4]
    a = b
}

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 共通の友人数 | トップ | 最寄りの素数 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事