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ții rezolvare ==
Acest cod citeste datele de intrare din fisierul "spirala1.in" si construieste 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.
Mai exact, citim numarul "n" de la intrare, care reprezinta 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. In interiorul loop-ului for, se citesc elementele matricei in functie de pozitia curenta a loop-ului si pozitiile pe care trebuie sa le aiba fiecare element in matrice. Ulterior, matricea construita este scrisa in fisierul "spirala1.out".