Hamamatsu.rb #54 問題5 回答

作成日:2015/07/17
最終更新日:2020/07/09

Hamamatsu.rb #54 問題5 回答

作成日:2015/07/17
最終更新日:2020/07/09

概要

問題5

問題

ある直方体の高さはたてより1cm長く、横より1cm短いです。 その体積は3□□□□□26c㎡です。(5個の□の数はわかりません) この直方体の高さは何cmですか。

たての長さを\(h\)、よこの長さを\(w\)、高さを\(d\)とすると、直方体の体積\(V\)は次式で与えられる。

\[ V = hwd \tag{1} \]
式1. 

問題文より、高さを\(n\)とすると式(1)は次のように変形できる。

\[ \begin{align*} V &= hwd \\ &= (n - 1)(n + 1)n \\ &= n^3 - n \\ \end{align*} \tag{2} \]
式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. 

式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} \]
式4. 

問題文から、体積の取り得る最大値は次式となる。 \[ V_{max} = 39999926 \]

式2.と式3.より\(n\)の上限値\(n_{max}\)は次のようになる。

\[ \sqrt[3]{V_{max}} - 1 < n_{max} < \sqrt[3]{V_{max}} \tag{5} \]
式5. 

式4.と式5.より\(n\)の範囲は次のようになる。

\[ \sqrt[3]{V_{min}} - 1 < n < \sqrt[3]{V_{max}} \tag{6} \]
式6. 

式4.を\(m = n - 1\)として変形する。

\[ \sqrt[3]{V_{min}} - 2 < m \tag{7} \]
式7. 

プログラム

式(6), 式(7)を用いて問題を解くプログラムを作成する。 初期化は\(V\)の正規表現を与える。

問題の答えはcalcメソッドで得られる。 このとき、引数に計算する範囲を与える。

\(n\)が見つかれば値が得られ、見つからなければ nil を得る。

ソース1. math5_langur.rb
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として保存し、実行してみた。

コマンド1. コマンド実行結果
$ ruby ./math5_langur.rb
322
$