1472 - Castel: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==Context== Andrei vizitează un vechi castel cu mai multe camere. El are la dispoziţie un număr '''nr_coduri''' de coduri de acces. Fiecare cod este un număr natural format din cel mult 9 cifre. Pentru a deschide uşa unei camere, Andrei trebuie să afle ce cheie să aleagă, dintr-un set dat. Fiecare cheie este notată cu o cifră. Cheia ce deschide uşa din prima cameră este notată cu cifra ce se repetă de cele mai multe ori în codurile de acces. == Cerinţa == Scri...
 
No edit summary
 
Line 4: Line 4:
Scrieţi un program care determină cheia ce va deschide prima uşă, cunoscându-se numărul '''nr_coduri''', cele '''nr_coduri''' coduri de acces, numărul de chei, notat cu '''coduri_acces''' și valorile celor '''coduri_acces''' chei primite.
Scrieţi un program care determină cheia ce va deschide prima uşă, cunoscându-se numărul '''nr_coduri''', cele '''nr_coduri''' coduri de acces, numărul de chei, notat cu '''coduri_acces''' și valorile celor '''coduri_acces''' chei primite.
== Date de intrare ==
== Date de intrare ==
Fişierul de intrare ''' castel.in''' conţine pe prima linie numărul '''nr_coduri'''. Linia a doua din fişier conţine '''nr_coduri''' numere naturale, ce reprezintă codurile de acces. Linia a treia conţine numărul natural '''coduri_acces''' ce reprezinta numărul de chei primite. Linia a patra din fişier conţine '''coduri_acces''' cifre, ce reprezintă valorile cheilor.
Fişierul de intrare ''' castelin.txt''' conţine pe prima linie numărul '''nr_coduri'''. Linia a doua din fişier conţine '''nr_coduri''' numere naturale, ce reprezintă codurile de acces. Linia a treia conţine numărul natural '''coduri_acces''' ce reprezinta numărul de chei primite. Linia a patra din fişier conţine '''coduri_acces''' cifre, ce reprezintă valorile cheilor.
== Date de ieșire ==  
== Date de ieșire ==  
Fişierul de ieşire ''' castel.out''' conţine pe prima linie două numere naturale, separate printr-un singur spaţiu. Primul număr din fişier reprezintă cheia ce va deschide uşa din prima cameră si al doilea număr reprezinta numărul de repetări al cheii în şirul codurilor de acces.
Fişierul de ieşire ''' castelout.txt''' conţine pe prima linie două numere naturale, separate printr-un singur spaţiu. Primul număr din fişier reprezintă cheia ce va deschide uşa din prima cameră si al doilea număr reprezinta numărul de repetări al cheii în şirul codurilor de acces.
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul '''"Datele de intrare nu respecta conditiile impuse.”'''
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul '''"Datele de intrare nu respecta conditiile impuse.”''' iar daca datele introduse de la tastatură îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul '''"Datele de intrare respecta conditiile impuse.”'''
 


== Restricţii şi precizări ==
== Restricţii şi precizări ==
Line 16: Line 17:
* Cheile au valori distincte şi sunt date în ordine crescătoare
* Cheile au valori distincte şi sunt date în ordine crescătoare
* O uşă poate fi deschisă de o singură cheie
* O uşă poate fi deschisă de o singură cheie
== Exemplu 1 ==
== Exemplul 1 ==
; castel.in
; castelin.txt
: 5
5
:1243 527 89722 6232 678
1243 527 89722 6232 678
:3
3
:2 5 7
2 5 7


; castel.out
; castelout.txt
: 2 6
Datele de intrare respecta conditiile impuse.
<br>
2 6
== Exemplu 2 ==
 
; castel.in
==Explicatie==
: 1001
:Dintre cele 3 chei date, cheia ce apare de cele mai multe ori, în şirul codurilor de pe linia a doua, este 2 şi apare de 6 :ori.Cheia 5 apare o dată, iar cheia 7 apare de 3 ori.
; castel.out
 
: Datele de intrare nu respecta cerintelor impuse.
== Exemplul 2 ==
; castelin.txt
1001
; castelout.txt
Datele de intrare nu respecta conditiile impuse.
<br>
<br>


Line 52: Line 57:
     # Citirea din fișierul de intrare
     # Citirea din fișierul de intrare
     try:
     try:
         with open("castel.in", "r") as file:
         with open("castelin.txt", "r") as file:
             nr_coduri = int(file.readline().strip())
             nr_coduri = int(file.readline().strip())
             coduri_acces = list(map(int, file.readline().split()))
             coduri_acces = list(map(int, file.readline().split()))
Line 59: Line 64:
         return
         return
     except ValueError:
     except ValueError:
         print("Datele de intrare nu sunt valide.")
         print("Datele de intrare nu respecta conditiile impuse.")
         return
         return


     # Verificare restricții
     # Verificare restricții
     if not (1 <= nr_coduri <= 1000):
     if not (1 <= nr_coduri <= 1000):
         print("Datele de intrare nu respecta conditiile impuse.")
         with open("castelout.txt", "w") as file_output:
            file_output.write("Datele de intrare nu respecta conditiile impuse.\n")
         return
         return


Line 71: Line 77:


     # Scrierea în fișierul de ieșire
     # Scrierea în fișierul de ieșire
     with open("castel.out", "w") as file:
     with open("castelout.txt", "w") as file_output:
         file.write(f"{cheie} {repetari}\n")
         file_output.write("Datele de intrare corespund conditiilor impuse.\n")
        file_output.write(f"{cheie} {repetari}\n")


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()
</syntaxhighlight>
</syntaxhighlight>
==Explicatie==
Dintre cele 3 chei date, cheia ce apare de cele mai multe ori, în şirul codurilor de pe linia a doua, este 2 şi apare de 6 ori.Cheia 5 apare o dată, iar cheia 7 apare de 3 ori.

Latest revision as of 19:10, 4 January 2024

Context[edit | edit source]

Andrei vizitează un vechi castel cu mai multe camere. El are la dispoziţie un număr nr_coduri de coduri de acces. Fiecare cod este un număr natural format din cel mult 9 cifre. Pentru a deschide uşa unei camere, Andrei trebuie să afle ce cheie să aleagă, dintr-un set dat. Fiecare cheie este notată cu o cifră. Cheia ce deschide uşa din prima cameră este notată cu cifra ce se repetă de cele mai multe ori în codurile de acces.

Cerinţa[edit | edit source]

Scrieţi un program care determină cheia ce va deschide prima uşă, cunoscându-se numărul nr_coduri, cele nr_coduri coduri de acces, numărul de chei, notat cu coduri_acces și valorile celor coduri_acces chei primite.

Date de intrare[edit | edit source]

Fişierul de intrare castelin.txt conţine pe prima linie numărul nr_coduri. Linia a doua din fişier conţine nr_coduri numere naturale, ce reprezintă codurile de acces. Linia a treia conţine numărul natural coduri_acces ce reprezinta numărul de chei primite. Linia a patra din fişier conţine coduri_acces cifre, ce reprezintă valorile cheilor.

Date de ieșire[edit | edit source]

Fişierul de ieşire castelout.txt conţine pe prima linie două numere naturale, separate printr-un singur spaţiu. Primul număr din fişier reprezintă cheia ce va deschide uşa din prima cameră si al doilea număr reprezinta numărul de repetări al cheii în şirul codurilor de acces. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu respecta conditiile impuse.” iar daca datele introduse de la tastatură îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare respecta conditiile impuse.”


Restricţii şi precizări[edit | edit source]

  • 1 ⩽ coduri_acces ⩽ 10
  • 1 ⩽ nr_coduri ⩽ 1000
  • Fiecare cod de acces este un număr cu cel mult 9 cifre
  • Fiecare cheie este notată cu o cifră
  • Cheile au valori distincte şi sunt date în ordine crescătoare
  • O uşă poate fi deschisă de o singură cheie

Exemplul 1[edit | edit source]

castelin.txt
5
1243 527 89722 6232 678
3
2 5 7
castelout.txt
Datele de intrare respecta conditiile impuse.
2 6

Explicatie[edit | edit source]

Dintre cele 3 chei date, cheia ce apare de cele mai multe ori, în şirul codurilor de pe linia a doua, este 2 şi apare de 6 :ori.Cheia 5 apare o dată, iar cheia 7 apare de 3 ori.

Exemplul 2[edit | edit source]

castelin.txt
1001
castelout.txt
Datele de intrare nu respecta conditiile impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def gaseste_cheie_si_repetari(nr_coduri, coduri_acces):

   frecvente_chei = {}
   # Calculează frecvența fiecărei chei în codurile de acces
   for cod in coduri_acces:
       for cifra in str(cod):
           frecvente_chei[cifra] = frecvente_chei.get(cifra, 0) + 1
   # Găsește cheia cu cea mai mare frecvență
   cheie_maxima = max(frecvente_chei, key=frecvente_chei.get)
   repetari_cheie_maxima = frecvente_chei[cheie_maxima]
   return cheie_maxima, repetari_cheie_maxima

def main():

   # Citirea din fișierul de intrare
   try:
       with open("castelin.txt", "r") as file:
           nr_coduri = int(file.readline().strip())
           coduri_acces = list(map(int, file.readline().split()))
   except FileNotFoundError:
       print("Fisierul de intrare nu exista.")
       return
   except ValueError:
       print("Datele de intrare nu respecta conditiile impuse.")
       return
   # Verificare restricții
   if not (1 <= nr_coduri <= 1000):
       with open("castelout.txt", "w") as file_output:
           file_output.write("Datele de intrare nu respecta conditiile impuse.\n")
       return
   # Calculul cheii și repetărilor
   cheie, repetari = gaseste_cheie_si_repetari(nr_coduri, coduri_acces)
   # Scrierea în fișierul de ieșire
   with open("castelout.txt", "w") as file_output:
       file_output.write("Datele de intrare corespund conditiilor impuse.\n")
       file_output.write(f"{cheie} {repetari}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>