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
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии