3146 - Sort 4
Cerinţa[edit | edit source]
Laurențiu este un copil pasionat de teoria numerelor, dar și de informatică. Astfel, în timp ce își savura limonada după o zi obositoare de scoală alături de prietenii săi, acestuia i-a venit în minte o problemă interesantă: dându-se un șir de n numere naturale, sortați-l descrescător după numărul de cifre distincte, la număr de cifre distincte egal sortați-l crescător după suma cifrelor, la suma cifrelor egală sortați-l crescător după produsul cifrelor, iar dacă și produsul cifrelor este egal, atunci numerele se vor sorta crescător după valorile lor.
Date de intrare[edit | edit source]
Fișierul de intrare sort4in.txt conține pe prima linie numărul n, iar pe a două linie n numere naturale separate prin spații.
Date de ieșire[edit | edit source]
Fișierul de ieșire sort4out.txt vă conține șirul sortat.
Restricţii şi precizări[edit | edit source]
- 1 ⩽ n ⩽ 1.000.000
- numerele de pe a două linie a fișierului de intrare vor fi mai mici decât 2.000.000.000
Exemplu 1[edit | edit source]
- sort4in.txt
5 111 19 223 51 37
- sort4out.txt
Datele de intrare corespund restrictiilor impuse 51 223 19 37 111
Exemplu 2[edit | edit source]
- sort4in.txt
5 111 19 223 51 20000000001
- sort4out.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def cifre_distincte(n):
return len(set(str(n)))
def suma_cifrelor(n):
return sum(int(c) for c in str(n))
def produs_cifrelor(n):
produs = 1 for c in str(n): produs *= int(c) return produs
def main():
# Deschiderea fișierelor de intrare și ieșire with open('sort4in.txt', 'r') as fin, open('sort4out.txt', 'w') as fout: # Citirea numărului de elemente din fișierul de intrare int(fin.readline().strip())
# Citirea numerelor și verificarea restricțiilor numere = list(map(int, fin.readline().strip().split())) if any(numar < 1 or numar >= 2000000000 for numar in numere): fout.write("Datele de intrare nu corespund restrictiilor impuse\n") return else: fout.write("Datele de intrare corespund restrictiilor impuse\n")
# Sortarea numerelor numere.sort(key=lambda x: (-cifre_distincte(x), suma_cifrelor(x), produs_cifrelor(x), x))
# Scrierea numerelor sortate în fișierul de ieșire fout.write(' '.join(map(str, numere)) + '\n')
if __name__ == "__main__":
main()
</syntaxhighlight>