-
Notifications
You must be signed in to change notification settings - Fork 0
/
skyroute.py
116 lines (93 loc) · 3.72 KB
/
skyroute.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from graph_search import bfs, dfs
from vc_metro import vc_metro
from vc_landmarks import vc_landmarks
from landmark_choices import landmark_choices
landmark_string = ""
for letter, landmark in landmark_choices.items():
landmark_string += "{0} - {1}\n".format(letter, landmark)
stations_under_construction = []
def greet():
print("Hi there and welcome to SkyRoute!")
print("We'll help you find the shortest route between the following Vancouver landmarks:\n" + landmark_string)
def skyroute():
greet()
new_route()
goodbye()
def set_start_and_end(start_point, end_point):
if start_point is not None:
change_point = input("What would you like to change? You can enter 'o' for 'origin', 'd' for 'destination', or 'b' for 'both': ")
if change_point == "b":
start_point = get_start()
end_point = get_end()
elif change_point == "o":
start_point = get_start()
elif change_point == "d":
end_point = get_end()
else:
print("Oops, that isn't 'o', 'd', or 'b'...")
set_start_and_end(start_point, end_point)
else:
start_point = get_start()
end_point = get_end()
return start_point, end_point
def get_start():
start_point_letter = input("Where are you coming from? Type in the corresponding letter: ")
if start_point_letter in landmark_choices:
start_point = landmark_choices[start_point_letter]
return start_point
else:
print("Sorry, that's not a landmark we have data on. Let's try this again...")
get_start()
def get_end():
end_point_letter = input("Where are you headed? Type in the corresponding letter: ")
if end_point_letter in landmark_choices:
end_point = landmark_choices[end_point_letter]
return end_point
else:
print("Sorry, that's not a landark we have data on. Let's try this again...")
get_end()
def new_route(start_point=None, end_point=None):
start_point, end_point = set_start_and_end(start_point, end_point)
shortest_route = get_route(start_point, end_point)
if shortest_route is not None:
shortest_route_string = '\n'.join(shortest_route)
print(f"The shortest metro route from {start_point} to {end_point} is:\n{shortest_route_string}")
else:
print(f"Unfortunately, there is currently no path between {start_point} and {end_point} due to maintenance")
again = input("Would you like to see another route? Enter y/n: ")
if again == 'y':
show_landmarks()
new_route(start_point, end_point)
def get_active_stations():
updated_metro = vc_metro
for station_under_construction in stations_under_construction:
for current_station, neighboring_station in vc_metro.items():
if current_station != station_under_construction:
updated_metro[current_station] -= set(stations_under_construction)
else:
updated_metro[current_station] = set([])
return updated_metro
def show_landmarks():
see_landmarks = input("Would you like to see the list of landmarks again? Enter y/n: ")
if see_landmarks == 'y':
print(landmark_string)
def goodbye():
print("Thanks for using SkyRoute!")
def get_route(start_point, end_point):
start_stations = vc_landmarks[start_point]
end_stations = vc_landmarks[end_point]
routes = []
for start_station in start_stations:
for end_station in end_stations:
metro_system = get_active_stations() if stations_under_construction else vc_metro
if len(stations_under_construction) > 0:
possible_route = dfs(metro_system, start_station, end_station)
if possible_route is None:
return None
route = bfs(metro_system, start_station, end_station)
if route is not None:
routes.append(route)
shortest_route = min(routes, key=len)
return shortest_route
active_stations = get_active_stations()
skyroute()