1
votes

Existe-t-il une manière différente d'écrire le code ci-dessous en initialisant la clé de hachage avec une valeur par défaut?

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.


3 commentaires

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? ".


4 Réponses :


2
votes

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


2 commentaires

"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.



0
votes

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 }


0 commentaires

1
votes

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 


2 commentaires

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.



0
votes
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} 

0 commentaires