Skip to content

Instantly share code, notes, and snippets.

@chovanecm
Created February 20, 2024 08:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chovanecm/770ec9c64c93784c7ddc7b25f38718ae to your computer and use it in GitHub Desktop.
Save chovanecm/770ec9c64c93784c7ddc7b25f38718ae to your computer and use it in GitHub Desktop.
PID Fare
#
# Testovací cesty jsou nadefinované od řádku 18.
# Úplně dole je pak výstup výpočtu
#
from fare import Trip
from fare.calculator.fare_calculator import calculate_best_fare
from fare.fare_rules.pid.tickets import tickets
start_time="10:00";
def t(time):
hours, minutes = time.split(":")
return int(hours) * 60 + int(minutes)
def t2(minutes):
return f"{minutes // 60:02}:{minutes % 60:02}"
def test_calculate_best_fare():
trips = (
# Vyrazím tramvají v čase "0" (počátek), v 5. minutě dorazím na Nádraží Libeň
Trip(t("10:00"), t("10:05"), "P", "Palmovka - Nádraží Libeň"),
# v 11. minutě nastoupím do vlaku a mířím do Úval, projíždím různá pásma
Trip(t("10:11"), t("10:16"), "0", "Praha-Libeň - Praha-Běchovice (úsek v pásmu 0)"),
Trip(t("10:16"), t("10:21"), "B", "Praha-Běchovice Gr. - Praha-Klánovice Gr. (úsek v pásmu B)"),
Trip(t("10:21"), t("10:25"), "1", "Praha-Klánovice Gr. - Úvaly (úsek v pásmu 1)"),
# V Úvalech chvíli pobudu, pak se vracím do Klánovic
Trip(t("11:40"), t("11:48"), "1", "Úvaly - Praha-Klánovice Gr."),
# Na úsek Klánovice - Úvaly je nutné mít jízdenku na pásmo 1 i pásmo B, takže do technického deníku cest zanesu obojí
Trip(t("11:48"), t("11:48"), "B", "Praha-Klánovice Gr. - Praha-Klánovice (technický virtuální úsek pro vynucení pásma B)"),
# po cca 10 hodinách pokračuji do Běchovic
Trip(t("21:35"), t("21:38"), "B", "Praha-Klánovice - Praha-Běchovice Gr."),
Trip(t("21:38"), t("21:38"), "0", "Praha-Běchovice Gr. - Praha-Běchovice (technický virtuální úsek pro vynucení pásma 0)")
)
trips2, used_tickets, price = calculate_best_fare(trips, tickets)
assert price == 90
# debug only
tickets_and_trips = zip(used_tickets, trips2)
for ticket, trip_part in tickets_and_trips:
print(f"Jízdenka: {ticket['name']}, Cena: {ticket['price']}, Pokrývá:")
for trip in trip_part:
print(f" {t2(trip.start)} - {t2(trip.end)} {trip.desc}, Pásmo: {trip.zone}")
print()
print(f"Celková cena: {price}")
test_calculate_best_fare()
#
# Výsledek:
#
# Jízdenka: 6 pásem 2 hod, Cena: 60, Pokrývá:
# 10:00 - 10:05 Palmovka - Nádraží Libeň, Pásmo: P
# 10:11 - 10:16 Praha-Libeň - Praha-Běchovice (úsek v pásmu 0), Pásmo: 0
# 10:16 - 10:21 Praha-Běchovice Gr. - Praha-Klánovice Gr. (úsek v pásmu B), Pásmo: B
# 10:21 - 10:25 Praha-Klánovice Gr. - Úvaly (úsek v pásmu 1), Pásmo: 1
# 11:40 - 11:48 Úvaly - Praha-Klánovice Gr., Pásmo: 1
# 11:48 - 11:48 Praha-Klánovice Gr. - Praha-Klánovice (technický virtuální úsek pro vynucení pásma B), Pásmo: B
#
# Jízdenka: Praha 30 min, Cena: 30, Pokrývá:
# 21:35 - 21:38 Praha-Klánovice - Praha-Běchovice Gr., Pásmo: B
# 21:38 - 21:38 Praha-Běchovice Gr. - Praha-Běchovice (technický virtuální úsek pro vynucení pásma 0), Pásmo: 0
#
# Celková cena: 90
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment