Mario CS50 в Python

Поэтому я попытался написать на Марионе назначение mario из CS50 в python вместо C, и мне удалось заставить его работать! Я не совсем понимаю, как работают циклы, особенно математика, потому что я просто играл, чтобы получить желаемый результат.

Требования задания были следующими

  1. Создайте половину пирамиды, используя хэши
  2. Убедитесь, что он выровнен по правому краю
  3. Он должен соответствовать высоте, указанной Пользователем
  4. Первая строка должна начинаться с 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")
  
Другие вопросы по тегам