Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
2009 - Accesibil
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
Sursa: [https://www.pbinfo.ro/probleme/2009/accesibil] ---- == Cerinţa == Un număr natural de cel puțin două cifre se numește accesibil dacă este format din cifre consecutive în ordine strict crescătoare. ('''23''' și '''6789''' sunt numere accesibile, în timp ce '''7''', '''2334''' și '''654''' nu sunt numere accesibile).<br> Scrieți un program care să citească numerele '''k''', '''n''' și un șir de '''n''' numere naturale și să afișeze: a) cele mai mari 3 numere accesibile, nu neapărat distincte, din șirul de '''n''' numere; b) câte dintre numerele din șirul dat care nu sunt accesibile, devin accesibile prin eliminarea exact a unei cifre; c) cel mai mic și cel mai mare număr accesibil format din '''k''' cifre; d) numărul numerelor accesibile pare de '''k''' cifre și numărul numerelor accesibile impare de '''k''' cifre. == Date de intrare == Fișierul de intrare '''accesibil.in''' conține pe prima linie un număr natural '''p'''. Pentru toate testele de intrare, numărul '''p''' este un număr din mulțimea '''{1,2,3,4}'''. Pe linia a doua a fișierului de intrare se găsesc '''k''' și '''n''', iar pe a treia linie a fișierului de află n numere naturale separate prin câte un spațiu. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va afișa: '''"Datele sunt introduse corect."''', apoi: * Dacă valoarea lui '''p''' este '''1''', se va rezolva numai punctul a) din cerințe. În acest caz, în fișierul de ieșire '''accesibil.out''' se vor scrie, în ordine crescătoare, separate prin câte un spațiu, cele mai mari trei numere accesibile dintre cele n numere aflate pe a treia linie a fișierului. Se garantează că pentru '''p = 1''' sunt cel puțin trei numere accesibile în șirul de '''n''' numere. * Dacă valoarea lui '''p''' este '''2''', se va rezolva numai punctul b) din cerințe. În acest caz, în fișierul de ieșire se va scrie numărul numerelor din șirul dat care nu sunt accesibile, dar care ar deveni accesibile dacă li s-ar elimina o cifră. * Dacă valoarea lui '''p''' este '''3''', se va rezolva numai punctul c) din cerințe. În acest caz, în fișierul de ieșire se vor scrie două valori, separate printr-un spațiu, reprezentând cel mai mic număr accesibil de '''k''' cifre și cel mai mare număr accesibil de '''k''' cifre. Dacă cele două numere ce ar trebui afișate coincid se va afișa valoarea lor comună o singură dată. * Dacă valoarea lui '''p''' este '''4''', se va rezolva numai punctul d) din cerințe. În acest caz, în fișierul de ieșire se vor scrie două valori reprezentând numărul numerelor accesibile pare de '''k''' cifre și numărul numerelor accesibile impare de '''k''' cifre, în această ordine, separate prin spațiu. În caz contrar, pe ecran se va afișa: '''"Datele nu au fost introduse corect."''' == Restricţii şi precizări == * '''2 ≤ k ≤ 9''' și '''3 ≤ n ≤ 100.000;''' * '''0''' ≤ numerele din șir ≤ '''2.000.000.000'''; * Din numărul '''5073''', de exemplu, prin eliminarea unei cifre se obțin numerele '''507, 503, 573''' și '''73'''; * Pentru a rezolva cerințele a) și b) nu folosim valoarea lui '''k''', iar pentru cerințele c) și d) nu folosim șirul de n numere; == Exemple == ===Exemplul 1=== ; accesibil.in : 2 : 3 9 : 4 34 123 1238 301 689 4560 7023 1238 ; Ecran : Datele sunt introduse corect. ; accesibil.out : 5 ===Exemplul 2=== ; accesibil.in : 3 : 4 3 : 12 345 67 ; Ecran : Datele sunt introduse corect. ; accesibil.out : 1234 6789 ===Exemplul 3=== ; accesibil.in : 1 : 3 8 : 6 12 235 5678 90 987 234 5678 ; Ecran : Datele sunt introduse corect. ; accesibil.out : 234 5678 5678 == Rezolvare == <syntaxhighlight lang="python" line> # 2009 def verifica_restricții(k, n, numere): # verifică dacă datele introduse sunt corecte if not (2 <= k <= 9 and 3 <= n <= 100000): return False for numar in numere: if numar < 0 or numar > 2000000000: return False return True def numere_accesibile(numere, n): # găsește cele mai mari trei numere accesibile numere_accesibile_list = [] for numar in numere: s = str(numar) for i in range(1, len(s)): if int(s[i]) != int(s[i - 1]) + 1: break else: numere_accesibile_list.append(numar) numere_accesibile_list.sort(reverse=True) return numere_accesibile_list[:3] def numere_nu_accesibile(numere, n): # găsește câte dintre numerele din șirul dat care nu sunt accesibile devin accesibile prin eliminarea exact a unei cifre numere_nu_accesibile_count = 0 for numar in numere: s = str(numar) for i in range(len(s)): if i == 0: continue numar_nou = int(s[:i] + s[i + 1:]) if numar_nou >= 10 and numar_nou not in numere and all( int(str(numar_nou)[j]) == int(str(numar_nou)[j - 1]) + 1 for j in range(1, len(str(numar_nou)))): numere_nu_accesibile_count += 1 break return numere_nu_accesibile_count def numere_accesibile_k_cifre(k): # găsește cel mai mic și cel mai mare număr accesibil format din k cifre cel_mai_mic = 10 ** (k - 1) cel_mai_mare = 10 ** k - 1 numere_accesibile = [] for numar in range(cel_mai_mic, cel_mai_mare + 1): s = str(numar) if all(int(s[i]) == int(s[i - 1]) + 1 for i in range(1, len(s))): numere_accesibile.append(numar) return numere_accesibile def numere_accesibile_pare_si_impare(k): # găsește numărul numerelor accesibile pare de k cifre și numărul numerelor accesibile impare de k cifre numere_accesibile_pare = 0 numere_accesibile_impare = 0 for numar in range(10 ** (k - 1), 10 ** k): if all(int(str(numar)[i]) == int(str(numar)[i - 1]) + 1 for i in range(1, len(str(numar)))): if numar % 2 == 0: numere_accesibile_pare += 1 else: numere_accesibile_impare += 1 return numere_accesibile_pare, numere_accesibile_impare if __name__ == '__main__': try: with open('accesibil.in', 'r') as f: p = int(f.readline().strip()) k, n = map(int, f.readline().split()) numere = list(map(int, f.readline().split())) except: print("Datele nu au fost introduse corect") exit() if verifica_restricții(k, n, numere): print("Datele au fost introduse corect.") if p == 1: numere_accesibile = numere_accesibile(numere, n) with open('accesibil.out', 'w') as fout: fout.write(" ".join(map(str, numere_accesibile))) elif p == 2: numere_nu_accesibile = numere_nu_accesibile(numere, n) with open('accesibil.out', 'w') as fout: fout.write(str(numere_nu_accesibile)) elif p == 3: numere_accesibile_k_cifre = numere_accesibile_k_cifre(k) with open('accesibil.out', 'w') as fout: fout.write(str(min(numere_accesibile_k_cifre)) + " " + str(max(numere_accesibile_k_cifre))) elif p == 4: numere_accesibile_pare_si_impare = numere_accesibile_pare_si_impare(k) with open('accesibil.out', 'w') as fout: fout.write(str(numere_accesibile_pare_si_impare[0]) + " " + str(numere_accesibile_pare_si_impare[1])) else: print("Datele introduse nu sunt corecte") </syntaxhighlight> == Explicație rezolvare == Funcția '''verifica_restricții''' verifică dacă datele de intrare sunt corecte și returnează '''False''' dacă nu sunt. Dacă sunt corecte, funcțiile corespunzătoare pentru fiecare cerință specificată de '''p''' sunt apelate.<br><br>Funcția '''numere_accesibile''' găsește cele mai mari trei numere accesibile din lista de numere date, iar funcția '''numere_nu_accesibile''' găsește câte dintre numerele din listă care nu sunt accesibile devin accesibile prin eliminarea exact a unei cifre. Funcția '''numere_accesibile_k_cifre''' găsește cel mai mic și cel mai mare număr accesibil format din '''k''' cifre, iar funcția '''numere_accesibile_pare_si_impare''' găsește numărul numerelor accesibile pare și impare de '''k''' cifre.<br><br>În cele din urmă, în funcția '''main''', datele de intrare sunt citite din fișierul '''accesibil.in'''. Apoi, este verificat dacă datele de intrare sunt corecte și, dacă sunt, este selectată funcția corespunzătoare cerinței specificate de '''p'''. În cele din urmă, rezultatele sunt scrise în fișierul '''accesibil.out'''.
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width