Любой способ оптимизировать этот счетчик символов, который я написал в ruby для класса String - PullRequest
2 голосов
/ 06 января 2020
# Character Counter
class String
  def count_lcases
    count(('a'..'z').to_a.join(''))
  end

  def count_upcases
    count(('A'..'Z').to_a.join(''))
  end

  def count_num
    count((0..9).to_a.join(''))
  end

  def count_spl_chars
    length - count_lcases - count_upcases - count_num
  end
end

input = ARGV[0]

if ARGV.empty?
  puts 'Please provide an input'
  exit
end

puts 'Lowercase characters = %d' % [input.count_lcases]
puts 'Uppercase characters = %d' % [input.count_upcases]
puts 'Numeric characters = %d' % [input.count_num]
puts 'Special characters = %d' % [input.count_spl_chars]

Я использовал диапазоны для подсчета символов, но функция count вызывается 3 раза.

Я всегда могу использовать циклы и считать их один за другим. Мне было интересно, есть ли способ оптимизировать это ?. ..

Ответы [ 2 ]

3 голосов
/ 06 января 2020

Если вы используете Ruby 2.7, вы можете использовать tally ; символы строки просто повторяются один раз.

def classify_char(c)
  case c
    when /[a-z]/ then :lcase 
    when /[A-Z]/ then :ucase
    when /\d/    then :digit
    else :other
  end
end

p "asg3456  ERTYaeth".chars.map{|c| classify_char(c) }.tally
# => {:lcase=>7, :digit=>4, :other=>2, :ucase=>4}
0 голосов
/ 07 января 2020

Если Ruby 2,3 ... 2,7, это будет работать:

CHAR_CLASSES = {
  lcase: ?a..?z,
  ucase: ?A..?Z,
  digit: ?0..?9,
}

p "asg3456  ERTYaeth".each_char.with_object(Hash.new(0)) { |c, o|
  o[CHAR_CLASSES.find { |label, group| group === c }&.first || :other] += 1
}

Для <2,3, </p>

p "asg3456  ERTYaeth".each_char.with_object(Hash.new(0)) { |c, o|
  p = CHAR_CLASSES.find { |label, group| group === c }
  o[p ? p.first : :other] += 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...