Нужна помощь в решении задачи(осталось чуть-чуть)

Вот задача: Напишите программу, которая выводит часть последовательности 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 ... (число повторяется столько раз, чему равно). На вход программе передаётся неотрицательное целое число n — столько элементов последовательности должна отобразить программа. На выходе ожидается последовательность чисел, записанных через пробел в одну строку.

Например, если n = 7, то программа должна вывести 1 2 2 3 3 3 4.

Sample Input: 7

Sample Output: 1 2 2 3 3 3 4

Вот мой код:

x = input()
p = int(x)+1
d = 0
for i in range(1, p):
    s = str(i)
    d = i
    if i != p:
        print(s * d, end=' ')
    elif i == p:
        break

My input: 7 My output: 1 22 333 4444 55555 666666 7777777

ЧТО НУЖНО СДЕЛАТЬ: Я хотел бы понять как вывести 1 2 2 3 3 3 4


Ответы (2 шт):

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

Ленивый вариант:

Нужно считать количество элементов и завершать цикл при достижении предела:

n = 7
number = 0

for i in range(1, n + 1):
    for j in range(i):
        print(i, end=' ')
        number += 1
        if number >= n:
            break

    if number >= n:
        break

Тоже самое через функцию:

def foo(n):
    number = 0

    for i in range(1, n + 1):
        for j in range(i):
            print(i, end=' ')
            number += 1
            if number >= n:
                return

n = 7
foo(n)

Короткий вариант:

В этом случае сгенерируем последовательность чисел и заполним список, после возьмем срез от списка на количество элементов:

n = 7

items = []
for i in range(1, n + 1):
    items += [i] * i

print(items[:n])
# [1, 2, 2, 3, 3, 3, 4]
→ Ссылка
Автор решения: MBo
x = int(input())
for i in range(1, x + 1):
    for j in range(1, 1 + min(x, i)):
        print(i, end=' ')
    x -= i
→ Ссылка