R. Новогоднее настроение 2.0

Коллеги математика вновь хотят порадовать его и сделать математические ёлки, которые украсят кабинет учёного.
Помогите им, написав программу, которая по введённому числу строит математическую ёлку.

Формат ввода

Вводится одно натуральное число — количество чисел в математической ёлке.

Формат вывода:

Требуемая новогодня ёлка.

Примечание

Не забывайте про существование 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 года не засчитывает решение. Происходит это потому, что в случае четного количества символов выровненных по центру нечетного количества пробелов эти две операции дают совершенно разный результат:

Python
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.

Посмотреть код

Решение

Python
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}}')
Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Ильгиз
Ильгиз
25.12.2025 10:48

Доброго времени суток! Было сложно, но с помощью этого супер полезного сайта я разобрался). Особенно очень полезен текст, который описывает логику решения задачи и код решения.
Ниже оставляю свой вариант решения этой задачки, основанный на информации с подсказки от яндекса. Но я чуть чуть изменил и доработал код, с учётом информации прочтённого на этом сайте к этой задачке, для удобства понимания последовательности логики построения ёлки:
# Поиск самой широкой строки
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}}’)

Последний раз редактировалось 1 месяц назад Ильгиз ем