1008 - Spirala 1
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
<syntaxhighlight lang="python" line>
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.")
</syntaxhighlight>
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".