2484 - Key
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 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
- 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
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
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
- 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
- key.in
- 1 ABC 4
- ABC 15
- AXC 9
- AFG 3
- UYC 30
- key.out
- 0 2 1 1
Explicație
Cristi nu are cheii stricate, dar are două cheii deteriorate, una slab deteriorata și una buna
Exemplu2
- key.in
- 2 ABC 4
- ABC 15
- AXC 9
- AFG 3
- UYC 30
- key.out
- 25
Rezolvare
<syntaxhighlight lang="python" line="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') 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>