Нарисовать ромб из цифр в Python
Помогите, пожалуйста, сделать ромб из цифр на Python, уже несколько дней пытаюсь. Должно получаться примерно так:
1
121
12321
121
1
Вот мой недоромб, не могу понять, как дописать его правую нижнюю часть:
n = int(input())
x = ""
for i in range(1, n + 1):
x = x + str(i)
print(' '*(n-i) + x + x[-2::-1])
for i in range(n-1, 0, -1):
print(' '*(n-i), sep='', end='')
for k in range(1, i + 1):
print(k, end='')
print()
Заранее спасибо!
Ответы (6 шт):
Не разбирая по четвертям - это не "улитка", которая зависит от сектора. Тут главное придумать формулу для элемента.
n = 4
w = n*2-1
ar = [ ]
for y in range(w):
ar.append([])
for x in range(w):
d = n - abs(x+1-n) - abs(y+1-n)
ar[y].append( d if d > 0 else " ")
for l in ar:
print(*l,sep='')
def get_list(n):
return list(range(1, n+1)) + list(range(n-1,0,-1)) # Рисует строку так, как нам нужно
inp = int(input())
height = get_list(inp) # Центральный вертикальный столбец
width = inp*2-1 # Ширина центральной строки. Она берётся как максимальная ширина всего ромба
for step in height: # Идём сверху вниз по вертикальному столбцу
strs = (str(x) for x in get_list(step)) # И генерируем горизонтальные
level = ''.join(strs)
print(level.center(width)) # Правильно выводим строки с учётом максимальной ширины
Если все таки "Улитка"
x= int(input())
for i in range(1, x + 1):
print(' '*(x-i), end='')
for j in range(1, i+1):
print(j, end = '')
for j in range(i-1, 0,-1):
print(j, end = '')
print()
for z in range(x-1, 0, -1):
print(' '*(x-z), end='')
for k in range(1, z + 1):
print(k, end='')
for k in range (z-1,0,-1):
print (k, end='')
print()
На первом этапе мы рисуем верхнюю часть ромба, получая ее путем склеивания двух переменных для левой и правой части. На втором этапе от этих переменных и отсекаем по одному символу и продолжаем их склеивать.
ch = 9
sumLeft = ""
sumRight = ""
for i in range(1,ch+1):
sumLeft+=str(i)
print ((" "*(ch-i))+sumLeft + sumRight)
sumRight = str(i) + sumRight
sumRight = sumRight[1:]
for i in range(ch,1, -1):
sumLeft = sumLeft[:-1]
sumRight = sumRight[1:]
print(" "*(ch+1-i) + sumLeft + sumRight)
Простое решение в две строки:
n = int(input())
print('\n'.join(' '*abs(n-i-1)+''.join([str(min(j+1, min(n*2-i-1, i+1)*2-j-1))
for j in range(2*(n-abs(n-i-1))-1)]) for i in range(n*2-1)))
Можно развернуть:
n = int(input())
for i in range(n*2-1):
print(' '*abs(n-i-1), end='')
for j in range(2*(n-abs(n-i-1))-1):
print(min(j+1, min(n*2-i-1, i+1)*2-j-1), end='')
print()
Верхняя часть кода совпадала с моей, а вот над нижней долго колдовал, да так и не смог ничего родить (я только начал учиться). В итоге смог написать такой вариант (не без помощи добрых людей, конечно):
n = int(input())
for i in range (1, n+1):
print (' ' * (n-i), *range(1, i+1), *range(i-1, 0, -1), sep='')
for j in range (n, 0, -1):
print (' ' * (n-j+1), *range(1, j), *range(j-2, 0, -1), sep='')