Ecrivez une méthode qui renvoie le no des divers minuscules, majuscules, chiffres et caractères spéciaux utilisés dans la chaîne. Utilisez les plages.
Input = "heLLo Every1"
J'utilise les plages et la méthode de cas dans la solution fournie.
Solution:
class String
def character_count
uppercase_count = 0
lowercase_count = 0
digit_count = 0
uppercase_range = Range.new('A', 'Z')
lowercase_range = Range.new('a', 'z')
digit_range = Range.new('0', '9')
special_character_count = 0
each_char do |item|
case item
when uppercase_range
uppercase_count += 1
when lowercase_range
lowercase_count += 1
when digit_range
digit_count += 1
else
special_character_count += 1
end
end
[lowercase_count, uppercase_count, digit_count, special_character_count]
end
end
if ARGV.empty?
puts 'Please provide an input'
else
string = ARGV[0]
count_array = string.character_count
puts "Lowercase characters = #{count_array[0]}"
puts "Uppercase characters = #{count_array[1]}"
puts "Numeric characters = #{count_array[2]}"
puts "Special characters = #{count_array[3]}"
end
Le code fonctionne.
4 Réponses :
Oui
class String
def character_count
counters = Hash.new(0)
each_char do |item|
case item
when 'A'..'Z'
counters[:uppercase] += 1
when 'a'..'z'
counters[:lowercase] += 1
when '0'..'9'
counters[:digit] += 1
else
counters[:special] += 1
end
end
counters.values_at(:uppercase, :lowercase, :digit, :special)
end
end
if ARGV.empty?
puts 'Please provide an input'
else
string = ARGV[0]
uppercase, lowercase, digit, special = string.character_count
puts "Lowercase characters = #{lowercase}"
puts "Uppercase characters = #{uppercase}"
puts "Numeric characters = #{digit}"
puts "Special characters = #{special}"
end
"Oui"? Considérez les compteurs [; élément de cas lorsque 'A' .. 'Z' alors: majuscule; quand 'a' .. 'z' alors: minuscule .... fin] + = 1 .
Vous pouvez en outre éviter la duplication + = en renvoyant uniquement le nom de la clé de case et en appelant les compteurs [key] + = 1 par la suite. Et je retournerais probablement le hachage entier au lieu des nombres nus, bien que ce soit un changement radical dans le code de l'OP.
Autre option.
Commencez par mapper vos plages dans un hachage:
input = "heLLo Every1"
input.chars.each { |e| res[(mapping.find { |k, v| v.to_a.include? e } || [:specials]).first ] += 1 }
res
#=> {:upper=>3, :lower=>7, :digits=>1, :specials=>1}
Ensuite, initialisez le hachage du destinataire sur le 0 par défaut:
res = Hash.new(0)
Enfin, mappez les caractères de l'entrée:
mapping = { upper: ('A'..'Z'), lower: ('a'..'z'), digits: ('0'..'9'), specials: nil }
Vous pouvez à la place utiliser regex de la meilleure manière suivante,
type = { special: /[^0-9A-Za-z]/, numeric: /[0-9]/, uppercase: /[A-Z]/, lowercase: /[a-z]/ }
'Hello World'.scan(type[:special]).count
# => 1
'Hello World'.scan(type[:numeric]).count
# => 0
'Hello World'.scan(type[:uppercase]).count
# => 2
'Hello World'.scan(type[:lowercase]).count
# => 8
Pas de regex: 'Hello World'.count ("^ 0-9a-zA-Z") etc.
L'analyse de la chaîne entière plusieurs fois peut devenir lente lors du traitement de chaînes plus volumineuses ou de la présence de nombreuses classes de caractères.
str.each_char.with_object(Hash.new(0)) do |c,h|
h[ case c
when /\d/ then :digit
when /\p{Lu}/ then :uppercase
when /\p{Ll}/ then :downcase
else :special
end
] += 1
end
end
#=> {:uppercase=>8, :downcase=>28, :special=>10, :digit=>3}
Sortie attendue: caractères minuscules = 7 caractères majuscules = 3 caractères numériques = 1 caractères spéciaux = 1
Veuillez modifier pour énoncer votre question. Si vous souhaitez améliorer le code de travail, vous devez être à Code Review , et non à stackoverflow.
Veuillez lire " Comment poser des questions sur les devoirs et y répondre? ".