Just do IT

思うは招く

Ruby基礎問題100本ノック#16 文字列をいじる

お題

  • (1) "Ruby is an object oriented programming language"という文字列に含まれる各単語を要素とする配列を作れ
  • (1)の配列をアルファベット順にソートせよ
  • (2)の配列を大文字と小文字の区別をせずにアルファベット順にソートせよ
  • (1)の文字列の各文字(単語ではない)をそれぞれカウントせよ

回答

splitメソッドで配列に分割。

str = %q(Ruby is an object oriented programming language)
str.split(' ')
=> ["Ruby", "is", "an", "object", "oriented", "programming", "language"]

アルファベット順にソート。

str.split(' ').sort
=> ["Ruby", "an", "is", "language", "object", "oriented", "programming"]

大文字と小文字の区別をせずにアルファベット順にソート。

str.split(' ').sort { |a, b| a.downcase <=> b.downcase }
=> ["an", "is", "language", "object", "oriented", "programming", "Ruby"]

文字列の各文字(単語ではない)をそれぞれカウント。

ary = str.chars
hash = Hash.new(0)
ary.each { |n| hash[n] += 1 }
p hash
=> {"R"=>1,
 "u"=>2,
 "b"=>2,
 "y"=>1,
 " "=>6,
 "i"=>3,
 "s"=>1,
 "a"=>4,
 "n"=>4,
 "o"=>3,
 "j"=>1,
 "e"=>4,
 "c"=>1,
 "t"=>2,
 "r"=>3,
 "d"=>1,
 "p"=>1,
 "g"=>4,
 "m"=>2,
 "l"=>1}

引用:たのしいRuby 第6版 P.324より

学び

split

単純にsplitだけで良かった。

str.split(' ')
→ str.split

sort

sort_byだともっとシンプルに書けた。 sortメソッドは昇順がデフォルトなので、アルファベットは自動でアルファベット順にソートされる。各要素を小文字にしてソートすればいい。

str.split(' ').sort { |a, b| a.downcase <=> b.downcase }
→ str.split(' ').sort_by { |a| a.downcase }

最後の各単語に関しては以前にやったので説明は省略(DRYの原則につき)。

k-koh.hatenablog.com