Как считать персонажа - PullRequest
0 голосов
/ 26 октября 2018

Мне нужно посчитать количество персиков и баклажанов в строке и сказать, что появляется больше. Я попробовал это:

def counting(eggplant_peaches)
  eggplants_counting = 0
  peaches_counting = 0
  (0..eggplant_peaches.length).each do |i|
    if eggplant_peaches[i] == ?
      eggplants_counting = eggplants_counting + 1
    elsif eggplant_peaches[i] == ?
      peaches_counting = peaches_counting + 1
    end
  end
  if eggplants_counting > peaches_counting
    puts “More ?”
  elsif peaches_counting > eggplants_counting
    puts “More ?”
  end
end

Я получаю сообщение об ошибке:

undefined local variable or method '?' for main:Object

Как мне посчитать и сделать мой код более маленьким [sic]?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

немного более быстрый подход (подсчет частоты):

array.each.with_object(Hash.new(0)) do |i, res|
  res[i] += 1
end.max_by(&:last).first

хотя вы также можете сделать это достаточно быстро, используя: max_by in Marcin Kołodziej решение:

array.group_by(&:itself)
     .max_by { |k, v| v.size }
     .first
0 голосов
/ 26 октября 2018

Ваши баклажаны и персики должны быть заключены в кавычки, чтобы быть правильными строками,

if eggplant_peaches[i] == "?"

Теперь, когда вы спросили, как сделать код короче, вы можете сделать это:

def counting(array)
  winner = array.group_by(&:itself).sort_by {|k,v| v.size }.last.first
  # The steps here are:
  # %w[? ? ?].group_by(&:itself)
  #  => {"?"=>["?"], "?"=>["?", "?"]}
  # .sort_by { |k,v| v.size}
  #  => [["?", ["?"]], ["?", ["?", "?"]]]
  # .last
  #  => ["?", ["?", "?"]]
  # .first
  #  => "?"
  puts "More #{winner}"
end

counting(%w[? ? ?])
 => More ?

В качестве бонуса вышеуказанный код также работает для бананов:

counting(%w[? ? ? ? ? ?])
 => More ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...