You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
9.9 KiB
170 lines
9.9 KiB
#! /usr/bin/env ruby |
|
|
|
require 'json' |
|
|
|
$datestr = ARGV[0] || $stdin.gets.strip |
|
|
|
# @param [String] station_name |
|
def normalize_station station_name |
|
station_name |
|
.downcase |
|
.gsub(/\s/, ' ') |
|
.gsub('ă', 'a') |
|
.gsub('â', 'a') |
|
.gsub('î', 'i') |
|
.gsub('ș', 's') |
|
.gsub('ț', 't') |
|
end |
|
|
|
def get_station station_name |
|
# Try getting from file |
|
begin |
|
JSON.parse(File.read(File.join($datestr, 'stations', "#{normalize_station(station_name)}.json")), symbolize_names: true) |
|
rescue |
|
nil |
|
end |
|
end |
|
|
|
# @param [String] train_number |
|
def get_train train_number |
|
# Try getting from file |
|
begin |
|
JSON.parse(File.read(File.join($datestr, 'trains', "#{train_number}.json")), symbolize_names: true) |
|
rescue |
|
nil |
|
end |
|
end |
|
|
|
visited_stations = Dir.entries(File.join $datestr, 'stations') |
|
.filter { |entry| entry != '.' and entry != '..' } |
|
.map { |name| if name.end_with? ".json" then name[0...-5] else name end } |
|
.map { |name| get_station(name)[:stationName] } |
|
visited_trains = Dir.entries(File.join $datestr, 'trains') |
|
.filter { |entry| entry != '.' and entry != '..' } |
|
.map { |name| if name.end_with? ".json" then name[0...-5] else name end } |
|
|
|
trains = visited_trains.map { |train_number| get_train train_number } |
|
r_trains = trains.filter { |train| train[:rank] == 'R' } |
|
re_trains = trains.filter { |train| train[:rank] == 'R-E' } |
|
ir_trains = trains.filter { |train| train[:rank] == 'IR' } |
|
irn_trains = trains.filter { |train| train[:rank] == 'IRN' } |
|
ic_trains = trains.filter { |train| train[:rank] == 'IC' } |
|
|
|
def filter_by_arrival_delay trains |
|
trains.filter do |train| |
|
arrival_station = train[:groups][0][:stations][-1] |
|
arrival = arrival_station[:arrival] |
|
if arrival[:status] and arrival[:status][:real] |
|
yield arrival[:status][:delay] |
|
else |
|
false |
|
end |
|
end |
|
end |
|
|
|
def get_early_arrival trains |
|
filter_by_arrival_delay(trains) { |delay| delay < 0 } |
|
end |
|
|
|
def get_on_time_arrival trains |
|
filter_by_arrival_delay(trains) { |delay| delay == 0 } |
|
end |
|
|
|
def get_late_arrival trains |
|
filter_by_arrival_delay(trains) { |delay| delay > 0 } |
|
end |
|
|
|
def get_late_gt5_arrival trains |
|
filter_by_arrival_delay(trains) { |delay| delay > 5 } |
|
end |
|
|
|
on_time_departure = trains.filter do |train| |
|
departure_station = train[:groups][0][:stations][0] |
|
departure = departure_station[:departure] |
|
departure[:status] and departure[:status][:real] and departure[:status][:delay] == 0 |
|
end |
|
late_departure = trains.filter do |train| |
|
departure_station = train[:groups][0][:stations][0] |
|
departure = departure_station[:departure] |
|
departure[:status] and departure[:status][:real] and departure[:status][:delay] > 0 |
|
end |
|
|
|
early_arrival = get_early_arrival trains |
|
on_time_arrival = get_on_time_arrival trains |
|
late_arrival = get_late_arrival trains |
|
late_arrival_gt5 = get_late_gt5_arrival trains |
|
late_gt5_arrival = late_arrival_gt5 |
|
|
|
gained_delay = [] |
|
recovered_delay = [] |
|
|
|
early_on_route = [] |
|
|
|
ongoing = trains.filter do |train| |
|
arrival_station = train[:groups][0][:stations][-1] |
|
arrival_station[:arrival][:status] and not arrival_station[:arrival][:status][:real] |
|
end |
|
|
|
arrival_delays = {} |
|
trains.each do |train| |
|
arrival_station = train[:groups][0][:stations][-1] |
|
arrival = arrival_station[:arrival] |
|
if arrival[:status] and arrival[:status][:real] |
|
delay = arrival[:status][:delay] |
|
arr = arrival_delays.fetch(delay, []) |
|
arr << train |
|
arrival_delays[delay] = arr |
|
end |
|
end |
|
|
|
puts "#{on_time_departure.count} trains departed on time" |
|
puts "#{late_departure.count} trains departed late" |
|
puts |
|
printf "%d trains arrived early\n", early_arrival.count |
|
# printf " %4d (%3d%%) R, %4d (%3d%%) R-E, %4d (%3d%%) IR, %4d (%3d%%) IRN, %4d (%3d%%) IC\n", get_early_arrival(r_trains).count, (get_early_arrival(r_trains).count * 100 / early_arrival.count), get_early_arrival(re_trains).count, (get_early_arrival(re_trains).count * 100 / early_arrival.count), get_early_arrival(ir_trains).count, (get_early_arrival(ir_trains).count * 100 / early_arrival.count), get_early_arrival(irn_trains).count, (get_early_arrival(irn_trains).count * 100 / early_arrival.count), get_early_arrival(ic_trains).count, (get_early_arrival(ic_trains).count * 100 / early_arrival.count) |
|
printf "%d trains arrived on time\n", on_time_arrival.count |
|
# printf " %4d (%3d%%) R, %4d (%3d%%) R-E, %4d (%3d%%) IR, %4d (%3d%%) IRN, %4d (%3d%%) IC\n", get_on_time_arrival(r_trains).count, (get_on_time_arrival(r_trains).count * 100 / on_time_arrival.count), get_on_time_arrival(re_trains).count, (get_on_time_arrival(re_trains).count * 100 / on_time_arrival.count), get_on_time_arrival(ir_trains).count, (get_on_time_arrival(ir_trains).count * 100 / on_time_arrival.count), get_on_time_arrival(irn_trains).count, (get_on_time_arrival(irn_trains).count * 100 / on_time_arrival.count), get_on_time_arrival(ic_trains).count, (get_on_time_arrival(ic_trains).count * 100 / on_time_arrival.count) |
|
printf "%d trains arrived late\n", late_arrival.count |
|
# printf " %4d (%3d%%) R, %4d (%3d%%) R-E, %4d (%3d%%) IR, %4d (%3d%%) IRN, %4d (%3d%%) IC\n", get_late_arrival(r_trains).count, (get_late_arrival(r_trains).count * 100 / late_arrival.count), get_late_arrival(re_trains).count, (get_late_arrival(re_trains).count * 100 / late_arrival.count), get_late_arrival(ir_trains).count, (get_late_arrival(ir_trains).count * 100 / late_arrival.count), get_late_arrival(irn_trains).count, (get_late_arrival(irn_trains).count * 100 / late_arrival.count), get_late_arrival(ic_trains).count, (get_late_arrival(ic_trains).count * 100 / late_arrival.count) |
|
printf "%d trains arrived with a delay greater than 5 minutes\n", late_arrival_gt5.count |
|
# printf " %4d (%3d%%) R, %4d (%3d%%) R-E, %4d (%3d%%) IR, %4d (%3d%%) IRN, %4d (%3d%%) IC\n", get_late_gt5_arrival(r_trains).count, (get_late_gt5_arrival(r_trains).count * 100 / late_gt5_arrival.count), get_late_gt5_arrival(re_trains).count, (get_late_gt5_arrival(re_trains).count * 100 / late_gt5_arrival.count), get_late_gt5_arrival(ir_trains).count, (get_late_gt5_arrival(ir_trains).count * 100 / late_gt5_arrival.count), get_late_gt5_arrival(irn_trains).count, (get_late_gt5_arrival(irn_trains).count * 100 / late_gt5_arrival.count), get_late_gt5_arrival(ic_trains).count, (get_late_gt5_arrival(ic_trains).count * 100 / late_gt5_arrival.count) |
|
puts |
|
puts "Arrivals at destination by rank:" |
|
printf " R: %4d (%3d%%) early, %4d (%3d%%) on time, %4d (%3d%%) late [%4d (%3d%%) >5min late], %4d total\n", get_early_arrival( r_trains).count, (get_early_arrival( r_trains).count * 100 / r_trains.count), get_on_time_arrival( r_trains).count, (get_on_time_arrival( r_trains).count * 100 / r_trains.count), get_late_arrival( r_trains).count, (get_late_arrival( r_trains).count * 100 / r_trains.count), get_late_gt5_arrival( r_trains).count, (get_late_gt5_arrival( r_trains).count * 100 / r_trains.count), r_trains.count |
|
printf "R-E: %4d (%3d%%) early, %4d (%3d%%) on time, %4d (%3d%%) late [%4d (%3d%%) >5min late], %4d total\n", get_early_arrival( re_trains).count, (get_early_arrival( re_trains).count * 100 / re_trains.count), get_on_time_arrival( re_trains).count, (get_on_time_arrival( re_trains).count * 100 / re_trains.count), get_late_arrival( re_trains).count, (get_late_arrival( re_trains).count * 100 / re_trains.count), get_late_gt5_arrival( re_trains).count, (get_late_gt5_arrival( re_trains).count * 100 / re_trains.count), re_trains.count |
|
printf " IR: %4d (%3d%%) early, %4d (%3d%%) on time, %4d (%3d%%) late [%4d (%3d%%) >5min late], %4d total\n", get_early_arrival( ir_trains).count, (get_early_arrival( ir_trains).count * 100 / ir_trains.count), get_on_time_arrival( ir_trains).count, (get_on_time_arrival( ir_trains).count * 100 / ir_trains.count), get_late_arrival( ir_trains).count, (get_late_arrival( ir_trains).count * 100 / ir_trains.count), get_late_gt5_arrival( ir_trains).count, (get_late_gt5_arrival( ir_trains).count * 100 / ir_trains.count), ir_trains.count |
|
printf "IRN: %4d (%3d%%) early, %4d (%3d%%) on time, %4d (%3d%%) late [%4d (%3d%%) >5min late], %4d total\n", get_early_arrival(irn_trains).count, (get_early_arrival(irn_trains).count * 100 / irn_trains.count), get_on_time_arrival(irn_trains).count, (get_on_time_arrival(irn_trains).count * 100 / irn_trains.count), get_late_arrival(irn_trains).count, (get_late_arrival(irn_trains).count * 100 / irn_trains.count), get_late_gt5_arrival(irn_trains).count, (get_late_gt5_arrival(irn_trains).count * 100 / irn_trains.count), irn_trains.count |
|
printf " IC: %4d (%3d%%) early, %4d (%3d%%) on time, %4d (%3d%%) late [%4d (%3d%%) >5min late], %4d total\n", get_early_arrival( ic_trains).count, (get_early_arrival( ic_trains).count * 100 / ic_trains.count), get_on_time_arrival( ic_trains).count, (get_on_time_arrival( ic_trains).count * 100 / ic_trains.count), get_late_arrival( ic_trains).count, (get_late_arrival( ic_trains).count * 100 / ic_trains.count), get_late_gt5_arrival( ic_trains).count, (get_late_gt5_arrival( ic_trains).count * 100 / ic_trains.count), ic_trains.count |
|
puts |
|
puts "Delays at arrival:" |
|
arrival_delays.to_a.sort {|a, b| b[1].count <=> a[1].count}.each do |delay, trains| |
|
printf "%3d min: %4d train%s", delay, trains.count, if trains.count == 1 then " " else "s" end |
|
if trains.count <= 5 |
|
printf " (%s)", trains.map { |train| |
|
sprintf "%3s %5s", train[:rank], train[:number] |
|
}.join(", ") |
|
end |
|
puts |
|
end |
|
puts |
|
puts "#{ongoing.count} trains still travelling" |
|
|
|
puts |
|
puts "#{on_time_departure.count} trenuri plecate la timp" |
|
puts "#{late_departure.count} trenuri plecate cu întârziere" |
|
puts |
|
puts "#{early_arrival.count} trenuri sosite mai devreme" |
|
puts "#{on_time_arrival.count} trenuri sosite la timp" |
|
puts "#{late_arrival.count} trenuri sosite cu întârziere" |
|
puts "#{late_arrival_gt5.count} trenuri sosite cu întârziere mai mare de 5 minute" |
|
puts |
|
puts "Întârzieri la destinație:" |
|
arrival_delays.to_a.sort {|a, b| b[1].count <=> a[1].count}.each do |delay, trains| |
|
printf "%3d min: %4d tren%s", delay, trains.count, if trains.count == 1 then " " else "uri" end |
|
if trains.count <= 5 |
|
printf " (%s)", trains.map { |train| |
|
sprintf "%3s %5s", train[:rank], train[:number] |
|
}.join(", ") |
|
end |
|
puts |
|
# end
|
|
|