Книга Ruby Wizardry Chapter 4 включает следующий пример программы
we_wanna_ride = true
stops = ["East Bumpspark", "Endertromb Avenue", "New Mixico", "Mal Abochny"]
while we_wanna_ride
print "Where ya headin', friend?"
destination = gets.chomp
if stops.include? destination
puts "I know how to get to #{destination}! Here's the station list:"
stops.each do |stop|
puts stop
break if stop == destination
end
else
puts "Sorry, we don't stop at that station. Maybe another time!"
we_wanna_ride = false
end
end
Затем возникает несколько дополнительных проблем:
«Что, если пассажир едет в поезде в другую сторону (например, из Малого Абочного в Восточный Бампспарк)? Как вы могли бы обновить свою программу, чтобы она работала в обоих направлениях? Еще сложнее, что если маршрут поезда представляет собой большой круг ( Это означает, что если пассажир едет от East Bumppark до Mal Abochny, следующей остановкой после Mal Abochny снова должен стать East Bumppark)? Как вы могли бы обновить свою программу, чтобы распечатать правильный список остановок поезда, если пассажир хочет обойти весь путь круг?"
Есть ли у кого-нибудь идеи, как здесь действовать? Я начинающий программист, поэтому будем благодарны за любую помощь. Вот мой прогресс на данный момент. Я решил, что получу от пользователя departure
, а затем использую to.i для ввода целого числа. Затем я мог бы использовать целочисленное значение для сравнения с позицией индекса в массиве. Если всадник хочет ехать в противоположном направлении, я мог бы использовать что-то вроде stop.each.reverse, чтобы распечатать элементы массива в обратном порядке.
we_wanna_ride = true
stops = ["East Bumpspark(1)", "Endertromb Avenue(2)", "New Mixico(3)", "Mal Abochny(4)"]
puts "#{stops}"
while we_wanna_ride
print "Select a destination number"
destination = gets.chomp.to_i
print "Select a departure number"
departure = gets.chomp.to_i
if departure <= destination
stops.each do |stop|
puts stop
break if stop == destination
end
else puts "Sorry"
we_wanna_ride = false
end
end
Спасибо @Max! Надеюсь, мое новое описание будет более полезным. Ваше здоровье
Вот как я решил эту задачу. Это работает, но довольно долго. Более продвинутые рубиновые кодеры могут предложить более короткое решение:
we_wanna_ride = true
stops = ["East Bumpspark", "Endertromb Avenue", "New Mixico", "Mal Abochny"]
while we_wanna_ride
print "Where do you wish to depart from?: "
depart = gets.chomp.split.map(&:capitalize).join(' ')
depart_index = stops.index(depart)
# puts depart_index
print "Where ya headin' friend?: "
destination = gets.chomp.split.map(&:capitalize).join(' ')
destination_index = stops.index(destination)
# puts destination_index
index_diff1 = depart_index - destination_index
index_diff2 = destination_index - depart_index
if stops.include? destination && depart
puts "\nI know how to get to #{destination}! Here's the station list:"
if destination_index > depart_index && index_diff2 < 3
stops[depart_index..-1].each do |stop|
puts stop
break if stop == destination
end
we_wanna_ride = false
elsif destination_index > depart_index && index_diff2 >= 3
dubstops = stops.concat(stops)
dubstops[0..depart_index+4].reverse_each do |stop|
puts stop
break if stop == destination
end
we_wanna_ride = false
elsif destination_index < depart_index && index_diff1 < 3
stops[0..depart_index].reverse_each do |stop|
puts stop
break if stop == destination
end
we_wanna_ride = false
elsif destination_index < depart_index && index_diff1 >= 3
dubstops = stops.concat(stops)
dubstops[depart_index..-1].each do |stop|
puts stop
break if stop == destination
end
we_wanna_ride = false
end
else
puts "Sorry, we don't service that station. Maybe another time!"
we_wanna_ride = false
end
end
Обычно легче получить ответ, если вы опубликуете сделанную попытку, а не полностью открытую проблему. Попробуйте и отредактируйте свой вопрос, включив в него вашу попытку, ожидаемые результаты и то, что произошло вместо этого.