Menu
Coddy logo textTech

Análise de Palavras

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 54 de 56.

Um desafio independente que utiliza strings, hashes, Hash.new(0) e métodos Enumerable tudo de uma vez.

challenge icon

Desafio

Médio

Leia uma única linha de entrada, uma frase. Analise-a e imprima três linhas:

  1. O número de palavras únicas (insensível a maiúsculas e minúsculas, com pontuação removida). Palavras repetidas contam apenas uma vez cada.
  2. As palavras repetidas (aquelas que aparecem mais de uma vez), ordenadas alfabeticamente, unidas por , . Se não houver nenhuma, imprima (none).
  3. As palavras palíndromas, palavras que são lidas da mesma forma de frente para trás e de trás para frente, com comprimento ≥ 2, ordenadas alfabeticamente, unidas por , . Se não houver nenhuma, imprima (none).

Remova os caracteres .,!?:;"() de cada palavra antes do processamento. Converta tudo para minúsculas para comparação.

Para a entrada Madam saw a racecar. Dad said hello hello to mom., a saída é:

9
hello
dad, madam, mom, racecar

Folha de consulta

Use Hash.new(0) para contar as frequências das palavras e, em seguida, use os métodos do Enumerable para filtrar e ordenar:

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

Imprima (none) quando uma coleção estiver vazia:

puts repeated.empty? ? "(none)" : repeated.join(", ")

Experimente você mesmo

input = gets.chomp

# TODO: dividir, remover pontuação, converter para minúsculas e imprimir:
#   contagem única, palavras repetidas, palíndromos (comprimento >= 2)
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo