3146 - Sort 4

De la Universitas MediaWiki

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

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()