3902 - Sort Sum

De la Universitas MediaWiki

Cerința

Scrie un program care citind un șir de numere naturale afișează numerele citite ordonate crescător după suma cifrelor lor, iar dacă suma cifrelor este egală, descrescător după valoarea lor.

Date de intrare

Fișierul de intrare sortsum.in conține pe prima linie numere naturale separate prin spații.

Date de ieșire

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."

Pe următoarea linie se vor afișa numerele ordonate conform cerinței.

În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."

Restricții și precizări

  • în fișier vor fi mai puțin de 1.000.000 de numere
  • numerele din fișierul de intrare vor fi mai mici decât 10.000.000

Exemplu 1

Intrare
102 60 51 600 21 3
Ieșire
Datele de intrare corespund restricțiilor impuse.
102 21 3 600 60 51

Exemplu 2

Intrare
10516212154212 651621215516212150 5162121551 60516212150 2605116051 605160513
Ieșire
Datele de intrare nu corespund restricțiilor impuse.

Rezolvare

#3902 - Sort Sum
def conditii(numere):
    return len(numere) < 1_000_000 and \
        all(nr < 100_000_000 for nr in numere)


def sort_sum(numere):
    rezultat = sorted(numere, key=lambda numar: (sum([int(cifra) for cifra in str(numar)]), -numar))
    # cheia de sortare returneaza un tuplu de 2 elemente:
    # 1) suma cifrelor unui număr, SCif(numar) -> sum([int(cifra) for cifra in str(numar)])
    # 2) numărul în sine, dar negat -> -numar
    # Numerele sunt sortate după SCif(x). Dacă două numere au aceeași SCif, atunci sunt sortate după valoarea lor negată.
    # Negăm numărul pentru a-l sorta descrescător.
    print(" ".join([str(x) for x in rezultat]))


if __name__ == "__main__":
    numere = [int(x) for x in input().split()]
    if not conditii(numere):
        print("Datele de intrare nu corespund restricțiilor impuse.")
    else:
        print("Datele de intrare corespund restricțiilor impuse.")
        sort_sum(numere)