1396 - MDiferenta

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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