2182 - 3 Cifre: Difference between revisions
No edit summary |
No edit summary |
||
Line 22: | Line 22: | ||
== Exemplul 1 == | == Exemplul 1 == | ||
;3cifrein.txt | ;3cifrein.txt | ||
:7 1 | :7 1 | ||
:415 5213 2017 666 12345678 10000013 13 | :415 5213 2017 666 12345678 10000013 13 | ||
:Datele introduse corespund restrictiilor impuse. | :Datele introduse corespund restrictiilor impuse. | ||
;3cifreout.txt | ;3cifreout.txt | ||
Line 33: | Line 33: | ||
== Exemplul 2 == | == Exemplul 2 == | ||
;3cifreint.txt | ;3cifreint.txt | ||
:7 1 | :7 1 | ||
:25 521013 206678 666 12345678 10101013 13 | :25 521013 206678 666 12345678 10101013 13 | ||
:Datele introduse nu corespund restrictiilor impuse. | :Datele introduse nu corespund restrictiilor impuse. | ||
Line 44: | Line 44: | ||
<syntaxhighlight lang="python3" line="1"> | <syntaxhighlight lang="python3" line="1"> | ||
def | def cautare_3_cifre(lst): | ||
aparitii = {} | |||
max_aparitii = 0 | |||
max_aparitii_numere = [] | |||
for | for num in lst: | ||
str_num = str(num) | |||
for i in range(len( | for i in range(len(str_num) - 2): | ||
triplet = int(str_num[i:i+3]) | |||
if triplet not in aparitii: | |||
aparitii[triplet] = {'count': 1, 'first_index': num, 'last_index': num} | |||
else: | |||
aparitii[triplet]['count'] += 1 | |||
aparitii[triplet]['last_index'] = num | |||
if aparitii[triplet]['count'] > max_aparitii: | |||
max_aparitii = aparitii[triplet]['count'] | |||
max_aparitii_numere = [triplet] | |||
elif aparitii[triplet]['count'] == max_aparitii: | |||
max_aparitii_numere.append(triplet) | |||
return aparitii, max_aparitii, max_aparitii_numere | |||
def main(): | |||
# Citim datele de intrare din fișier | |||
with open("3cifre.in", "r") as f: | |||
n, cerinta = map(int, f.readline().split()) | |||
numere = list(map(int, f.readline().split())) | |||
if cerinta == 1: | |||
aparitii, max_aparitii, max_aparitii_numere = cautare_3_cifre(numere) | |||
# Găsim cel mai mic triplet | |||
min_triplet = min(aparitii, key=lambda x: x if aparitii[x]['count'] > 0 else float('inf')) | |||
nrmin = min_triplet | |||
nrapmin = aparitii[min_triplet]['count'] | |||
x1min = aparitii[min_triplet]['first_index'] | |||
x1max = aparitii[min_triplet]['last_index'] | |||
# Găsim cel mai mare triplet | |||
max_triplet = max(aparitii, key=lambda x: aparitii[x]['count']) | |||
nrmax = max_triplet | |||
nrapmax = aparitii[max_triplet]['count'] | |||
x2min = aparitii[max_triplet]['first_index'] | |||
x2max = aparitii[max_triplet]['last_index'] | |||
# Scriem rezultatele în fișierul de ieșire | |||
with open("3cifreout.txt", "w") as fout: | |||
fout.write(f"{nrmin} {nrapmin} {x1min} {x1max}\n") | |||
fout.write(f"{nrmax} {nrapmax} {x2min} {x2max}\n") | |||
elif cerinta == 2: | |||
aparitii, max_aparitii, max_aparitii_numere = cautare_3_cifre(numere) | |||
# Găsim numerele cu cele mai multe apariții | |||
max_aparitii_numere.sort() | |||
with open("3cifreout.txt", "w") as fout: | |||
fout.write(f"{max_aparitii}\n") | |||
fout.write(" ".join(map(str, max_aparitii_numere)) + "\n") | |||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 09:09, 27 December 2023
Enunt
Așa cum știm, lui Gigel îi place să se joace cu numerele. A scris pe caiet un număr, apoi a văzut că din acesta se pot extrage mai multe numere cu trei cifre consecutive. De exemplu, a scris pe caiet 20172017; numerele cu trei cifre consecutive care se pot extrage sunt 201, 172, 720 și 201. Gigel începe să-și pună diferite întrebări: care este cel mai mare număr cu trei cifre consecutive obținut? Dar cel mai mic? De câte ori apar ele? Unde apar? Care este cel mai mare număr de apariții a unui număr cu trei cifre?
Cerinta
Fiind numărul un număr natural n și n numere naturale x (100 ≤ x ≤ 4294967295) să se determine: 1. Cel mai mic și cel mai mare număr din trei cifre consecutive care apar în cele n numere, de câte ori apar ele, în ce număr x[1] apar prima dată și în ce număr x[2] apar ultima dată. 2. Numerele din trei cifre consecutive care apar de cele mai multe ori în cele n numere.
Date de intrare
Fișierul de intrare 3cifrein.txt conţine pe prima linie, separate printr-un spațiu, numărul natural n, reprezentând numărul de numere și cerința (1 sau 2). Pe cea de a doua linie sunt scrise cele n numere naturale x[1] x[2] ... x[n], separate prin câte un spațiu.
Date de iesire
Fișierul de ieșire 3cifreout.txt va conține, pentru cerința 1, pe prima linie patru valori naturale nrmin nrapmin x1min x1max, separate prin câte un spațiu, reprezentând numărul minim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată, iar pe linia a doua alte patru valori naturale nrmax nrapmax x2min x2max, separate prin câte un spațiu, reprezentând numărul maxim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată. Pentru cerința 2, fișierul de ieșire va conține pe prima linie numărul maxim de apariții a numerelor din trei cifre consecutive care apar, iar pe linia a doua, separate prin câte un spațiu, numerele respective în ordine crescătoare.
Restrictii si precizari
- 1 ⩽ n ⩽ 500000
- 100 ⩽ x[i] ⩽ 4294967295
Exemplul 1
- 3cifrein.txt
- 7 1
- 415 5213 2017 666 12345678 10000013 13
- Datele introduse corespund restrictiilor impuse.
- 3cifreout.txt
- 100 1 10000013 10000013
- 678 1 12345678 12345678
Exemplul 2
- 3cifreint.txt
- 7 1
- 25 521013 206678 666 12345678 10101013 13
- Datele introduse nu corespund restrictiilor impuse.
Rezolvare
<syntaxhighlight lang="python3" line="1"> def cautare_3_cifre(lst):
aparitii = {} max_aparitii = 0 max_aparitii_numere = []
for num in lst: str_num = str(num) for i in range(len(str_num) - 2): triplet = int(str_num[i:i+3])
if triplet not in aparitii: aparitii[triplet] = {'count': 1, 'first_index': num, 'last_index': num} else: aparitii[triplet]['count'] += 1 aparitii[triplet]['last_index'] = num
if aparitii[triplet]['count'] > max_aparitii: max_aparitii = aparitii[triplet]['count'] max_aparitii_numere = [triplet] elif aparitii[triplet]['count'] == max_aparitii: max_aparitii_numere.append(triplet)
return aparitii, max_aparitii, max_aparitii_numere
def main():
# Citim datele de intrare din fișier with open("3cifre.in", "r") as f: n, cerinta = map(int, f.readline().split()) numere = list(map(int, f.readline().split()))
if cerinta == 1: aparitii, max_aparitii, max_aparitii_numere = cautare_3_cifre(numere)
# Găsim cel mai mic triplet min_triplet = min(aparitii, key=lambda x: x if aparitii[x]['count'] > 0 else float('inf')) nrmin = min_triplet nrapmin = aparitii[min_triplet]['count'] x1min = aparitii[min_triplet]['first_index'] x1max = aparitii[min_triplet]['last_index']
# Găsim cel mai mare triplet max_triplet = max(aparitii, key=lambda x: aparitii[x]['count']) nrmax = max_triplet nrapmax = aparitii[max_triplet]['count'] x2min = aparitii[max_triplet]['first_index'] x2max = aparitii[max_triplet]['last_index']
# Scriem rezultatele în fișierul de ieșire with open("3cifreout.txt", "w") as fout: fout.write(f"{nrmin} {nrapmin} {x1min} {x1max}\n") fout.write(f"{nrmax} {nrapmax} {x2min} {x2max}\n")
elif cerinta == 2: aparitii, max_aparitii, max_aparitii_numere = cautare_3_cifre(numere)
# Găsim numerele cu cele mai multe apariții max_aparitii_numere.sort() with open("3cifreout.txt", "w") as fout: fout.write(f"{max_aparitii}\n") fout.write(" ".join(map(str, max_aparitii_numere)) + "\n")
if __name__ == "__main__":
main()
</syntaxhighlight>
Explicatie
Se observă că atât 111 cât și 113 apar de câte 3 ori.