Menu
Coddy logo textTech

単語分析

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 54/56。

文字列、ハッシュ、Hash.new(0)、そしてEnumerableメソッドのすべてを一度に駆使する、独立したチャレンジです。

challenge icon

チャレンジ

中級

入力として1行の文を読み込みます。それを分析して、以下の3行を出力してください。

  1. ユニークな単語の数(大文字小文字を区別せず、句読点を除去したもの)。繰り返される単語は1つとして数えます。
  2. 2回以上出現する単語(重複単語)をアルファベット順に並べ、, で繋いだもの。該当するものがない場合は、(none)と出力してください。
  3. 回文(前から読んでも後ろから読んでも同じ単語、長さ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以上)
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン