Коллеги математика вновь хотят порадовать его и сделать математические ёлки, которые украсят кабинет учёного.
Помогите им, написав программу, которая по введённому числу строит математическую ёлку.
Формат ввода
Вводится одно натуральное число — количество чисел в математической ёлке.
Формат вывода:
Требуемая новогодня ёлка.
Примечание
Не забывайте про существование f-строк.
Пример
Ввод
14
Вывод
1
2 3
4 5 6
7 8 9 10
11 12 13 14
Ввод
6
Вывод
1
2 3
4 5 6
Решение
В этой задаче мы познакомимся с утилитарным подходом к иешению задачи в противовес математическому.
Более сложный вариант задачи C. Новогоднее настроение
Цикл построения остался тем же самым. А вот форматирование стало сильно сложнее – наша елка должна быть расположена по центру.
Основная сложность – понять что проще расчитать ширину самого длинного уровня елки и воспользоваться форматированием в f-строке, чем рассчитывать смещение каждого уровня по отдельности. Так, например при переходе с четвертого на пятый уровень возникает “ступенька” и отступ уменьшается сразу на 2 позиции.
Вторая сложность заключается в том, что последний этаж теоретически может оказаться заполнен не полностью, а лишь частично. Например, в случае елки из 92 элементов на нижнем уровне будет всего один элемент. Это значит, что самый длинный уровень будет предпоследним.
Итак, наша задача на первом этапе сводится к тому, чтобы узнать ширину самого длинного уровня. Можно посидеть и придумать формулу какие числа будут на каждом этаже, но это не решает проблему номер два. Нам нужно будет определить какой этаж длиннее – предпоследний или последний и вычислить его длину. Поэтому мы пойдем более простым путем – мы “построим” виртуальную елку, посчитаем длину всех элементов каждого этажа, включая пробелы между ними, и найдем максимальное значение длины.
Когда длина найдена мы построим елку во второй раз, собирая строку-уровень с помощью конкатенации (сложения строк) и выводя получившуюся строку по центру виртуального поля, ширину которого мы посчитали на первом этапе.
Следует отметить, что если строку выравнивать по центру не с помощью f-строки, а с помощью метода .center(), то Яндекс по состоянию на 21 декабря 2023 года не засчитывает решение. Происходит это потому, что в случае четного количества символов выровненных по центру нечетного количества пробелов эти две операции дают совершенно разный результат:
print('|' + f'{str(11):^{5}}' + '|')
print('|' + f'{11}'.center(5) + '|')
| 11 |
| 11 |
В этой задаче проблема проявляется в следующем виде
.center()
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
f-строка
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
Обратите внимание на взаимное расположение чисел 11 и 16.
Посмотреть код
Решение
limit = int(input())
counter = 0
width = 1
max_length = 0
while counter <= limit:
string_length = 0
for position in range(width):
counter += 1
if counter <= limit:
string_length += len(str(counter))
if position < width - 1 and counter < limit:
string_length += 1
if max_length < string_length:
max_length = string_length
width += 1
counter = 0
width = 1
while counter <= limit:
string = ''
for position in range(width):
counter += 1
if counter <= limit:
string += str(counter)
if position < width - 1 and counter < limit:
string += ' '
width += 1
print(f'{string:^{max_length}}')