Коллеги математика вновь хотят порадовать его и сделать математические ёлки, которые украсят кабинет учёного.
Помогите им, написав программу, которая по введённому числу строит математическую ёлку.
Формат ввода
Вводится одно натуральное число — количество чисел в математической ёлке.
Формат вывода:
Требуемая новогодня ёлка.
Примечание
Не забывайте про существование 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}}')
Доброго времени суток! Было сложно, но с помощью этого супер полезного сайта я разобрался). Особенно очень полезен текст, который описывает логику решения задачи и код решения.
Ниже оставляю свой вариант решения этой задачки, основанный на информации с подсказки от яндекса. Но я чуть чуть изменил и доработал код, с учётом информации прочтённого на этом сайте к этой задачке, для удобства понимания последовательности логики построения ёлки:
# Поиск самой широкой строки
max_num = int(input())
num = 0
row = 0
max_line_width = 0
while num < max_num:
row += 1
column = 1
line_width = 0
while column <= row and num < max_num:
num += 1
if column < row and num < max_num:
line_width += len(str(num)) + 1
else:
line_width += len(str(num))
column += 1
if max_line_width < line_width:
max_line_width = line_width
# Построение требуемой ёлки
row = 0
num = 0
while num < max_num:
row += 1
column = 1
str_value = »
while column <= row and num < max_num:
num += 1
if column < row and num < max_num:
str_value += str(num) + ‘ ‘
else:
str_value += str(num)
column += 1
print(f'{str_value:^{max_line_width}}’)