2016-12-06 4 views
0

Ruby beginner здесь. Последнее последнее:Зачем нужен этот код: ArgumentError сравнение массива с массивом не удалось

Мой друг Джон и я являемся членами «Fat to Fit Club (FFC)». Джон беспокоится, потому что каждый месяц публикуется список с весами членов, и каждый месяц он является последним в списке, что означает, что он самый тяжелый. Я тот, кто устанавливает список, поэтому я сказал ему: «Больше не беспокойтесь, я изменю порядок списка». Было принято решение приписать «вес» цифрам. Вес числа будет теперь от суммы его цифр. Например, у 99 будет «вес» 18, 100 будет иметь «вес» 1, поэтому в списке 100 поступит до 99. Если строка с весами членов FFC в обычном порядке, вы можете дать эту строку, упорядоченную по «весам», из этих чисел?

Я попытался решить эту проблему с:

def order_weight(strng) 
    new_strng = strng.split(" ").map! {|x| x.split(//)}.map! {|x| x.reduce {|sum, input| sum.to_i + input.to_i}} 
    output = strng.split(" ").zip(new_strng) 
    output.sort_by! {|x, y| [y, x]} 
    output.reduce("") {|memo, input| memo << input[0] + " "}.chop 
end 

order_weight("2000 10003 1234000 44444444 9999 11 11 22 123") 
#=> "11 11 2000 10003 22 123 1234000 44444444 9999" 

Это, кажется, работает хорошо (если есть более простой способ, пожалуйста, дайте мне знать), но моя проблема в том, что я получаю: #<ArgumentError: comparison of Array with Array failed>

I я читал немного, и я видел, что эта проблема может быть вызвана сравнением значений nil с Enumerable # sort_by, но насколько я знаю, это не должно быть здесь (?)

Любая помощь будет Великий ly appreciated

+1

Всякий раз, когда вы сообщаете об исключении, укажите строку, на которой она была поднята. Вам также нужно показать, как выглядит 'string'. –

+0

Я предполагаю, что другая часть информации, которую я должен был включить, заключается в том, что я получаю эту ошибку только при вводе своего кода через веб-сайт, из которого возникают эти вопросы (кодовые слова). Вот изображение, чтобы показать, что я имею в виду http://imgur.com/a/aqRkP. – hellothere1

+0

Не забывайте, что в вашем распоряжении кнопка редактирования. –

ответ

0

Предположим, что весовые элементы являются следующими.

weights = { "Bubba"=>302, "Phil"=>139, "Hubert"=>280 } 

Тогда вы можете сделать следующее.

puts weights.sort_by { |k,v| v.to_s.each_char.reduce(0) { |t,s| t+s.to_i } }. 
    map { |a| a.join(" ") }. 
    join("\n") 
    # Bubba 302 
    # Hubert 280 
    # Phil 139 

Действия заключаются в следующем.

a = weights.sort_by { |k,v| v.to_s.each_char.reduce(0) { |t,s| t+s.to_i } } 
    #=> [["Bubba", 302], ["Hubert", 280], ["Phil", 139]] 
b = a.map { |a| a.join(" ") } 
    #=> ["Bubba 302", "Hubert 280", "Phil 139"] 
c = b.join("\n") 
    #=> "Bubba 302\nHubert 280\nPhil 139" 
puts c 
    # Bubba 302 
    # Hubert 280 
    # Phil 139 

При расчете a мы имеем

enum = weights.sort_by 
    #=> #<Enumerator: {"Bubba"=>302, "Phil"=>139, "Hubert"=>280}:sort_by> 

Первый элемент, порожденный enum передается к блоку и назначен блок переменных, используя параллельное назначение.

k, v = enum.next 
    #=> ["Bubba", 302] 
k #=> "Bubba" 
v #=> 302 

Расчет блока следующим образом.

d = v.to_s 
    # => "302" 
d.each_char.reduce(0) { |t,s| t+s.to_i } 
    #=> 5 

Расчеты для оставшихся двух элементов enum похожи.

 Смежные вопросы

  • Нет связанных вопросов^_^