2004 - Ore

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerinţa

Se consideră două evenimente a căror durată este exprimată fiecare prin câte trei numere naturale: ore (h), minute (m) şi secunde (s).Să se scrie în fișierul de ieșire:

  • a) pe primele două linii, duratele în formatul h: m: s
  • b) pe următoarele două linii, duratele exprimate în secunde, corespunzătoare fiecăruieveniment, pe rânduri separate;
  • c) pe următoarea linie suma obţinută din adunarea duratelor celor două evenimente, exprimată în ore, minute, secunde, în formatul h: m: s.

Date de intrare

Fișierul de intrare orein.txt conține două linii pe care sunt scrise câte trei numere naturale, separate prin câte un spaţiu, reprezentând duratele a două evenimente exprimate în: ore (h), minute (m) şi secunde (s).

Date de ieşire

Fișierul de ieșire oreout.txt va conține pe primele două linii răspuncul de la cerința a), apoi pe liniile 3 și 4 răspunsul la cerința b), iar pe a 5-a linie răspunsul la cerința c).

Restricții și precizări

  • 1 ⩽ h ⩽ 24
  • 0 ⩽ m ⩽ 60
  • 0 ⩽ s ⩽ 60

Exemplul 1

orein.txt
3 35 55
2 40 8
oreout.txt
Datele de intrare corespund restrictiilor impuse
3: 35: 55
2: 40: 8
12955
9608
6: 16: 3


Exemplul 2

orein.txt
9 55 70
12 1 99
oreout.txt
Datele de intrare nu corespund restrictiilor impuse


Explicaţii

În fișierul de intrare sunt detaliile referitoare la duratele cele două evenimente, iar suma lor este 6: 16: 3.

Rezolvare

# 2004  Ore
def validare(event1_validare, event2_validare):
    for event in [event1_validare, event2_validare]:  # Parcurgem lista de evenimente
        h, m, s = event
        # Verificăm dacă orele sunt în intervalul 1-24
        if h < 1 or h > 24:
            raise ValueError
        # Verificăm dacă minutele sunt în intervalul 0-60
        if m < 0 or m > 60:
            raise ValueError
        # Verificăm dacă secundele sunt în intervalul 0-60
        if s < 0 or s > 60:
            raise ValueError
    file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def calculeaza_durata(event1, event2):
    # Calculăm durata în secunde pentru fiecare eveniment
    sec1 = event1[0] * 3600 + event1[1] * 60 + event1[2]
    sec2 = event2[0] * 3600 + event2[1] * 60 + event2[2]
    # Calculăm suma duratelor
    total_sec = sec1 + sec2
    # Convertim suma duratelor înapoi în ore, minute și secunde
    total_o, total_sec = divmod(total_sec, 3600)
    total_m, total_s = divmod(total_sec, 60)
    return sec1, sec2, total_o, total_m, total_s


if __name__ == '__main__':
    file_in = open("orein.txt", "r")
    file_out = open("oreout.txt", "w")

    try:
        # Citim datele pentru fiecare eveniment
        event1_main = list(map(int, file_in.readline().split()))
        event2_main = list(map(int, file_in.readline().split()))
        # Validăm datele de intrare
        validare(event1_main, event2_main)
        # Calculăm durata în secunde și suma duratelor
        sec1_main, sec2_main, total_o_main, total_m_main, total_s_main = calculeaza_durata(event1_main, event2_main)
        # Scriem rezultatele în fișierul de ieșire
        file_out.write(f'{event1_main[0]}: {event1_main[1]}: {event1_main[2]}\n')
        file_out.write(f'{event2_main[0]}: {event2_main[1]}: {event2_main[2]}\n')
        file_out.write(f'{sec1_main}\n{sec2_main}\n')
        file_out.write(f'{total_o_main}: {total_m_main}: {total_s_main}\n')

    # Dacă datele de intrare nu sunt valide, afișăm un mesaj de eroare
    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    # Dacă datele de intrare sunt incomplete, afișăm un mesaj de eroare
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")