Нарисовать ромб из цифр в 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 шт):

Автор решения: eri

Не разбирая по четвертям - это не "улитка", которая зависит от сектора. Тут главное придумать формулу для элемента.

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='')
→ Ссылка
Автор решения: Elusha
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)) # Правильно выводим строки с учётом максимальной ширины
→ Ссылка
Автор решения: KhVG

Если все таки "Улитка"

    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)
→ Ссылка
Автор решения: nigani

Простое решение в две строки:

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()
→ Ссылка
Автор решения: ybsnow

Верхняя часть кода совпадала с моей, а вот над нижней долго колдовал, да так и не смог ничего родить (я только начал учиться). В итоге смог написать такой вариант (не без помощи добрых людей, конечно):

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='')
→ Ссылка