Análisis de palabras
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 54 de 56.
Un desafío independiente que pone a prueba el uso de cadenas de texto, hashes, Hash.new(0) y métodos de Enumerable, todo a la vez.
Desafío
IntermedioLee una sola línea de entrada, una oración. Analízala e imprime tres líneas:
- El número de palabras únicas (insensible a mayúsculas y minúsculas, eliminando los signos de puntuación). Las palabras repetidas cuentan una sola vez.
- Las palabras repetidas (aquellas que aparecen más de una vez), ordenadas alfabéticamente, unidas con
,. Si no hay ninguna, imprime(none). - Las palabras palíndromas, palabras que se leen igual de adelante hacia atrás y de atrás hacia adelante, con una longitud ≥ 2, ordenadas alfabéticamente, unidas con
,. Si no hay ninguna, imprime(none).
Elimina los caracteres .,!?:;"() de cada palabra antes de procesarla. Convierte todo a minúsculas para la comparación.
Para la entrada Madam saw a racecar. Dad said hello hello to mom., la salida es:
9
hello
dad, madam, mom, racecarHoja de referencia
Usa Hash.new(0) para contar las frecuencias de las palabras, luego utiliza los métodos de Enumerable para filtrar y 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 }.sortImprime (none) cuando una colección esté vacía:
puts repeated.empty? ? "(none)" : repeated.join(", ")Pruébalo tú mismo
input = gets.chomp
# TODO: dividir, eliminar puntuación, convertir a minúsculas, luego imprimir:
# conteo único, palabras repetidas, palíndromos (longitud >= 2)
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline