2014-06-07 4 views
0

У меня есть массив, содержащий несколько учеников. Я хочу, чтобы они случайным образом перекрестно сортировали друг друга, т. Е. Каждый студент оценивал кого-то и оценивался кем-то другим (эти два человека могут быть или не быть одним и тем же лицом).Сопоставьте элемент массива с другим элементом в этом массиве

Вот мое близкое к рабочему решению. Одна из серьезных проблем с этим кодом заключается в том, что последнему человеку, возможно, придется оценивать себя, если все остальные были сопоставлены.

Меня очень интересует работающее и элегантное решение.

def randomize(student_array) 
    graders = student_array.dup 
    gradees = student_array.dup 
    result = {} 
    graders.each do |grader| 
    gradee = grader 
    while gradee == grader 
     gradee = gradees.sample 
    end 
    result[grader] = gradee 
    gradees.delete_at(gradees.index(gradee)) 
    end 
    return result 
end 
+0

Если ученик A будет студенткой класса B, значит ли это, что студент B обязательно будет студенткой A? –

+0

Не обязательно. Это нормально, если это произойдет. – Heisenberg

ответ

2

Если вам не нужно поднимать один из всех возможных вариантов, но возьмите случайный случай из ограниченных случаев, тогда это легко. Например, следующая нижеприведенная информация даст следующий ответ:

student_array = %i[a b c d e] 
a = student_array.shuffle 
[a, a.rotate(1)].transpose.to_h 
# => {:b => :e, :e => :d, :d => :a, :a => :c, :c => :b} 
+0

Абсолютно красиво! Я должен был подумать о том, чтобы «повернуть». – Heisenberg

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