Этот пост изначально появился на Steadbytes.com
Полное решение можно найти на GitHub
Первая часть
Из Ввод головоломки Изменения частоты нас просят рассчитать полученная частота после всех таких изменений . Это включает в себя два шага:
- Проанализировать ввод головоломки в последовательность числовых значений
- Добавьте их!
Вход в диапазон
Проверка ввода головоломки, мы видим, что каждая частота является положительным или отрицательным целым числом, разделенным новой линией. Например:
+12 -10 -4 -8 +18
Чтобы разобрать это в последовательность числовых значений, нам нужно:
- Разделите вход на новички
Разобрать строку формы
в подписанное целое число- Регулярное выражение
[ \+|-]\d+
- Регулярное выражение
Разделение питона Файл объект На новичках напрямую поддерживается в API файла:
with open("input.txt") as puzzle_input: lines = puzzle_input.readlines()
Расположение каждой частоты в подписанное целое число может быть достигнуто с помощью Python’s Builtin int
функционируйте напрямую. При данной строке (такой как наши частоты) она будет Приставление значение для целого числа, принимая во внимание знак, если присутствует:
>>> int("+15) 15 >>> int("-15") -15
Завершая это в функции, мы получаем:
def parse_frequencies(puzzle_input): return [int(f) for f in puzzle_input.readlines()]
Суммирование частот
Поскольку наши частоты являются списком целых чисел, Python облегчает эту часть с вызовом сумма
:
def part_1(frequencies): return sum(frequencies)
Часть вторая
Далее нас просят найти Первая частота, которая возникает дважды во время последовательного применения изменений частоты при входе головоломки Анкет Описание головоломки дает подсказку импорта:
Обратите внимание, что вашему устройству, возможно, потребуется повторить свой список изменений частоты много раз, прежде чем будет обнаружена дубликата частоты, и что дубликаты могут быть найдены, когда в середине обработки списка.
С этим мы можем сломать проблему:
- Начните с частоты
0
- Неоднократно Итерация по последовательности изменений частоты, применяя каждое изменение к значению частоты тока.
- Следите за значением частоты на каждой итерации.
- Если встречается частота, которая была замечена ранее, верните ее.
def part_2(frequencies): frequency_memo = {0} current_frequency = 0 while True: for f in frequencies: current_frequency += f if current_frequency in frequency_memo: return current_frequency frequency_memo.add(current_frequency)
Резюме
Появление кода привлекает нас мягким введением, демонстрируя общую структуру головоломки:
- Прочтите немного ввода из текстового файла.
- Используйте его, чтобы решить 2 (обычно связанные) головоломки.
Ресурсы
Оригинал: “https://dev.to/steadbytes/aoc-2018-day-1-chronal-calibration-3eh2”