0276 - PareImpare

De la Universitas MediaWiki

Sursa: -PareImpare


Cerinţa

Se dau cel mult 100.000 de numere naturale, cu cel mult 2 cifre fiecare. Afişaţi în ordine strict crescătoare valorile impare care se regăsesc printre valorile date, şi în ordine strict descrescătoare valorile pare care se regăsesc printre valorile date.

Date de intrare

Fişierul de intrare pareimpare.in conţine cel mult 100.000 de numere naturale, cu cel mult 2 cifre fiecare, dispuse pe mai multe linii şi separate prin spaţii.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fişierul de ieşire pareimpare.out va conţine pe prima linie şirul valorilor impare, separate printr-un spaţiu, iar pe a doua linie şirul valorilor pare, separate printr-un spaţiu. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări

  • în fişierul de intrare se află cel puţin un număr par şi cel puţin un număr impar

Exemple

Exemplul 1

pareimpare.in
75 12 3 3 18 75 1 3
Ieșire
Datele sunt corecte.
pareimpare.out
1 3 75
18 12

Exemplul 2

pareimpare.in
10 11 42 45 79
Ieșire
Datele sunt corecte.
pareimpare.out
11 45 79
42 10

Exemplul 3

pareimpare.in
75 77 71 99
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare

#0276 PareImpare


def pareimpare(vector_pare, vector_impare):
    f = open("pareimpare.out", "w")
    vector_impare.sort()
    vector_pare.sort(reverse=True)
    vector_impare.append(0)
    vector_pare.append(1)
    for i in range(len(vector_impare) - 1):
        if vector_impare[i] != vector_impare[i + 1]:
            f.write(str(vector_impare[i]))
            f.write(" ")
    f.write("\n")
    for i in range(len(vector_pare) - 1):
        if vector_impare[i] != vector_pare[i + 1]:
            f.write(str(vector_pare[i]))
            f.write(" ")


def conform_restrictiilor():
    vector = list()
    vector_pare = list()
    vector_impare = list()
    with open('pareimpare.in') as f:
        lines = f.readlines()
        for line in lines:
            for c in line.split():
                if c.isdigit() == True:
                    vector.append(int(c))
    if len(vector) > 100000:
        print("Datele nu sunt comform restricțiilor impuse.")
        exit()
    for x in vector:
        if x < 0 or x >= 100:
            print("Datele nu sunt comform restricțiilor impuse.")
            exit()
        elif x % 2 == 0:
            vector_pare.append(x)
        else:
            vector_impare.append(x)
    if len(vector_pare) == 0 or len(vector_impare) == 0:
        print("Datele nu sunt comform restricțiilor impuse.")
        exit()
    print("Datele sunt corecte.")
    return vector_pare, vector_impare


if __name__ == '__main__':
    vector_pare, vector_impare = conform_restrictiilor()
    pareimpare(vector_pare, vector_impare)

Explicaţie cod

Acest cod implementează două funcții care citesc datele din fișierul pareimpare.in și verifică dacă respectă restricțiile impuse. Dacă datele sunt corecte, se apelează funcția "pareimpare" care sortează și afișează în fișierul pareimpare.out numerele pare și impare distincte din datele citite.

Mai exact, funcția conform_restrictiilor începe prin a inițializa trei liste: o listă goală numită vector și două liste numite vector_pare și vector_impare, inițial, totodată, goale. Funcția deschide fișierul pareimpare.in și citeste fiecare linie, apoi fiecare caracter din linie și îl adaugă la lista vector dacă este un număr întreg. Dacă aceasta este lista cu toate datele, funcția verifică dacă aceasta are o lungime mai mică sau egală cu 100.000 și dacă fiecare număr este între 0 și 99. Dacă aceste condiții sunt îndeplinite, funcția adaugă fiecare număr par în lista vector_pare și fiecare număr impar în lista vector_impare. Dacă fiecare listă are cel puțin un element, funcția afișează Datele sunt corecte. și returnează lista vector_pare și lista vector_impare.

Funcția pareimpare primește ca parametrii cele două liste cu numere pare și impare, respectiv. Funcția sortează cele două liste și adaugă 0 la lista vector_impare și 1 la lista vector_pare pentru a avea grijă și de cazul în care toate numerele sunt pare sau impare. Apoi, funcția parcurge lista vector_impare și scrie în fișier toate numerele distincte, cu excepția ultimului element care este întotdeauna 0. Funcția face același lucru și pentru lista vector_pare, cu excepția ultimului element care este întotdeauna 1.