Analyse de mots
Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 54 sur 56.
Un défi autonome qui fait appel aux chaînes de caractères, aux hachages, à Hash.new(0) et aux méthodes Enumerable, le tout en même temps.
Défi
MoyenLisez une seule ligne d'entrée, une phrase. Analysez-la et affichez trois lignes :
- Le nombre de mots uniques (insensible à la casse, avec la ponctuation supprimée). Les mots répétés ne comptent qu'une seule fois.
- Les mots répétés (ceux apparaissant plus d'une fois), triés par ordre alphabétique, joints par
,. Si aucun, affichez(none). - Les mots palindromes, des mots qui se lisent de la même manière à l'endroit et à l'envers, de longueur ≥ 2, triés par ordre alphabétique, joints par
,. Si aucun, affichez(none).
Supprimez les caractères .,!?:;"() de chaque mot avant le traitement. Mettez tout en minuscules pour la comparaison.
Pour l'entrée Madam saw a racecar. Dad said hello hello to mom., la sortie est :
9
hello
dad, madam, mom, racecarAide-mémoire
Utilisez Hash.new(0) pour compter les fréquences de mots, puis utilisez les méthodes Enumerable pour filtrer et trier :
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 }.sortAffichez (none) lorsqu'une collection est vide :
puts repeated.empty? ? "(none)" : repeated.join(", ")Essayez vous-même
input = gets.chomp
# TODO: diviser, supprimer la ponctuation, mettre en minuscules, puis afficher :
# le nombre de mots uniques, les mots répétés, les palindromes (longueur >= 2)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline