Mario CS50 в Python
Поэтому я попытался написать на Марионе назначение mario из CS50 в python вместо C, и мне удалось заставить его работать! Я не совсем понимаю, как работают циклы, особенно математика, потому что я просто играл, чтобы получить желаемый результат.
Требования задания были следующими
- Создайте половину пирамиды, используя хэши
- Убедитесь, что он выровнен по правому краю
- Он должен соответствовать высоте, указанной Пользователем
- Первая строка должна начинаться с 2"#"s
Любое разъяснение по поводу моих петель будет с благодарностью:)
print('Height: ', end='');
h = int(input());
while(h<0 or h > 24):
print("That is an invalid input")
print('Height: ', end='');
h = int(input());
for i in range(h):
print(" "*(h-i)+"#"*(i+1));
3 ответа
Во-первых, просто хотел отметить, что ваш код не распечатывает всю пирамиду; это только печатает половину этого. Ваш вывод должен выглядеть примерно так (например, если мы введем высоту 3):
# #
## ##
### ###
Ваш код печатает только левую сторону:
#
##
###
Теперь к вашему вопросу. Вот как вы получили это на работу:
for i in range(h): print(" " * (h - i) + "#" * (i + 1));
Чтобы описать условное утверждение цикла for, i
начинается с 0 и продолжается до h
,
Чтобы понять, как ваш print()
оператор работает, думайте о нем как о отрезке, состоящем из пробелов и хешей. Длина этого отрезка h
, Итак, в h - i
Вы печатаете часть этого "сегмента" как пробелы, а в i + 1
, вы печатаете остаток цикла.
Теперь причина, по которой вы используете i + 1
и не только i
из-за условия цикла for; i
начинается с нуля. В результате вы, должно быть, поняли, что в первой строке нет хэшей, так как h - 0
пробелы и 0
хэши. Вот почему i + 1
был необходим; вы печатаете лишний пробел в начале каждой строки, если вы тщательно проверяете текущий код.
Более простая для понимания логика вашего кода с теми же результатами:
for i in range(1, h + 1): # The counter's range is toyed with here
print(" " * (h - i) + "#" * i); # The "i + 1" is removed
Здесь, диапазон цикла играет с; теперь он начинается с 1 (так что печатается первый хеш, а весь "сегмент" - это не только пробелы в первой строке), а заканчивается на h + 1
(так что диапазон цикла остается неизменным).
i + 1
устранен; видя print()
Это утверждение облегчает понимание логики "сегмента", рассмотренной выше.
* Просто чтобы уточнить, альтернативный код, который я предоставил выше, не предназначен для замены вашего кода; Я просто включил его, чтобы усилить мою идею "сегмента". Ваш код в порядке и работает так же хорошо, как и мой.
диапазон (начало, остановка [, шаг])
Функция Python range() возвращает список целых чисел от некоторой нижней границы (ноль, по умолчанию) до (но не включая) некоторой верхней границы, возможно, в приращениях (шагах) некоторого другого числа (один, по умолчанию). Следовательно,
range(3) returns a sequence: 0, 1, 2
range(1,3) returns a sequence: 1, 2
range(1,7,2) returns a sequence: 1, 3, 5
Я думаю, это не правильный ответ. Для понимания используйте "_"
или другие символы вместо пробелов. Если height = 1
, мы можем увидеть _#
, но должен быть #
, Так что правильный ответ, может быть:
print('Height: ', end='');
h = int(input());
while(h<0 or h > 24):
print("That is an invalid input")
print('Height: ', end='');
h = int(input());
for i in range(h):
print("_" * (h - (i+1)) + "#" * (i + 1));
Извините за мой английский.
Вам нужно разделить их на две части, чтобы вы могли четко видеть картину, так будет проще реализовать параллельное выполнение.
left_align_counter = 0
print("Printing left aligned")
print("Height: ", end="")
height = int(input())
for h in range(height):
left_align_counter +=1
print("#"*left_align_counter)
print("DONE.")
right_align_counter = 0
print("Printing right align ")
for h in range(height):
right_align_counter += 1
print(" "*int(height-right_align_counter), end="")
print("#"*int(right_align_counter))
print("DONE.")
Печать бок о бок
left_align_counter = 0
print("Printing left aligned")
print("Height: ", end="")
height = int(input())
for h in range(height):
left_align_counter +=1
print("#"*left_align_counter)
print("DONE.")
right_align_counter = 0
print("Printing right align ")
for h in range(height):
right_align_counter += 1
print(" "*int(height-right_align_counter), end="")
print("#"*int(right_align_counter))
print("DONE.")
#here we can use any counter for the blocks be it right or left so just use counter variable
counter = 0
for h in range(height):
counter += 1
print(" "*int(height-counter), end="")
print("#"*int(counter), end=' ')
print("#"*int(counter),end="\n")