Более элегантный способ сделать это? - PullRequest
0 голосов
/ 01 декабря 2010

Я продолжаю говорить себе, что должен быть лучший путь, но я не вижу его сейчас .. идеи?

i = 0; lose = 0; win = 0
while i < @array.size
  results = @array[i].results
  q = 0
  while q < results.size
    if results[q].to_i == 0 then
      lose += 1
    elsif results[q].to_i == 1 then
      win += 1
    else
      puts results[q]
      puts "false"
    end
    q += 1
  end
  i+=1
end
if win == lose then
  puts "true"
else
  puts "false"
end

Ответы [ 4 ]

5 голосов
/ 01 декабря 2010

Вы можете использовать array.each вместо циклов while.

Вы можете использовать array.count вместо ручной проверки каждого массива:

lose = results.count { |r| r.to_i == 0 }
win = results.count { |r| r.to_i == 1 }

# or possibly if the array can only contain wins and losses
win = results.count - lose
1 голос
/ 01 декабря 2010
f = @array.flatten
puts (f.count('0') == f.count('1'))
puts f-%w{0 1}
0 голосов
/ 03 декабря 2010

Разделение массива на две части в соответствии с некоторым тестом может быть выполнено с помощью Enumerable # partition :

win, lose = results.partition {|r| r.to_i == 1}.map(&:size)
0 голосов
/ 01 декабря 2010

Если у вас есть только 0 и 1 в ваших массивах, вы теоретически можете просто сложить значения всех записей .to_i, а затем проверить, является ли это значение ровно половиной от общего числа записей в ваших массивах. Трудно сказать, есть ли лучший способ сделать это, не зная больше информации. Используются ли подсчеты побед и поражений где-нибудь впоследствии? Это функция, которая возвращает сразу или это встроенная функция большего размера? Все ли ваши результаты массив одинакового размера? Ура и счастливого кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...