Как посчитать персонажа

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

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]?

Вам не хватает цитат: eggplant_peaches[i] == '🍆' или eggplant_peaches[i] == "🍆". И вы захотите использовать правильные кавычки в вызовах puts: puts 'More 🍆' или puts "More 🍆".

mu is too short 26.10.2018 06:20
3
1
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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 🍌

Я люблю свои бананы 😍😍😍😍

Guerrito El Pasina 26.10.2018 06:39

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

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

хотя вы также можете сделать это достаточно быстро, используя: max_by в решении Марцин Колодзей:

array.group_by(&:itself)
     .max_by { |k, v| v.size }
     .first

Использование max_by определенно лучше, чем сортировка, но во втором примере это не сработает, это должен быть max_by { |k,v| v.size }.

Marcin Kołodziej 26.10.2018 15:27

Другие вопросы по теме