forked from Ada-C10/ride-share
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfoober_rideshare.rb
182 lines (159 loc) · 5.18 KB
/
foober_rideshare.rb
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
########################################################
# Step 1: Establish the layers
# Write a list of the layers here
# - Main array
# + drivers, rides
# * date
# * cost
# * rider id
# * rating
########################################################
# Step 2: Assign a data structure to each layer
# +[main_array] - stores data by ordered index, is a collection of driver hashes and their sub data
# - {driver hash} - stores symbol :driver_id and the string of driver_id as a key value pair, and the symbol :rides as the key with as an ordered array as the value
# * [{drive data}] - the data of each individual drive is a hash of :date, :cost, :rider_id, and :rating stored in an ordered array
########################################################
# Step 3: Make the data structure!
#DRIVER_ID DATE COST RIDER_ID RATING
# DR0001 3rd Feb 2016 10 RD0003 3
# DR0001 3rd Feb 2016 30 RD0015 4
# DR0001 5th Feb 2016 45 RD0003 2
# DR0002 3rd Feb 2016 25 RD0073 5
# DR0002 4th Feb 2016 15 RD0013 1
# DR0002 5th Feb 2016 35 RD0066 3
# DR0003 4th Feb 2016 5 RD0066 5
# DR0003 5th Feb 2016 50 RD0003 2
# DR0004 3rd Feb 2016 5 RD0022 5
# DR0004 4th Feb 2016 10 RD0022 4
# DR0004 5th Feb 2016 20 RD0073 5
uber_big_data = [
{ driver: "DR0001", rides: [
{ date: "3rd Feb 2016", cost: 10, rider_id: "RD0003", rating: 3 },
{ date: "3rd Feb 2016", cost: 30, rider_id: "RD0015", rating: 4 },
{ date: "5th Feb 2016", cost: 45, rider_id: "RD0003", rating: 2 },
]
},
{ driver: "DR0002", rides: [
{ date: "3rd Feb 2016", cost: 25, rider_id: "RD0073", rating: 5 },
{ date: "4th Feb 2016", cost: 15, rider_id: "RD0013", rating: 1 },
{ date: "5th Feb 2016", cost: 35, rider_id: "RD0066", rating: 3 },
]
},
{ driver: "DR0003", rides: [
{ date: "4th Feb 2016", cost: 5, rider_id: "RD0066", rating: 5 },
{ date: "5th Feb 2016", cost: 50, rider_id: "RD0003", rating: 2 },
]
},
{ driver: "DR0004", rides: [
{ date: "3rd Feb 2016", cost: 5, rider_id: "RD0022", rating: 5 },
{ date: "4th Feb 2016", cost: 10, rider_id: "RD0022", rating: 4 },
{ date: "5th Feb 2016", cost: 20, rider_id: "RD0073", rating: 5 },
]
}
]
########################################################
# Step 4: Total Driver's Earnings and Number of Rides
#
# 1: The number of rides each driver has given
def find_number_of_rides(data)
ride_count = data.map do |driver|
"#{driver[:driver]}: #{driver[:rides].count}"
end
return ride_count
end
# 2: The total amount of money each driver has made
def total_each_earned(data)
money_made = data.map do |driver|
driver_made = 0
driver[:rides].each do |ride|
driver_made += ride[:cost]
end
"#{driver[:driver]}: #{driver_made}"
end
return money_made
end
# # 3: The average rating for each driver
def find_driver_rating_averages(data)
drivers_rating = data.map do |driver|
rating = 0.0
driver[:rides].each do |ride|
rating += ride[:rating]
end
rating /= driver[:rides].length
"#{driver[:driver]}: #{"%.2f" % rating}"
end
return drivers_rating
end
# # 4: Which driver made the most money?
def find_driver_with_most_money(data)
money_made = data.map do |driver|
driver_made = 0
driver[:rides].each do |ride|
driver_made += ride[:cost]
end
{ driver_id: driver[:driver], made: driver_made }
end
most_money_made = money_made.max { |a, b| a[:made] <=> b[:made]}
return most_money_made
end
# # 5: Which driver has the highest average rating?
def find_driver_with_highest_rating(data)
drivers_rating = data.map do |driver|
rating = 0.0
driver[:rides].each do |ride|
rating += ride[:rating]
end
rating /= driver[:rides].length
{driver_id: driver[:driver], driver_rating: "%.2f" % rating}
end
highest_driver_rating = drivers_rating.max { |a, b| a[:driver_rating] <=> b[:driver_rating]}
return highest_driver_rating
end
def determine_output(data)
input = gets.chomp.to_i
if input == 1
puts find_number_of_rides(data)
print "\n: "
elsif input == 2
puts total_each_earned(data)
print "\n: "
elsif input == 3
puts find_driver_rating_averages(data)
print "\n: "
elsif input == 4
puts find_driver_with_most_money(data)
print "\n: "
elsif input == 5
puts find_driver_with_highest_rating(data)
print "\n: "
elsif input == 6
exit
end
end
puts "***** FooBER Driver Data System *****"
puts "Enter selection to retrieve data."
puts "1. Number of Rides, per driver"
puts "2. Pay Earned, per driver"
puts "3. Driver Ratings"
puts "4. Highest Earning Driver"
puts "5. Highest Rated Driver"
puts "6. Exit"
print "(1-6): "
loop do
determine_output(uber_big_data)
end
# OPTIONAL - NOT FINISHED!
# For each driver, on which day did they make the most money?
#
# money_made = uber_big_data.map do |driver|
# driver_ride_compare = []
# count = 0
# driver[:rides].each do |ride|
# driver_ride_date = {ride[:date] => ride[:cost]}
# driver_ride_compare[count] = driver_ride_date
# count += 1
# end
# puts driver_ride_compare
# end
#
# puts money_made