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.
Desafio
MédioLeia uma única linha de entrada, uma frase. Analise-a e imprima três linhas:
- 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.
- As palavras repetidas (aquelas que aparecem mais de uma vez), ordenadas alfabeticamente, unidas por
,. Se não houver nenhuma, imprima(none). - 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, racecarFolha 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 }.sortImprima (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)
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
1Strings a Fundo
Visão Geral de Métodos de StringInterpolação de StringsIterando sobre StringsSplit e JoinRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA palavra-chave yieldParâmetros de BlocoProcs e LambdasRecapitulação - Iterador Customizado7Hashes Parte 2
Hash.new com Valores PadrãoIterando em HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um Intervalo?Métodos de IntervaloIntervalos em Case / WhenRecapitulação - Prática com Intervalos5O Poder do Enumerable
Select e RejectEncadeando o MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Data Pipeline