##はじめに
この記事は以下のサイトにあった問題を解いてみたものです。Rubyのアウトプットを目的として作成しました。
[アウトプットのネタに困ったらこれ!?Ruby初心者向けのプログラミング問題を集めてみた(全10問)]
(https://blog.jnito.com/entry/2019/05/03/121235)
##問題
上記記事より引用。
「ある駄菓子屋で飲み物を買うと、空き瓶3本で新しい飲み物を1本プレゼントしてくれる。最初に100本購入した場合、トータルで何本飲めるか」という小学校3年生の算数の問題をベースにしたプログラミング問題です。
購入した本数 | 飲める本数 |
---|---|
0 | 0 |
1 | 1 |
3 | 4 |
11 | 16 |
100 | (プログラムで算出する) |
コード
def drink_count(num)
if num % 2 == 0
sum = num + (num - 2) / 2
else num % 2 != 0
sum = num + (num - 1) / 2
end
puts sum
end
drink_count(100)
##考え方
小学3年生の算数の問題をベースにしているらしいので、元の数と飲める本数の数の法則を導いて、それをプログラムに落とし込むことにしました。
偶数の時
まず、ドリンクが100本ある場合を考えます。そのうち3本を飲むと、3本空き瓶ができるので1本ドリンクが増えます。結果98本になります。
ドリンクが98本ある時、そのうち3本飲むと同様に3本の空き瓶ができるので1本ドリンクが増えます。結果96本になります。
ドリンクが96本ある時、そのうち3本飲むと同様に3本の空き瓶ができるので1本ドリンクが増えます。結果94本になります。
この思考を繰り返すと、ドリンクが2本になるまで、"ドリンクを3本飲んだら飲める本数が1本増える"事象が起こります。この事象で減る本数は2本で、飲める本数は1本増えます。
つまり飲める本数は、残り2本になるまで"元の数から2本減るごとに1本増える"と言うことが言えるかと思います。
ここで、何本飲める本数が増えたかを考えます。元の数から2本に減るまでに、2本減るごとに1本増えているのですから、元の数から2を引いたものを2で割れば何回増えたか求められそうです。
増えた本数 = (元の本数 - 2) / 2
= (100-2) / 2 = 49
これを元の本数に足してやれば、合計の飲める本数が求められます。
合計 = 元の本数 + 増えた本数
= 100 + 49 = 149
偶数の時に関しては、上記の式の元の本数のところにそれぞれの場合の数を当てはめればこれで求められそうです。
奇数の時
次に奇数の時について考えました。
仮に99本が元の本数だったとすると、100本の時と同様の考え方で、飲める本数は"元の数から2本減るごとに1本増える"と言うことが言えるかと思います。これは飲める本数が1本になるまで続きます。
ここで、何本飲める本数が増えたかを考えます。元の数から1本に減るまでに、2本減るごとに1本増えているのですから、元の数から1を引いたものを2で割れば何回増えたか求められそうです。
増えた本数 = (元の本数 - 1) / 2
= (99 - 1) / 2 = 49
これを元の本数に足してやれば、合計の飲める本数が求められます。
合計 = 元の本数 + 増えた本数
= 99 + 49 = 148
これらをコードに落とし込みます。
def drink_count(num)
if num % 2 == 0
sum = num + (num - 2) / 2
else num % 2 != 0
sum = num + (num - 1) / 2
end
puts sum
end
感想、まとめ
100本の時と99本の時の増えた本数が同じなので、そこをうまくプログラムで表現できればもっと短いコードになりそうに感じます。