Как решить пример программы Ruby Wizardry "Оставаться в курсе"?

Книга 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 18.12.2018 20:30

Спасибо @Max! Надеюсь, мое новое описание будет более полезным. Ваше здоровье

andrew johnston 18.12.2018 20:48
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как я решил эту задачу. Это работает, но довольно долго. Более продвинутые рубиновые кодеры могут предложить более короткое решение:

    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

Другие вопросы по теме