単語分析
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 54/56。
文字列、ハッシュ、Hash.new(0)、そしてEnumerableメソッドのすべてを一度に駆使する、独立したチャレンジです。
チャレンジ
中級入力として1行の文を読み込みます。それを分析して、以下の3行を出力してください。
- ユニークな単語の数(大文字小文字を区別せず、句読点を除去したもの)。繰り返される単語は1つとして数えます。
- 2回以上出現する単語(重複単語)をアルファベット順に並べ、
,で繋いだもの。該当するものがない場合は、(none)と出力してください。 - 回文(前から読んでも後ろから読んでも同じ単語、長さ2以上)をアルファベット順に並べ、
,で繋いだもの。該当するものがない場合は、(none)と出力してください。
処理を行う前に、各単語から .,!?:;"() の文字を取り除いてください。比較の際はすべて小文字に変換してください。
入力が Madam saw a racecar. Dad said hello hello to mom. の場合、出力は以下のようになります:
9
hello
dad, madam, mom, racecarチートシート
Hash.new(0) を使用して単語の出現頻度をカウントし、Enumerable メソッドを使用してフィルタリングとソートを行います:
words = line.gsub(/[.,!?:;"()]/, '').downcase.split
freq = Hash.new(0)
words.each { |w| freq[w] += 1 }
unique = freq.keys
repeated = freq.select { |_, v| v > 1 }.keys.sort
palindromes = unique.select { |w| w.length >= 2 && w == w.reverse }.sortコレクションが空の場合に (none) を出力します:
puts repeated.empty? ? "(none)" : repeated.join(", ")自分で試してみよう
input = gets.chomp
# TODO: 分割、句読点の除去、小文字化を行い、以下を出力する:
# ユニークな単語数、繰り返される単語、回文(長さ2以上)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。