1008 - Spirala 1

De la Universitas MediaWiki

Cerinţa

Se dau n numere naturale, un n este un pătrat perfect. Să se construiască în memorie o matrice pătratică cu toate cele n numere, în spirală, în sens invers acelor de ceas astfel: pe prima coloană, începând cu linia 1, se vor trece primele elemente din şir (de sus în jos), apoi pe ultima linie, începând de la prima coloană până la ultima (de la stânga la dreapta), apoi pe ultima coloană, de la ultima linie la prima (de jos în sus), apoi pe prima linie, de la ultima coloană la prima (de la dreapta la stânga) şamd.

Date de intrare

Fișierul de intrare spirala1.in conține pe prima linie numărul n, iar pe următoarea linie cele n numere.

Date de ieşire

Dacă datele sunt introduse corect,în fişierul de ieşire spirala1.out se va afișa :"Datele sunt introduse corect.",apoi pe un rând va conţine matricea construită, câte o linie a matricei pe o linie a fişierului, elementele fiecărei linii fiind separate prin exact un spaţiu.În cazul contrar,se va afișa pe ecran "Datele nu corespund restricțiilor impuse.".

Restricții și precizări

  • 1 ⩽ n ⩽ 10000
  • numerele date vor fi mai mici decât 1000

Exemplu

spirala1.in
9
2 6 7 3 7 1 7 1 5
spirala1.out
Datele sunt introduse corect.
2 1 7
6 5 1
7 3 7

Rezolvare

def validare(n: int, lst: list[int]) -> bool:

    if not (1 <= n <= 10000):
        return False

    if any(num >= 1000 for num in lst):
        return False

    if int(n ** 0.5) ** 2 != n:
        return False

    return True


def construieste_matrice_spirala(n: int, lst: list[int]) -> list[list[int]]:

    n = int(n ** 0.5)
    matrice = [[0] * n for _ in range(n)]

    for k in range(1, (n + 1) // 2 + 1):
        for i in range(k - 1, n - k + 1):
            matrice[i][k - 1] = lst.pop(0)

        for j in range(k, n - k + 1):
            matrice[n - k][j] = lst.pop(0)

        for i in range(n - k - 1, k - 2, -1):
            matrice[i][n - k] = lst.pop(0)

        for j in range(n - k - 1, k - 1, -1):
            matrice[k - 1][j] = lst.pop(0)

    return matrice


if __name__ == "__main__":
    with open("spirala1.in", "r") as fin:
        n = int(fin.readline().strip())
        lst = list(map(int, fin.readline().split()))

    if validare(n, lst):
        matrice = construieste_matrice_spirala(n, lst)
        with open("spirala1.out", "w") as fout:
            fout.write("Datele sunt introduse corect.\n")
            for linie in matrice:
                fout.write(" ".join(map(str, linie)) + "\n")

    else:
        with open("spirala1.out", "w") as fout:
           fout.write("Datele nu corespund restricțiilor impuse.")

Explicație rezolvare

Acest cod citește datele de intrare din fișierul "spirala1.in" si construiește o matrice pătratică cu toate cele n numere, în spirală, în sens invers acelor de ceas.
Mai exact, citim numarul "n" , care reprezintă numarul de elemente din matrice, iar apoi construim o matrice de dimensiune "n x n" cu ajutorul unui for loop care trece de la exteriorul spre interiorul matricei. În interiorul loop-ului for, se citesc elementele matricei în funcție de poziția curentă a loop-ului si pozițiile pe care trebuie sa le aibă fiecare element in matrice. Ulterior, matricea construită este scrisă in fișierul "spirala1.out".