3146 - Sort 4

From Bitnami MediaWiki

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>