前提
ふとぼんやり考えて「あーこういうこと考えるの楽しいなー」と思う感覚を共有したい記事です。
筆者はシステム設計をやっている者ではないです。
問題
「ふしぎなポケット」まど・みちお作詞
ポケットの なかには
ビスケットが ひとつ
ポケットを たたくと
ビスケットは ふたつもひとつ たたくと
ビスケットは みっつ
たたいて みるたび
ビスケットは ふえるそんな ふしぎな
ポケットが ほしい
そんな ふしぎな
ポケットが ほしい
ビスケットの増えかたについて考察
ビスケットの増えかたにはひとつ->ふたつ->みっつ
という情報がある。
1,2,4,8...と増えるのは間違いだとわかるが、1,2,3,4,...も1,2,3,5,8,...もあり得る。
さらに叩いてみるたび増える
が3つに増えるまでの現象のみを指しており、未来については言及していないという可能性もある。
よってビスケットが増える仕様として想定しておくものは以下の3通り。
A. 1,2,3,4,...とひとつずつ増える
B. 1,2,3,5,8,...とフィボナッチ数列的に増える
C. 1,2,3と増えて止まる
不思議なのはポケットなのかビスケットなのか
そもそもそんなふしぎなポケットがほしい
なのでポケットなのだが、ちょっと考えてみる。
ビスケット自身の機能で増える場合
単純に「叩かれると増える」だと1,2,4,...と増えそうなのでNG。
ここに例えば「増えるのは一度きり」という仕様を追加すると、1,2,3,4,...というAの動作をしてくれそうなのでOKっぽい。
例えば「2度増えると死ぬ」という仕様にすればBが実現できる。
「ポケットの残り容積が足りない場合は複製に失敗する」みたいな処理が入るならCは間接的に実現できそうだけどロバスト性に欠ける。
ポケットの機能でビスケットが増える場合
Aをやろうとしてみる
「叩かれるとなにかしらのビスケットがひとつ生成される」機能だと、作った時点で想定していなかった種類のビスケットは生成されなそうなので何年後かにメンテが必要。
ビスケットが入ってない時でもビスケットが生成できるのでそこは嬉しい。
ただ、ビスケット以外のものでも増やせたほうが夢があるのでそこは限定したくない。
「中のものの種類をチェックする」機能を追加するとクリアできるけど、一気に機能が複雑になるしこれ以上考えてもあんまり面白くなさそう。
Bをやろうとしてみる
前回と前々回にいくつ増やしたか(あるいはいくつ存在したか)を覚えておく必要がある。
発想というよりは腕力でねじ伏せる感じのソリューションなのでこれ以上考えても(略
途中でビスケットをいくつか食べたあとに謎の挙動をして持ち主を困惑させる恐れもあるし。
Cをやろうとしてみる
いまいくつあるのか(もしくは何回増やしたか)を気にする必要がある。
「ポケットの残り容積が足りない場合は失敗する」みたいな処理が入るなら実現できそうだけどロバスト性に欠ける。
さいごに
あーたのしい。
しかし実際に使われるシーンを想像してみると、ビスケット側に実装したほうが幸せな気がしますよね。
童謡とか物語とかのシーンを抜き出して、「私ならこうプログラミングする」みたいな大喜利やるとたのしそうだなー。