Автор оригинала: Robin Andrews.
В этом уроке мы собираемся посмотреть на забавный вызов кодирования в Python, называемый «100 дверей» Отказ Это отличная задача для разработки алгоритмического мышления и навыков программирования Python.
Задание
В ряду 100 дверей изначально закрываются.
Вы делаете 100 проходов в дверях.
Первый раз, когда вы посещаете каждую дверь и переключите его состояние (если дверь закрыта, вы открываете ее; если она открыта, вы его закрываете).
Второй раз, вы посещаете только 2 две двери (дверь № 2, № 4, # 6, …) и переключите его.
В третий раз вы посещаете каждую третью дверь (дверь № 3, # 6, # 9, …).
Продолжайте этот шаблон, пока вы не посетите не только на 100-й двери.
Какие двери открыты и которые закрыты после последнего прохода?
(Из Код Розетта )
В решении этой задачи вам нужно будет нарисовать несколько аспектов ваших знаний о программировании.
Например:
- Выбор ценных бумажных типов данных
- Использование логических переменных эффективно
- Управляющая итерация (например, вложенные для петлей )
- Алгоритмические навыки мышления
Решение 100 дверей кодируют вызов
Вы можете пойти на эту проблему для себя перед чтением. Я рекомендую вам сделать это, как, даже если вам не удастся, у вас будет гораздо ясную картину проблем, связанных с тем, чтобы вы следили с остальной частью этого урока.
Первое, что нужно рассмотреть, как мы будем представлять состояние дверей. Для начинающих программистов это не обязательно очевидно.
То, как я реализовал это, это использовать массив (список в Python) логии, так что
- Истинные средства открыты
- Ложные средства закрыты
При решении любой алгоритмии задачи действительно важный начальный шаг состоит в том, чтобы решить, какую форму будут введены данные.
Python позволяет нам создать этот список логиков с легкостью:
doors = [False] * 101 # So we can start at door 1. We will ignore index 0
С вышеуказанным кодом я ожидал проблему с подсчетом, посчитав, посчитав, посчитав информацию о списке Python от 0 Принимая во внимание, что заявление о проблеме предполагает, что первая дверь пронумерована 1 Отказ Это может вызвать когнитивное трение И есть более одного способа решения проблемы. Мой подход – просто иметь неиспользуемое значение в начале списка, и иметь 101 предметы всего, а не 100 Отказ
Далее нам нужно Итерация над списком дверей. Поскольку мы знаем количество итераций, необходимых заранее, мы используем для петля.
for i in range(1, 101): # 101 because of how range works
doors[i] = not doors[i] # Using `not` to invert the Boolean value
print(doors)
Обратите внимание, как мы переключаем состояние каждой двери в вышеуказанном коде. Мы получили доступ к Двери Список с использованием Я Как индекс, и использовал логический не Оператор для инвертирования значений.
Хорошо, мы сделали один проход дверей, но это только начало. Нам нужно сделать 100 проходов, с поведением пропуска, описанным в определении проблемы.
Для достижения этого необходимо два ключевых компонента. Одним из них является использование вложенных для циклов, которые вы можете узнать больше по ссылке.
Основной пример вложенного для петля будет:
for x in range(1, 6):
for y in range(1, 4):
print("x:", x, "y", y)
Перед запуском этого кода вы должны тщательно подумать о том, что будет вывод. Тогда идите вперед и бегите и посмотрите, были ли вы правы.
Другой компонент – это использование шаг Значение в наших для петлей.
Например, следующий код
for i in range(1, 11, 2):
print(i)
печатает значения 1, 3, 5, 7, 9 Отказ Это третий аргумент для Диапазон который определяет шаг. Обратите внимание, что 11 не отображается, потому что верхняя граница для Диапазон не включено.
Теперь у нас есть ингредиенты, чтобы решить проблему, есть только один финальный трюк, вам нужно будет поставить их все вместе. Это необходимо использовать внешний счетчик петлей ( I В этом случае) в качестве параметра в Диапазон внутреннего цикла. Я поставил комментарий, объясняющий, как это работает в моем решении ниже.
Решение для 100 дверей Python Coding Choda.
doors = [False] * 101 # so we can start at door 1. We will ignore index 0
for i in range(1, 101):
# for the second pass, x = 2, so we start at door 2, for the 3rd pass we start at door 3 etc.
for j in range(i, 101, i):
doors[j] = not doors[j] # using `not` to invert the Boolean value
# Print out just the positions of the open doors
for i in range(1, 101):
if doors[i] is True: # Or just if doors[i]:
print(i)
Когда вы запускаете этот код, вы можете заметить, что на выходе есть четкий математический шаблон. Это может быть большой авеню для дальнейшего изучения …
В этом уроке мы узнали, как решить 100 драйверов, кодирующих вызов в Python. Я надеюсь, что вы нашли это интересно и полезно.
Счастливые вычисления!