Рубиновый хеш и пользовательский ввод

Привет, я только начинаю знакомиться с рубином, и мне нужна помощь с этой задачей. Задача состоит в том, чтобы ввести 7 дней недели в такой хэш {"Понедельник" => 1, "Вторник" => 2 ..etc} И когда пользователь вводит число от 1 до 7, он показывает соответствующий день . Итак, если пользователь нажимает 5 , он выводит «Пятница». До сих пор я придумал это:

   puts "Enter Number"
    hash = {"Monday"=>1,"Tuesday"=>2,"Wednesday"=>3,"Thursday"=>4,"Friday"=>5,"Saturday"=>6,"Sunday"=>7}
    hash.each do |x,y|
    input = gets.to_i
    print x if input == y
end

person daxtera    schedule 19.11.2017    source источник


Ответы (3)


Вы на правильном пути, просто вам нужно получить ввод от пользователя, если значения для каждого ключа являются целыми числами, тогда вы можете рассмотреть возможность использования chomp и to_i, после этого вы можете использовать найти, чтобы проверить ключи в hash, где значение равно числу, выбранному пользователем:

puts 'Enter Number'
number = gets.chomp.to_i
hash = {'Monday'=>1,'Tuesday'=>2,'Wednesday'=>3,'Thursday'=>4,'Friday'=>5,'Saturday'=>6,'Sunday'=>7}
p hash.find { |_, v| v == number }.first

Используя find, вы получаете первый элемент, который соответствует выражению внутри блока как true.

person Sebastian Palma    schedule 19.11.2017

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

puts "Enter Number"
hash = {"Monday" => 1, "Tuesday" => 2, "Wednesday" => 3, "Thursday" => 4, "Friday" => 5, "Saturday" => 6, "Sunday" => 7}
input = gets.to_i
hash.each do |x,y|
  puts x if input == y
end

Это будет принимать ввод один раз, а затем повторяться. Что сделало ваше решение, так это запросить ввод один раз для каждого дня недели.

person Silvio Mayolo    schedule 19.11.2017
comment
Чтобы добавить к этому, более грубым способом было бы перевернуть ключи и значения хеша так, чтобы это было hash = {1 => "Monday"...}, а затем просто распечатать значение hash[input]. - person Philip Hallstrom; 19.11.2017

Если начальный хеш должен быть обязательно днями в качестве ключей, вы всегда можете инвертировать его, чтобы ключи и значения поменялись местами друг с другом:

puts 'Enter Number'
number = gets.chomp.to_i
hash = {'Monday'=>1,'Tuesday'=>2,'Wednesday'=>3,'Thursday'=>4,'Friday'=>5,'Saturday'=>6,'Sunday'=>7}
p hash.invert[number]

Но было бы разумнее использовать ключ по id.

person user3574603    schedule 19.11.2017