3146 - Sort 4
Cerinţa
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
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
Fișierul de ieșire sort4out.txt vă conține șirul sortat.
Restricţii şi precizări
- 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
- sort4in.txt
5 111 19 223 51 37
- sort4out.txt
Datele de intrare corespund restrictiilor impuse 51 223 19 37 111
Exemplu 2
- sort4in.txt
5 111 19 223 51 20000000001
- sort4out.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare
<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>