3974 - IRDDS

De la Universitas MediaWiki

Cerința

Se dau 2 mulţimi de numere naturale A și B. Să se afișeze mulţimea rezultată în urma efectuării unei operații.

Date de intrare

Programul citește de la tastatură: Pe prima linie 2 numere naturale N și M, reprezentând numărul elementelor mulţimii A, respectiv B, urmate de unul dintre caracterele * + - % :

  • * intersecţie A∩B.
  • + reuniune A∪B.
  • - diferența A∖B.
  • % diferența simetrică (A∖B)∪(B∖A).

Pe cea de-a 2-a linie N numere naturale reprezentând elementele mulţimii A. Pe cea de-a 3-a linie M numere naturale reprezentând elementele mulţimii B.

Date de ieșire

Programul va afișa pe ecran elementele mulţimii rezultate, ordonate crescător, în urma efectuării operaței.

Restricții și precizări

  • 1 ≤ N, M ≤ 200.000
  • elementele mulţimilor A și B vor fi mai mici decât 1.000.000.000
  • nu există cazul ca în urma efectuării uneia dintre operatii rezultatul să fie egal cu mulţimea vidă.

Exemplul 1

Intrare
5 5 %
4 5 6 7 8
1 2 3 4 5
Ieșire
Datele introduse corespund restricțiilor impuse.
1 2 3 6 7 8

Explicație

({4,5,6,7,8}∖{1,2,3,4,5})∪({1,2,3,4,5}∖{4,5,6,7,8})={1,2,3,6,7,8}.

Exemplul 2

Intrare
5 5 %
4 5 6 7 8
1 2 3 4 5000000000
Ieșire
Datele introduse nu corespund restricțiilor impuse.

Rezolvare

# 3974 - IRDDS
def validare(n_validare, m_validare, a_validare, b_validare):
    if n_validare < 1 or n_validare > 200000 or m_validare < 1 or m_validare > 200000:
        raise ValueError

    for numar in a_validare + b_validare:
        if numar < 1 or numar > 1000000000:
            raise ValueError

    print("Datele de intrare corespund restrictiilor impuse")
    return True


def operatie(a_operatie, b_operatie, op_operatie):
    if op_operatie == '*':
        rezultat_operatie = set(a_operatie).intersection(b_operatie)
    elif op_operatie == '+':
        rezultat_operatie = set(a_operatie).union(b_operatie)
    elif op_operatie == '-':
        rezultat_operatie = set(a_operatie).difference(b_operatie)
    elif op_operatie == '%':
        rezultat_operatie = set(a_operatie).symmetric_difference(b_operatie)
    else:
        raise ValueError("Operatia nu este valida")

    return sorted(list(rezultat_operatie))


if __name__ == '__main__':
    try:
        n_main, m_main, op_main = input(
            "Introduceti numarul de elemente din A, numarul de elemente din B si operatia "
        ).split()
        n_main = int(n_main)
        m_main = int(m_main)
        A_main = list(map(int, input("Introduceti elementele multimii A ").split()))
        B_main = list(map(int, input("Introduceti elementele multimii B ").split()))
        validare(n_main, m_main, A_main, B_main)
        rezultat_main = operatie(A_main, B_main, op_main)
        print(" ".join(map(str, rezultat_main)))

    except ValueError:
        print("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        print("Datele de intrare nu corespund restrictiilor impuse")