『たのしいRuby』
結構気の利いた練習問題が収録されているので別解など考えて遊びたい
例1
"七千百二十三"といった、漢数字による数の表現を、「7123」のような数値に変換するメソッドkan2numを定義してください。
本書付属の答え
def kan2num(string)
digit4 = '0'
digit3 = '0'
digit2 = '0'
digit1 = '0'
nstring = string.dup
nstring.gsub!(/一/,'1')
nstring.gsub!(/二/,'2')
nstring.gsub!(/三/,'3')
nstring.gsub!(/四/,'4')
nstring.gsub!(/五/,'5')
nstring.gsub!(/六/,'6')
nstring.gsub!(/七/,'7')
nstring.gsub!(/八/,'8')
nstring.gsub!(/九/,'9')
if nstring =~ /((\d)?千)?((\d)?百)?((\d)?十)?(\d)?$/
if $1
digit4 = $2 || '1'
end
if $3
digit3 = $4 || '1'
end
if $5
digit2 = $6 || '1'
end
digit1 = $7 || '0'
end
return (digit4+digit3+digit2+digit1).to_i
end
if __FILE__ == $0
print kan2num('七千百二十三'),"\n"
end
別解
折角なので万や億まで対応させたい(そうするとアルゴリズムが少し複雑になる)
def kan2num(kan)
bignum = 0
num = 0
n = 0
kan_array = kan.split(//)
kan_array.each{|k|
case k
when '一'
return nil if n != 0
n = 1
when '二'
return nil if n != 0
n = 2
when '三'
return nil if n != 0
n = 3
when '四'
return nil if n != 0
n = 4
when '五'
return nil if n != 0
n = 5
when '六'
return nil if n != 0
n = 6
when '七'
return nil if n != 0
n = 7
when '八'
return nil if n != 0
n = 8
when '九'
return nil if n != 0
n = 9
when '十'
if n == 0
num += 10
else
num += 10*n
n = 0
end
when '百'
if n == 0
num += 100
else
num += 100*n
n = 0
end
when '千'
if n == 0
num += 1000
else
num += 1000*n
n = 0
end
when '万'
bignum += 10000*(num + n)
num = 0
n = 0
when '億'
bignum += 100000000*(num + n)
num = 0
n = 0
else
return nil
end
}
bignum + num + n
end
kan = "三億千二十五万二千五百十二"
p kan2num(kan)
例2はまたこんど^^


