Macierz w kształcie klepsydry

0

Cześć. Muszę napisać program którzy tworzy tablice kwadratową o wymiarach 101x101, która wygląda tak:
1 0 0 0 0 0 1
1 1 0 0 0 1 1
1 1 1 0 1 1 1
1 1 1 1 1 1 1
1 1 1 0 1 1 1
1 1 0 0 0 1 1
1 0 0 0 0 0 1
Trzeba to zrobić bez użycia pętli
oczywiście to rysunek poglądowy, w mniejszym wydaniu :D Proszę o jakąś podpowiedź

0

Weż p = 101:

def f(m, n, k):
	if n == -1: 
		print(k * [1])
		return
	a =   [1]*m + n * [0] + m * [1]
	print(a)
	f(m + 1, n - 2, k)

def f2(m, n, k):
	if n == k - 2: 
		print(1 * [1] + n * [0] + 1 * [1])
		return
	a = [1]*m + n * [0] + m * [1]
	print(a)
	f2(m - 1, n + 2, k)


if __name__ == '__main__':
	p = 11
	f(1, p - 2, p)
	f2(p // 2, 1, p)
0

Można też tak:

import numpy as np

n = 51
print(np.vstack((np.hstack((np.tri(n), np.fliplr(np.tri(n))[:,1:])), np.flipud(np.hstack((np.tri(n), np.fliplr(np.tri(n))[:,1:]))[0:-1,:]))))

Jest to ponad dwukrotnie szybsza metoda.

0

To na pewno to samo? Nie wygląda.

[[ 1.  0.  0. ...,  0.  0.  0.]
 [ 1.  1.  0. ...,  0.  0.  0.]
 [ 1.  1.  1. ...,  0.  0.  0.]
 ..., 
 [ 1.  1.  1. ...,  0.  0.  0.]
 [ 1.  1.  0. ...,  0.  0.  0.]
 [ 1.  0.  0. ...,  0.  0.  0.]]
0

list comprehension pewnie też się liczy jako pętla, ale co tam:

w = 7
h = 7

def compute_value(x, y):
    x = min(x, w - x - 1)
    return (y >= x and y < h - x) and 1 or 0

result = [[compute_value(x, y) for y in range(h)] for x in range(w)]

1 użytkowników online, w tym zalogowanych: 0, gości: 1