2484 - Key: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==Enunț== Cristi are în sertar n chei vechi; fiecare a costat o anumită sumă exprimată în lei și fiecare a fost făcută pentru a deschide aceeași ușă. Atât cheile cât și ușa au un cod format din 3 litere. Din păcate, unele chei s-au deteriorat și Cristi le-a împărțit în patru categorii: :1. '''stricate''' – nicio o literă din codul cheii nu coincide cu litera de pe aceeași poziție din codul ușii, iar pentru a o repara trebuie sa plătească prețul...
 
mNo edit summary
 
(2 intermediate revisions by the same user not shown)
Line 51: Line 51:
;key.out
;key.out
:25
:25
==Exemplu3==
;key.in
:3 ABC 4
:ABC 15
:AXC 9
:AFG 3
:UYC 30
;key.out
:Numar invalid: Valoarea lui P trebuie să fie '1' sau '2'.


==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line="1">
#2484 key
#2484 key
with open('key.in', 'r') as f:
with open('key.in', 'r') as f:
Line 66: Line 77:
total_cost = 0
total_cost = 0


for key_code, price in keys:
def validate_input(p, door_code, n, keys):
     num_matches = sum(key_code[i] == door_code[i] for i in range(3))
     if p not in ['1', '2']:
     if num_matches == 0:
        return False, "Valoarea lui P trebuie să fie '1' sau '2'."
         stricate += 1
 
         total_cost += price
    if not door_code.isalpha() or len(door_code) != 3:
    elif num_matches == 1:
        return False, "Codul ușii trebuie să conțină exact 3 litere."
         deteriorate += 1
 
         total_cost += price * 2 / 3
     if not (1 <= n <= 1000):
    elif num_matches == 2:
         return False, "Numărul de chei (n) trebuie să fie între 1 și 1000."
         slab_deteriorate += 1
 
         total_cost += price / 3
    if len(keys) != n:
    else:
         return False, "Numărul de chei specificat nu corespunde cu numărul real de chei."
         bune += 1
 
    for key_code, price in keys:
        if not key_code.isalpha() or len(key_code) != 3 or not key_code.isupper():
            return False, "Codul cheii trebuie să conțină exact 3 litere majuscule."
          
         try:
            price = int(price)
            if not (1 <= price <= 10000):
                return False, "Prețul cheii trebuie să fie între 1 și 10000."
         except ValueError:
            return False, "Prețul cheii trebuie să fie un număr întreg."
 
    return True, None
 
def main():
    with open('key.in', 'r') as f, open('key.out', 'w', encoding='utf-8') as output_file:
         try:
            p, door_code, n = f.readline().split()
            n = int(n)
            keys = [f.readline().split() for _ in range(n)]
        except ValueError:
            output_file.write("Date de intrare invalide.")
            return
 
        is_valid, error_message = validate_input(p, door_code, n, keys)
 
         if not is_valid:
            output_file.write("Numar invalid: " + error_message)
            return


with open('key.out', 'w') as f:
        keys = [(key_code, int(price)) for key_code, price in keys]
    if p == '1':
 
        f.write(f"{stricate} {deteriorate} {slab_deteriorate} {bune}")
        stricate = deteriorate = slab_deteriorate = bune = 0
    else:
        total_cost = 0
        if bune == n or total_cost == 0:
 
            f.write("GRATIS")
        for key_code, price in keys:
            num_matches = sum(key_code[i] == door_code[i] for i in range(3))
            if num_matches == 0:
                stricate += 1
                total_cost += price
            elif num_matches == 1:
                deteriorate += 1
                total_cost += price * 2 / 3
            elif num_matches == 2:
                slab_deteriorate += 1
                total_cost += price / 3
            else:
                bune += 1
 
        if p == '1':
            output_file.write(f"{stricate} {deteriorate} {slab_deteriorate} {bune}")
         else:
         else:
             f.write(str(int(total_cost)))
             if bune == n or total_cost == 0:
                output_file.write("GRATIS")
            else:
                output_file.write(str(int(total_cost)))
 
if __name__ == "__main__":
    main()
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 18:39, 9 February 2024

Enunț[edit | edit source]

Cristi are în sertar n chei vechi; fiecare a costat o anumită sumă exprimată în lei și fiecare a fost făcută pentru a deschide aceeași ușă. Atât cheile cât și ușa au un cod format din 3 litere. Din păcate, unele chei s-au deteriorat și Cristi le-a împărțit în patru categorii:

1. stricate – nicio o literă din codul cheii nu coincide cu litera de pe aceeași poziție din codul ușii, iar pentru a o repara trebuie sa plătească prețul integral al cheii;
2. deteriorate – exact o litera din codul cheii coincide cu litera de pe aceeași poziție din codul ușii, iar pentru a o repara trebuie sa plătească două treimi din prețul cheii;
3. slab deteriorate – exact două litere din codul cheii coincid cu literele de pe aceleași poziții din codul ușii, iar pentru a o repara trebuie sa platească o treime din prețul cheii;
4. bune – codul cheii e identic cu codul ușii, iar cheia nu trebuie reparată;

Cerințe[edit | edit source]

1) Să se afle câte chei din fiecare categorie are Cristi.
2) Sa se afle cât a plătit Cristi pentru a repara toate cheile.

Date de intrare[edit | edit source]

Fișierul de intrare key.in conține pe prima linie un număr P, codul ușii COD și numarul n; dacă P=1 se rezolvă doar cerința 1, iar dacă P=2 se rezolva doar cerința 2. Pe următoarele n linii se citește codul cheii și prețul acesteia.

Date de ieșire[edit | edit source]

Dacă P=1 se afișează numărul de chei stricate, numărul de chei deteriorate, numărul de chei slab deteriorate și numărul de chei bune separate printr-un spațiu, în aceasta ordine.

Dacă P=2 se afișează doar un număr COST care exprima costul total pentru repararea cheilor.

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

  • 1 ≤ n ≤ 100
  • P=1 sau P=2
  • orice cod e format din 3 litere
  • orice preț este divizibil cu 3 și aparține intervalului deschis [0,999];
  • la cerința 2, dacă toate cheile sunt bune sau costul total este 0 se afișează doar mesajul GRATIS
  • pentru rezolvarea corectă a cerinței 1 se acordă 30 de puncte, iar pentru rezolvarea corectă a cerinței 2 se acordă 70 de puncte

Exemplu1[edit | edit source]

key.in
1 ABC 4
ABC 15
AXC 9
AFG 3
UYC 30
key.out
0 2 1 1

Explicație[edit | edit source]

Cristi nu are cheii stricate, dar are două cheii deteriorate, una slab deteriorata și una buna

Exemplu2[edit | edit source]

key.in
2 ABC 4
ABC 15
AXC 9
AFG 3
UYC 30
key.out
25

Exemplu3[edit | edit source]

key.in
3 ABC 4
ABC 15
AXC 9
AFG 3
UYC 30
key.out
Numar invalid: Valoarea lui P trebuie să fie '1' sau '2'.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 2484 key

with open('key.in', 'r') as f:

   p, door_code, n = f.readline().split()
   n = int(n)
   keys = []
   for i in range(n):
       key_code, price = f.readline().split()
       keys.append((key_code, int(price)))

stricate = deteriorate = slab_deteriorate = bune = 0 total_cost = 0

def validate_input(p, door_code, n, keys):

   if p not in ['1', '2']:
       return False, "Valoarea lui P trebuie să fie '1' sau '2'."
   if not door_code.isalpha() or len(door_code) != 3:
       return False, "Codul ușii trebuie să conțină exact 3 litere."
   if not (1 <= n <= 1000):
       return False, "Numărul de chei (n) trebuie să fie între 1 și 1000."
   if len(keys) != n:
       return False, "Numărul de chei specificat nu corespunde cu numărul real de chei."
   for key_code, price in keys:
       if not key_code.isalpha() or len(key_code) != 3 or not key_code.isupper():
           return False, "Codul cheii trebuie să conțină exact 3 litere majuscule."
       
       try:
           price = int(price)
           if not (1 <= price <= 10000):
               return False, "Prețul cheii trebuie să fie între 1 și 10000."
       except ValueError:
           return False, "Prețul cheii trebuie să fie un număr întreg."
   return True, None

def main():

   with open('key.in', 'r') as f, open('key.out', 'w', encoding='utf-8') as output_file:
       try:
           p, door_code, n = f.readline().split()
           n = int(n)
           keys = [f.readline().split() for _ in range(n)]
       except ValueError:
           output_file.write("Date de intrare invalide.")
           return
       is_valid, error_message = validate_input(p, door_code, n, keys)
       if not is_valid:
           output_file.write("Numar invalid: " + error_message)
           return
       keys = [(key_code, int(price)) for key_code, price in keys]
       stricate = deteriorate = slab_deteriorate = bune = 0
       total_cost = 0
       for key_code, price in keys:
           num_matches = sum(key_code[i] == door_code[i] for i in range(3))
           if num_matches == 0:
               stricate += 1
               total_cost += price
           elif num_matches == 1:
               deteriorate += 1
               total_cost += price * 2 / 3
           elif num_matches == 2:
               slab_deteriorate += 1
               total_cost += price / 3
           else:
               bune += 1
       if p == '1':
           output_file.write(f"{stricate} {deteriorate} {slab_deteriorate} {bune}")
       else:
           if bune == n or total_cost == 0:
               output_file.write("GRATIS")
           else:
               output_file.write(str(int(total_cost)))

if __name__ == "__main__":

   main()

</syntaxhighlight>