2569 - Alo: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: De ziua ei, Dora a primit cadou un telefon mobil cu cartelă pentru rețeaua favorită. Suma disponibilă pe cartelă este de '''E''' Eurici dar oferta este grozavă pentru convorbiri. Astfel, pentru fiecare minut de convorbire în care a fost sunată dintr-o altă rețea decât rețeaua ei, cartela se încarcă cu '''1''' Euric dar, dacă sună ea într-o altă rețea, Dora va consuma câte '''2''' Eurici din creditul de pe cartela ei pentru fiecare minut de convorbire. Înt...
 
No edit summary
 
Line 5: Line 5:
Scrieți un program care, știind '''E''', valoarea inițială a creditului de pe cartela primită cadou, cele '''N''' numere corespunzătoare convorbirilor pe care le-a avut Dora și duratele acestora exprimate în minute, să determine valoarea creditului rămas pe cartelă la terminarea convorbirilor.
Scrieți un program care, știind '''E''', valoarea inițială a creditului de pe cartela primită cadou, cele '''N''' numere corespunzătoare convorbirilor pe care le-a avut Dora și duratele acestora exprimate în minute, să determine valoarea creditului rămas pe cartelă la terminarea convorbirilor.
== Date de intrare ==
== Date de intrare ==
Din prima linie a fișierului text alo.in se citesc '''E''', valoarea creditului inițial de pe cartelă și '''N''' numărul de convorbiri. Din următoarele '''N''' linii se citesc perechi de forma '''Nr D''' unde '''Nr''' – numărul corespunzător convorbirii și '''D''' – durata acesteia.
Din prima linie a fișierului text '''aloin.txt''' se citesc '''E''', valoarea creditului inițial de pe cartelă și '''N''' numărul de convorbiri. Din următoarele '''N''' linii se citesc perechi de forma '''Nr D''' unde '''Nr''' – numărul corespunzător convorbirii și '''D''' – durata acesteia.
== Date de ieşire ==
== Date de ieşire ==
În fișierul text '''alo.out''' se va scrie pe prima linie '''S'''-numărul de Eurici care sunt disponibili pe cartela Dorei după cele '''N''' convorbiri.
În fișierul text '''aloout.txt''' se va scrie pe prima linie '''S'''-numărul de Eurici care sunt disponibili pe cartela Dorei după cele '''N''' convorbiri.
== Restricții și precizări ==
== Restricții și precizări ==
* 5 ⩽ E ⩽ 100
* '''5 ⩽ E ⩽ 100'''
* 2 ⩽ N ⩽ 500
* '''2 ⩽ N ⩽ 500'''
* 1 ⩽ D ⩽ 50
* '''1 ⩽ D ⩽ 50'''
* Convorbirile în care sună Dora se încadrează în limita creditului de pe cartelă de la momentul respectiv.
* Convorbirile în care sună Dora se încadrează în limita creditului de pe cartelă de la momentul respectiv.
== Exemplu ==
== Exemplul 1 ==
; alo.in
; aloin.txt
: 10 5
: 10 5
: 12345 4
: 12345 4
Line 21: Line 21:
: 18375 10
: 18375 10
: 22359 20
: 22359 20
; aloout.txt
: Datele de intrare corespund restrictiilor impuse.
: 12
<br>
== Exemplul 2 ==
; aloin.txt
: 4 5
: 12 2
: z 15
: 785 12
: 18 a
: 22 1
; aloout.txt
: Datele de intrare nu corespund restrictiilor impuse.
<br>
<br>
; alo.out
: 12
== Explicație ==
== Explicație ==
* '''12345 4''' – Dora sună la numărul '''2345''' care nu face parte din rețeaua ei și vorbește '''4''' minute. De pe cartelă se consumă '''4*2=8''' Eurici
* '''12345 4''' – Dora sună la numărul '''2345''' care nu face parte din rețeaua ei și vorbește '''4''' minute. De pe cartelă se consumă '''4*2=8''' Eurici
Line 34: Line 46:
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def calculeaza_credit(nr, durata, credit):
# 2569  Alo
     if str(nr)[0] == '1': # Verificăm dacă Dora sună (numărul începe cu 1)
def validare(e_validare, n_validare, convorbiri_validare):
        if str(nr)[-1] == '5': # Verificăm dacă sună în altă rețea (numărul se termină cu 5)
     if e_validare < 5 or e_validare > 100:    # Verificăm dacă e este în intervalul 5-100
            credit -= durata * 2 # Dacă sună în altă rețea, se consumă 2 Eurici pe minut
        raise ValueError  # Ridicăm o eroare dacă e nu este în intervalul 5-100
    elif str(nr)[0] == '2': # Verificăm dacă Dora este sunată (numărul începe cu 2)
    if n_validare < 2 or n_validare > 500:    # Verificăm dacă n este în intervalul 2-500
        if str(nr)[-1] == '5': # Verificăm dacă este sunată din altă rețea (numărul se termină cu 5)
        raise ValueError  # Ridicăm o eroare dacă n nu este în intervalul 2-500
             credit += durata # Dacă este sunată din altă rețea, cartela se încarcă cu 1 Euric pe minut
    for Nr, d in convorbiri_validare:    # Parcurgem lista de convorbiri
     # Returnăm creditul rămas pe cartelă
        if d < 1 or d > 50:    # Verificăm dacă durata convorbirii este în intervalul 1-50
     return credit
            raise ValueError  # Ridicăm o eroare dacă durata convorbirii nu este în intervalul 1-50
    file_out.write("Datele de intrare corespund restrictiilor impuse.\n")
 
 
# Funcția calculeaza_credit calculează creditul rămas pe cartelă după fiecare convorbire
def calculeaza_credit(nr_credit, durata_credit, credit_calc):
    # Verificăm dacă Dora sună (numărul începe cu 1)
    if str(nr_credit)[0] == '1':
        # Verificăm dacă sună în altă rețea (numărul se termină cu 5)
        if str(nr_credit)[-1] == '5':
            # Dacă sună în altă rețea, se consumă 2 Eurici pe minut
            credit_calc -= durata_credit * 2
    # Verificăm dacă Dora este sunată (numărul începe cu 2)
    elif str(nr_credit)[0] == '2':
        # Verificăm dacă este sunată din altă rețea (numărul se termină cu 5)
        if str(nr_credit)[-1] == '5':
             # Dacă este sunată din altă rețea, cartela se încarcă cu 1 Euric pe minut
            credit_calc += durata_credit
     return credit_calc    # Returnăm creditul rămas pe cartelă
 
 
if __name__ == '__main__':
     file_in = open('aloin.txt', 'r')
    file_out = open('aloout.txt', 'w')


# Deschidem fișierul de intrare pentru a citi datele
    try:
with open('alo.in', 'r') as intrare:
        # Citim valoarea inițială a creditului și numărul de convorbiri
    # Citim valoarea inițială a creditului și numărul de convorbiri
        E_main, N_main = map(int, file_in.readline().split())
    E, N = map(int, intrare.readline().split())
        # Citim numerele și duratele convorbirilor
    convorbiri = [list(map(int, linie.split())) for linie in intrare] # Citim numerele și duratele convorbirilor
        convorbiri_main = [list(map(int, linie.split())) for linie in file_in]
        validare(E_main, N_main, convorbiri_main)    # Validăm datele de intrare
        credit = E_main    # Inițializăm creditul cu valoarea inițială
        for nr, durata in convorbiri_main:    # Parcurgem fiecare convorbire
            # Calculăm creditul rămas pe cartelă după fiecare convorbire
            credit = calculeaza_credit(nr, durata, credit)
        # Scriem creditul rămas pe cartelă în fișierul de ieșire
        file_out.write(str(credit))


credit = E # Inițializăm creditul cu valoarea inițială
    except ValueError:    # Tratăm excepțiile
for nr, durata in convorbiri: # Parcurgem fiecare convorbire
        file_out.write("Datele de intrare nu corespund restrictiilor impuse.")
    credit = calculeaza_credit(nr, durata, credit) # Calculăm creditul rămas pe cartelă după fiecare convorbire
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse.")


# Deschidem fișierul de ieșire pentru a scrie rezultatul
with open('alo.out', 'w') as iesire:
    iesire.write(str(credit))


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 15:40, 12 November 2023

De ziua ei, Dora a primit cadou un telefon mobil cu cartelă pentru rețeaua favorită. Suma disponibilă pe cartelă este de E Eurici dar oferta este grozavă pentru convorbiri. Astfel, pentru fiecare minut de convorbire în care a fost sunată dintr-o altă rețea decât rețeaua ei, cartela se încarcă cu 1 Euric dar, dacă sună ea într-o altă rețea, Dora va consuma câte 2 Eurici din creditul de pe cartela ei pentru fiecare minut de convorbire. Între membrii rețelei Dorei, toate convorbirile sunt gratuite indiferent de durata convorbirii, fie că sună ea, fie că este sunată.

Toate numerele din rețeaua Dorei au patru cifre și se termină cu cifra 9 iar numerele din alte rețele au tot patru cifre și se termină cu cifra 5. Când sună Dora, ea formează întâi cifra 1 înaintea numărului pe care îl apelează. Când este sunată, apare cifra 2 înaintea numărului de la care primește apelul.

Cerinţa[edit | edit source]

Scrieți un program care, știind E, valoarea inițială a creditului de pe cartela primită cadou, cele N numere corespunzătoare convorbirilor pe care le-a avut Dora și duratele acestora exprimate în minute, să determine valoarea creditului rămas pe cartelă la terminarea convorbirilor.

Date de intrare[edit | edit source]

Din prima linie a fișierului text aloin.txt se citesc E, valoarea creditului inițial de pe cartelă și N numărul de convorbiri. Din următoarele N linii se citesc perechi de forma Nr D unde Nr – numărul corespunzător convorbirii și D – durata acesteia.

Date de ieşire[edit | edit source]

În fișierul text aloout.txt se va scrie pe prima linie S-numărul de Eurici care sunt disponibili pe cartela Dorei după cele N convorbiri.

Restricții și precizări[edit | edit source]

  • 5 ⩽ E ⩽ 100
  • 2 ⩽ N ⩽ 500
  • 1 ⩽ D ⩽ 50
  • Convorbirile în care sună Dora se încadrează în limita creditului de pe cartelă de la momentul respectiv.

Exemplul 1[edit | edit source]

aloin.txt
10 5
12345 4
12439 15
21335 30
18375 10
22359 20
aloout.txt
Datele de intrare corespund restrictiilor impuse.
12


Exemplul 2[edit | edit source]

aloin.txt
4 5
12 2
z 15
785 12
18 a
22 1
aloout.txt
Datele de intrare nu corespund restrictiilor impuse.


Explicație[edit | edit source]

  • 12345 4 – Dora sună la numărul 2345 care nu face parte din rețeaua ei și vorbește 4 minute. De pe cartelă se consumă 4*2=8 Eurici
  • 12439 15 – Dora sună la numărul 2439 din rețeaua ei și vorbește 15 minute gratis
  • 21335 30 – Dora este sunată de la numărul 1335 care nu este din rețeaua ei și vorbește 30 minute: Cartelase încarcă cu 30*1=30 Eurici
  • 18375 10 – Dora sună la numărul 8375 care nu face parte din rețeaua ei și vorbește 10 minute. De pe cartelă se consumă 10*2=20 Eurici
  • 22359 20 – Dora este sunată de la 2359 din rețeaua ei și vorbește 20 minute gratis.

Suma rămasă: 10-8+30-20=12 Eurici

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 2569 Alo

def validare(e_validare, n_validare, convorbiri_validare):

   if e_validare < 5 or e_validare > 100:    # Verificăm dacă e este în intervalul 5-100
       raise ValueError  # Ridicăm o eroare dacă e nu este în intervalul 5-100
   if n_validare < 2 or n_validare > 500:    # Verificăm dacă n este în intervalul 2-500
       raise ValueError  # Ridicăm o eroare dacă n nu este în intervalul 2-500
   for Nr, d in convorbiri_validare:    # Parcurgem lista de convorbiri
       if d < 1 or d > 50:    # Verificăm dacă durata convorbirii este în intervalul 1-50
           raise ValueError  # Ridicăm o eroare dacă durata convorbirii nu este în intervalul 1-50
   file_out.write("Datele de intrare corespund restrictiilor impuse.\n")


  1. Funcția calculeaza_credit calculează creditul rămas pe cartelă după fiecare convorbire

def calculeaza_credit(nr_credit, durata_credit, credit_calc):

   # Verificăm dacă Dora sună (numărul începe cu 1)
   if str(nr_credit)[0] == '1':
       # Verificăm dacă sună în altă rețea (numărul se termină cu 5)
       if str(nr_credit)[-1] == '5':
           # Dacă sună în altă rețea, se consumă 2 Eurici pe minut
           credit_calc -= durata_credit * 2
   # Verificăm dacă Dora este sunată (numărul începe cu 2)
   elif str(nr_credit)[0] == '2':
       # Verificăm dacă este sunată din altă rețea (numărul se termină cu 5)
       if str(nr_credit)[-1] == '5':
           # Dacă este sunată din altă rețea, cartela se încarcă cu 1 Euric pe minut
           credit_calc += durata_credit
   return credit_calc    # Returnăm creditul rămas pe cartelă


if __name__ == '__main__':

   file_in = open('aloin.txt', 'r')
   file_out = open('aloout.txt', 'w')
   try:
       # Citim valoarea inițială a creditului și numărul de convorbiri
       E_main, N_main = map(int, file_in.readline().split())
       # Citim numerele și duratele convorbirilor
       convorbiri_main = [list(map(int, linie.split())) for linie in file_in]
       validare(E_main, N_main, convorbiri_main)    # Validăm datele de intrare
       credit = E_main    # Inițializăm creditul cu valoarea inițială
       for nr, durata in convorbiri_main:    # Parcurgem fiecare convorbire
           # Calculăm creditul rămas pe cartelă după fiecare convorbire
           credit = calculeaza_credit(nr, durata, credit)
       # Scriem creditul rămas pe cartelă în fișierul de ieșire
       file_out.write(str(credit))
   except ValueError:    # Tratăm excepțiile
       file_out.write("Datele de intrare nu corespund restrictiilor impuse.")
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse.")


</syntaxhighlight>