メソッドの作り方(「新しい」ローマ数字)於Ruby

実に有効なると思われるRuby及びプログラミングの入門書 初めてのプログラミング の各章の最後に位置付けられる練習問題にて正解の掲載されぬに 幾許か不安を感じるも在りや無しや、本誌愛読ご同志に捧ぐ、 当ブログに於いては参照、比較検討用に生贄的に供す個人的な解釈、解答を掲載す為の本カテゴリー 初めてのプログラミング は前回に相当2009年1月17日のアーティクル メソッドの作り方 於Ruby にて入るは第9章の
9章 メソッドの作り方
9.1 メソッド引数
9.2 局所変数
9.3 返り値
9.4 練習問題
に提示される練習問題に応じた アラビア数字を引数として、ローマ数字を返り値とせよ は前編、課題として残したが後篇なる
やがてある人が、小さい数を大きい数の前に入れて、 小さい数を引き算するようにすれば、すさまじく便利なことに気が付きました。 この発展の結果、今ここで、あなたはてこずることになります。 先のメソッドを新しいタイプのローマ数字の文字列を返すように書き換えてみましょう。
と云うものにて、前編と同様にヒントとして与えられるのが次の引用なれば
整数の割り算と余り演算子を使います。また参考のため、ローマ数字で使われる文字を挙げておきます。
I=1 V=5 X=10 L=50 C=100 D=500 M=1000
即ち roman_numeral 4 に対し、前回は IIII と返したを、今回は IV と返されるを想定するのが 新しいローマ数字 の課題に、今回は此方への当方の解答例を贄に供すべく思います。
スポンサーリンク
以下
def show_place btm_fig, mid_fig, upp_fig, num
  if num <= 2
    return btm_fig ∗ num
  elsif num <= 4
    return btm_fig ∗ (5 - num) + mid_fig
  elsif num == 5
    return mid_fig
  elsif num <= 7
    return mid_fig + btm_fig ∗ (num - 5)
  else
    return btm_fig ∗ (10 - num) + upp_fig
  end
end

def roman_numeral num
  fourth_place = num / 1000
  third_place = (num % 1000) / 100
  second_place = (num % 100) / 10
  first_place = num % 10
  ´M´∗fourth_place
   + show_place(´C´,´D´,´M´,third_place)
   + show_place(´X´,´L´,´C´,second_place)
   + show_place(´I´,´V´,´X´,first_place)
end

puts ´1~3000迄の数字を入力してください。´
puts ´入力された数字をローマ数字に変換します。´
ip_num = gets.chomp.to_i
puts roman_numeral(ip_num)
にてご覧の通り、入力値チェックは実装していないのはご了承あられ度も、 本体なるはメインルーチン roman_numeral で桁分けをした夫々の桁表示を show_place に委託するに当該数字をヒント所与のローマ数字と共に引数として渡しています。

上記プログラムを、現在の手元環境
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
で走らせて得られる結果は、先ずは所与の4に於いては
C:¥tsukamotch¥Ruby¥programs
   >ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
4
IV
と、取敢えずは想定した儘の結果 IIII を得られ、また限界値3000でも
C:¥tsukamotch¥Ruby¥programs
   >ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
3000
MMM
任意の数字1289でも
C:¥tsukamotch¥Ruby¥programs
   >ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
1289
MCCXXCIX
の様に想定の結果が得られる様ですが、 多少力技の感の無きにしも非ず、 次章、第10章では 再帰 を学習の予定なれば、 其の後当該手法を用いたコードを供し度予定しています。

扠、実は上記今回の贄コードに辿り着くには多少の紆余曲折有るは
def roman_numeral num
  m_num = num ⁄ 1000
  d_num = (num % 1000) ⁄ 500
  c_num = (num % 500) ⁄ 100
  if d_num == 1
    if c_num == 3
      c_num = 0
      cd_num = 2
    elsif c_num == 4
      c_num = 0
      cd_num = 1
    else
      cd_num = 0
    end
  else
    if c_num == 3
      c_num = 0
      d_num = 1
      cd_num = 2
    elsif c_num == 4
      c_num = 0
      d_num = 1
      cd_num = 1
    else
      cd_num = 0
    end
  end
  l_num = (num % 100) ⁄ 50
  x_num = (num % 50) ⁄ 10
  if l_num == 1
    if x_num == 3
      x_num = 0
      xl_num = 2
    elsif x_num == 4
      x_num = 0
      xl_num = 1
    else
      xl_num = 0
    end
  else
    if x_num == 3
      x_num = 0
      l_num = 1
      xl_num = 2
    elsif x_num == 4
      x_num = 0
      l_num = 1
      xl_num = 1
    else
      xl_num = 0
    end
  end
  v_num = (num % 10) ⁄ 5
  i_num = num % 5
  if v_num == 1
    if i_num == 3
      i_num = 0
      iv_num = 2
    elsif i_num == 4
      i_num = 0
      iv_num = 1
    else
      iv_num = 0
    end
  else
    if i_num == 3
      i_num = 0
      v_num = 1
      iv_num = 2
    elsif i_num == 4
      i_num = 0
      v_num = 1
      iv_num = 1
    else
      iv_num = 0
    end
  end
  show_num = (´M´∗m_num)
    +(´C´∗cd_num)
    +(´D´∗d_num)
    +(´C´∗c_num)
    +(´X´∗xl_num)
    +(´L´∗l_num)
    +(´X´∗x_num)
    +(´I´∗iv_num)
    +(´V´∗v_num)
    +(´I´∗i_num)
end

puts ´1~3000迄の数字を入力してください。´
puts ´入力された数字をローマ数字に変換します。´
ip_num = gets.chomp.to_i
puts roman_numeral(ip_num)
には重大なるバグの存ぜば、 さあご用とお急ぎでない方は頂戴、見て頂戴。

1件のコメント

  1. 再帰プログラム入門

    初めてのプログラミング懇切丁寧、微に入り細を穿ちて著されればRuby及びプログラミングの両者が目的に共に入門書としてお誂え向きとて愛読の初めてのプログラミングの各章の最後に設けられた練習問題では正解の掲載されぬを、幾許か不安を感じるも在り哉無し哉、共に本誌を

コメントは受け付けていません。