本題
今回は第14章の練習問題をいく。少し難しい部分もあった。
(1) "Ruby is an object oriented programming language."という文を書く単語に分け配列にせよ。
text = "Ruby is an object oriented programing language"
arry = text.split(/ /)
#出力して確認してみます
p arry
# 実行結果:["Ruby", "is", "an", "object", "oriented", "programing", "language"]
特にコメントはない。
(2) (1)の配列をアルファベット順にソートせよ。
text = "Ruby is an object oriented programing language"
arry = text.split(/ /)
#アルファベット順にソートする
arry.sort!
#出力しておきます
p arry
#実行結果:["Ruby", "an", "is", "language", "object", "oriented", "programing"]
ちなみに、sortよりsort_byの方が処理が早いそうです。
(3) (2)の配列を大文字小文字の区別なくアルファベット順にソートにせよ。
text = "Ruby is an object oriented programing language"
arry = text.split(/ /)
#出力しておきます
p arry.sort_by {|v| v.downcase }
#実行結果:["Ruby", "an", "is", "language", "object", "oriented", "programing"]
downcaseで一度大文字にしてから比較させてみました。
(4) (1)の文字列に含まれる文字とその数を ' ': ****** , R
: *,....のような形式で表示させよ。
text = "Ruby is an object oriented programing language"
table = Hash.new(0)
text.scan(/./){|m| table[m] += 1}
table.each do |key , value|
count = "*" * value
p "#{key}:#{count}"
end
#実行結果:"R:*"\n"u:**"\n"b:**"\n"y:*"...省略
scanメソッドを利用しハッシュ化させました。
(5) ”七千百二十三"といった、漢数字による1~9999の数の表現技法を「7123」のような数値に帰るメソッドkan2numを定義せよ。
def kan2num(str)
str.gsub!(/一/, "1")
str.gsub!(/二/, "2")
str.gsub!(/三/, "3")
str.gsub!(/四/, "4")
str.gsub!(/五/, "5")
str.gsub!(/六/, "6")
str.gsub!(/七/, "7")
str.gsub!(/八/, "8")
str.gsub!(/九/, "9")
str =~ /((\d)?千)?((\d)?百)?((\d)?十)?(\d)?$/
if $1
sen = $2 || "1"
end
if $3
hyaku = $4 || "1"
end
if $5
zyu = $6 || "1"
end
if $7
ichi = $7
end
ans = sen.to_i * 1000 + hyaku.to_i * 100 + zyu.to_i * 10 + ichi.to_i
end
p kan2num("千二十三")
#実行結果:1023
p kan2num("二千十九")
#実行結果:2019
p kan2num("七百九十四")
#実行結果:794
p kan2num("千百九十二")
#実行結果:1192
泥臭いですが、まずは漢数字の一、二、三、四…を先に数字に変換しました。その次に正規表現を使い、それぞれの位(千,百,十,一)の数値を取得し、その値を桁の数に合わせて掛け合わせ足すという方式を取りました。結構、自分には難しかったです。
最後に
今回は文字列に対する操作が多い問題でした。そして、最後の問題が思ったよりもヘビーでした…正規表現、使いこなそうと思うと難しいなぁ…