Прежде всего, ваш код уже подсчитывает, сколько звезд нужно напечатать в каждом цикле for
:
for i in range(rows):
print(' '*(rows-i-1)+'* '*(i+a))
# ^^^ number of stars on this line
for j in range(rows-2,-1,-1):
print(' '*(rows-j-1)+'* '*(j+a))
# ^^^ number of stars on this line
, чтобы вы могли просто суммировать эти числа при печати.
Но вам действительно не нужно ничего подсчитывать или суммировать, вместо этого вы можете вычислить .
Вы строите треугольники, поэтому вы можете использовать формулу числа треугольника рассчитать количество звезд, которые входят в треугольник. Для треугольника, состоящего из n
рядов, требуемое количество звезд:
n x (n + 1)
-----------
2
Каждый раз, когда вы устанавливаете минимальное количество звезд, a
, равное 1, у вас есть два целых треугольника:один с b
строками и один с b - 1
строками;Например, для примера изображения, где b
установлен на 5, в верхнем треугольнике 5 строк:
1. *
2. * *
3. * * *
4. * * * *
5. * * * * *
и еще 4 в нижнем:
4. * * * *
3. * * *
2. * *
1. *
Когдаa
больше единицы, вы в основном оставляете два меньших треугольника, оба из которых имеют высоту a - 1
. Скажем a = 3
, вы пропускаете первые и последние две строки:
1. . # not printed
2. . . # not printed
3. * * *
4. * * * *
5. * * * * *
4. * * * *
3. * * *
2. . . # not printed
1. . # not printed
, чтобы вы могли рассчитать количество звезд, необходимое для треугольника, равного b
, плюс номер треугольника b - 1
. , вычитая номер треугольника a - 1
, дважды.
Это код для вычисления:
def triangle_number(n):
return n * (n + 1) // 2
total_stars = triangle_number(b) + triangle_number(b - 1) - (2 * triangle_number(a - 1))
Например, на рисунке a = 1
и b = 5
Приведенное выше вычисляет количество звезд в треугольнике с 5 строками (b
), в треугольнике с 4 строками (b - 1
, перевернутый треугольник) и вычитает звезды, которые необходимо удалить, если a
больше 1 (поэтому 0
здесь):
>>> a = 1
>>> b = 5
>>> triangle_number(5)
15
>>> triangle_number(4)
10
>>> triangle_number(0)
0
>>> triangle_number(b) + triangle_number(b - 1) - (2 * triangle_number(a - 1))
25
Для a = 5
и b = 9
результат выглядит следующим образом:
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * *
* * * * * * *
* * * * * *
* * * * *
и формула правильно сообщаетВы, сколько звезд нужно было напечатать:
>>> a, b = 5, 9
>>> triangle_number(b) + triangle_number(b - 1) - (2 * triangle_number(a - 1))
61
>>> """
... * * * * *
... * * * * * *
... * * * * * * *
... * * * * * * * *
... * * * * * * * * *
... * * * * * * * *
... * * * * * * *
... * * * * * *
... * * * * *
... """.count('*')
61
Здесь вы можете еще больше упростить формулы, суммируя формулы треугольника для b
;подстановка b
и b - 1
в формулы;вы в основном создаете квадрат размером b
, когда a
равен 1:
(b * (b + 1) // 2) + (b - 1) * b // 2) ==
(b * (b + 1)) + ((b - 1) * b) // 2 ==
(b * (b + b)) // 2 ==
(b * 2 * b) // 2 ==
b * b
То же самое с a - 1
треугольниками:
2 * ((a - 1) * a // 2) ==
(a - 1) * a
, поэтому упрощенный расчет:
total_stars = b * b - (a - 1) * a
, и это также дает правильные значения:
>>> a, b = 1, 5
>>> b * b - (a - 1) * a
25
>>> a, b = 5, 9
>>> b * b - (a - 1) * a
61