Обновление
Самое простое решение, которое я могу придумать, это:
mapping.select.with_index {|_,i| response[i] == "Y"}
#=>["C", "D", "E"]
Это будет select
всех элементов в mapping
, где соответствующий индекс в response
равен "Y"
TL; DR Другие опции включают в себя:
mapping.values_at(*response.each_with_index.select {|v,_| v == "Y"}.map(&:last))
mapping.zip(response).map {|k,v| k if v == "Y"}.compact
Первый использует каждый с индексом, который будет
[["N",0],["N",1],["Y",2],["Y",3],["Y",4]]
Затем мы выбираем группы, в которых первый элемент равен "Y", и сопоставляем индексы для передачи на values_at
Во второй версии создается сопоставление и ответ, создавая вместе.
[["A", "N"], ["B", "N"], ["C", "Y"], ["D", "Y"], ["E", "Y"]]
Тогда сопоставьте первый элемент только тогда, когда второй элемент "Y". Compact удаляет значения nil
из сопоставления.
Существует множество других способов выполнить эту задачу, если вы посмотрите модуль Enumerable