『たのしいRuby 第4版』 第14章 文字列(String)クラス
第14章 文字列(String)クラス
模範解答はこちら
(1)
問題
"Ruby is an object oriented programming language" という文字列に含まれる各単語を要素とする配列を作れ、という問題です。
私的解答
str = "Ruby is an object oriented programming language" ary = str.split(/ /) p ary
split メソッドを使って単純に分割で大丈夫そうです。
引数に何も指定しなければ空白文字による分割になるので、それでもよかった。
(2)
問題
(1)の配列をアルファベット順に並べ替えろ、という問題です。
私的解答
str = "Ruby is an object oriented programming language" ary = str.split(/ /) p ary.sort
sort メソッドを使えば一発です。
(3)
問題
(2)の配列を大文字、小文字の区別なしにアルファベット順に並べ替えろ、という問題です。
私的解答
str = "Ruby is an object oriented programming language" ary = str.downcase.split(/ /) p ary.sort
模範解答のように sort_by メソッドでブロックを作ってそっから配列にするのもいけめんだと思います。
(4)
問題
(1)の文字列に含まれる全ての単語の先頭を大文字に変換しろ、という問題です。
私的解答
str = "Ruby is an object oriented programming language" newStr = "" str.gsub(/\s/, "\n").each_line do |line| newStr << line.capitalize end p newStr.gsub(/\n/, "\s")
今見返すと、二度手間な変換をおこなっていてあまり美しくありませんね。。。
模範解答にあるように、collect(もしくは map) メソッドを使って方が可読性の面でもいいですねー。
(5)
問題
(1)の文字列に含まれる文字とその数を次のような形式で表示させろ、という問題です。
' ': ******* 'R': * 'a': **** 'b': ** 'c': * : :
私的解答
最初に作ったのがこれ。
class String def cntString(word) ary = self.split('') cnt = ary.count("#{word}") puts "'#{word}': " + "*" * cnt end end str = "Ruby is an object oriented programming language" str.cntString(' ') str.cntString('R')
引数に指定した文字がいくつ含まれているかを表示する、cntString メソッドを String クラスに作ってみたものの形式がだいぶ違うのでボツ。
次に作ったのがこれ。
class String def cntStringKai alpha = "abcdefghijklmnopqrstuvwxyz " alphaAry = alpha.split('') alphaCapAry = alpha.strip.upcase.split('') ary = self.split('') alphaCapAry.size.times do |i| cnt = ary.count("#{alphaCapAry[i]}") puts "'#{alphaCapAry[i]}': " + "*" * cnt if cnt >= 1 end alphaAry.size.times do |i| cnt = ary.count("#{alphaAry[i]}") puts "'#{alphaAry[i]}': " + '*' * cnt if cnt >= 1 end end end str = "Ruby is an object oriented programming language" str.cntStringKai
絶対もっといいやり方ある(確信)。アルファベットの配列つくるとことか。 模範解答みたいに、ハッシュ使ってキーと値に分けて考えるとかなりすっきりするということはこの本やって初めて気づいた点です。
(6)
難しすぎて断念。。。
似たような問題はプログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyamaのチャプター8でやったのですが、なにせ漢字で桁を判断したり云々という部分がわけわかめで時間かかりすぎてしまったのでスルーしました(;´Д`)
いつかリベンジしてやりたいと思います。