Как решить пример программы Ruby Wizardry «Пребывание в петле»? - PullRequest
0 голосов
/ 18 декабря 2018

Книга 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

Затем она создает несколько дополнительных проблем:

"Что делать, если пассажир идет другим путем?в поезде (например, из Малого Абочного в Восточный Бампспарк)? Как вы можете обновить свою программу для работы в обоих направлениях? Еще сложнее, что, если маршрут поезда большой круг (имеется в виду, если пассажир идет из Восточного Бампспарка в МалAbochny, следующая остановка после Mal Abochny должна снова стать East Bumpspark)? Как вы можете обновить свою программу, чтобы распечатать правильный список остановок поездов, если пассажир хочет объехать весь круг? "

У кого-нибудь есть идеи, как действовать здесь?Я начинающий программист, поэтому любая помощь будет принята с благодарностью.Вот мой прогресс до сих пор.Я подумал, что получу 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

1 Ответ

0 голосов
/ 15 апреля 2019

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

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...