Hamamatsu.rb #54 問題5 回答
作成日 | : | 2015/07/17 |
---|---|---|
最終更新日 | : | 2020/07/09 |
Hamamatsu.rb #54 問題5 回答
作成日 | : | 2015/07/17 |
---|---|---|
最終更新日 | : | 2020/07/09 |
概要
- Hamamatsu.rb #54のCodeKataKataの問題5を解きました。
問題5
問題
ある直方体の高さはたてより1cm長く、横より1cm短いです。 その体積は3□□□□□26c㎡です。(5個の□の数はわかりません) この直方体の高さは何cmですか。
解
たての長さを\(h\)、よこの長さを\(w\)、高さを\(d\)とすると、直方体の体積\(V\)は次式で与えられる。
\[
V = hwd
\tag{1}
\]
問題文より、高さを\(n\)とすると式(1)は次のように変形できる。
\[
\begin{align*}
V &= hwd \\
&= (n - 1)(n + 1)n \\
&= n^3 - n \\
\end{align*}
\tag{2}
\]
式.2より、\(V\)は1辺の長さが\(n\)の立方体の体積よりも小さいことが 判る。
また、\(m = n - 1\)とすると式1.は次のように変形できる。
\[
\begin{align*}
V &= hwd \\
&= m(m + 2)(m + 1) \\
&= m^3 + 3m^2 + 2m \\
\end{align*}
\tag{3}
\]
式3.より、\(V\)は1辺の長さが\(m = n - 1\)の立方体の体積よりも大きいことが 判る。
問題文から、体積の取り得る最小値は次式となる。 \[ V_{min} = 30000026 \]
式2.と式3.より\(n\)の下限値\(n_{min}\)は次のようになる。
\[
\sqrt[3]{V_{min}} - 1 < n_{min} < \sqrt[3]{V_{min}}
\tag{4}
\]
問題文から、体積の取り得る最大値は次式となる。 \[ V_{max} = 39999926 \]
式2.と式3.より\(n\)の上限値\(n_{max}\)は次のようになる。
\[
\sqrt[3]{V_{max}} - 1 < n_{max} < \sqrt[3]{V_{max}}
\tag{5}
\]
式4.と式5.より\(n\)の範囲は次のようになる。
\[
\sqrt[3]{V_{min}} - 1 < n < \sqrt[3]{V_{max}}
\tag{6}
\]
式4.を\(m = n - 1\)として変形する。
\[
\sqrt[3]{V_{min}} - 2 < m
\tag{7}
\]
プログラム
式(6), 式(7)を用いて問題を解くプログラムを作成する。 初期化は\(V\)の正規表現を与える。
問題の答えはcalcメソッドで得られる。 このとき、引数に計算する範囲を与える。
\(n\)が見つかれば値が得られ、見つからなければ nil を得る。
class Math5 def initialize(pattern) @pattern = pattern end def calc(min, max) for n in min..max do range = n...n+3 prod = range.reduce(&:*) if @pattern =~ prod.to_s return n + 1 end end return nil end end min = 30000026 ** (1.0/3.0) - 2 max = (39999926 ** (1.0/3.0)) obj = Math5.new(/3\d{5}26/) p obj.calc(min.to_i, max.to_i)
上記ソースコードをmath5_langur.rbとして保存し、実行してみた。
$ ruby ./math5_langur.rb 322 $