1396 - MDiferenta

De la Universitas MediaWiki

Cerinta

Se dau două matrice cu elemente numere întregi. Calculați diferența dintre prima și a doua matrice.

Date de intrare

Fișierul de intrare mdiferentain.txt conține pe prima linie numerele n m, reprezentând dimensiunile primei matrice. Urmează n linii cu câte m valori, elementele primei matrice.

Linia n+2 conține numerele p q, reprezentând dimensiunile celei de-a doua matrice. Urmează p linii cu câte q' valori, elementele celei de-a doua matrice.

Date de iesire

Fișierul de ieșire mdiferentaout.txt va conține pe prima linie numerele S T, reprezentând dimensiunile matricei diferență. Următoarele S linii vor conține câte T valori separate prin exact un spațiu, reprezentând valorile din matricea diferență.

Restrictii si precizari

  • 1 ⩽ n , m , p , q ⩽ 100;
  • valoarea absolută a elementelor fiecărei matrice vor fi mai mici decât 1.000.000.000;
  • scăderea matricelor se poate efectua pentru fiecare test.

Exemplul 1

Intrare
mdiferentain.txt
3 4
2 1 4 6
5 -8 5 5
2 5 -2 4
3 4
3 7 -5 0
1 -4 1 5
-4 2 8 7
Iesire
Datele introduse corespund restrictiilor impuse
mdiferentaout.txt
3 4
-1 -6 9 6
4 -4 4 0
6 3 -10 -3

Exemplul 2

Intrare
mdiferentain.txt
2 3
5 0 -10
4 300 2
3 4
5 10 8 -3
6 100 34 -8
0 15 -10 0
Iesire
Datele introduse nu corespund restrictiilor impuse

Rezolvare

def citeste_matrice(fisier):
    # Citeste dimensiunile matricei
    n, m = map(int, fisier.readline().split())
    matrice = []

    # Citeste elementele matricei
    for _ in range(n):
        linie = list(map(int, fisier.readline().split()))
        matrice.append(linie)

    return matrice, n, m


def este_input_valid(n1, m1, n2, m2):
    return 1 <= n1 <= 100 and 1 <= m1 <= 100 and 1 <= n2 <= 100 and 1 <= m2 <= 100


def diferenta_matricelor(matrice1, n1, m1, matrice2, n2, m2):
    if n1 != n2 or m1 != m2:
        raise ValueError("Dimensiunile matricelor nu corespund")

    matrice_diferenta = [[0] * m1 for _ in range(n1)]

    for i in range(n1):
        for j in range(m1):
            matrice_diferenta[i][j] = matrice1[i][j] - matrice2[i][j]

    return matrice_diferenta, n1, m1


def scrie_matrice(fisier, matrice, n, m):
    fisier.write(f"{n} {m}\n")
    for linie in matrice:
        fisier.write(" ".join(map(str, linie)) + "\n")


def main():
    # Citirea datelor de intrare din fisier
    with open("mdiferentain.txt", "r") as f:
        n1, m1 = map(int, f.readline().split())
        matrice1, _, _ = citeste_matrice(f)
        n2, m2 = map(int, f.readline().split())
        matrice2, _, _ = citeste_matrice(f)

    # Verificare validitate date de intrare
    if not este_input_valid(n1, m1, n2, m2):
        print("Datele introduse nu corespund restrictiilor impuse.")
        return

    # Calcularea diferenței matricelor
    try:
        matrice_diferenta, n_diferenta, m_diferenta = diferenta_matricelor(matrice1, n1, m1, matrice2, n2, m2)

        # Scrierea rezultatului în fisierul de iesire
        with open("mdiferentaout.txt", "w") as g:
            scrie_matrice(g, matrice_diferenta, n_diferenta, m_diferenta)

    except ValueError as e:
        print(f"EROARE: {e}")


if __name__ == "__main__":
    main()