Первоначально опубликовано на fossheim.io Анкет
Ранее мы решили первый день появления Code 2019 Challenge. Теперь давайте посмотрим, как решить вторую головоломку.
Проблема довольно прямая. Мы получаем список чисел, которые мы разделили группами по четырем. В последовательности из четырех, первое число относится к тому, какую операцию мы должны выполнить.
- 1
- 2
- 99
Следующие два числа дают позицию в массиве двух чисел, которые мы должны добавить или размножаться друг с другом. Четвертое число дает позицию, в которой будет назначен результат добавления или умножения.
Прочитайте полную проблему Анкет
Часть 1
Нам придется пройти список в блоках четырех. Есть разные способы сделать это, но для этого примера мы будем использовать для петли:
for index in range(0, len(arr), 4): # Do the calculations here
Это пройдет через весь массив, увеличивая индекс на 4 с каждым циклом.
Теперь мы можем легко извлечь следующие части информации. Оператор всегда находится на первой позиции последовательности, и два следующих пункта сообщат нам о позиция в массиве Из двух чисел мы будем использовать.
operator = arr[index] numberA = arr[arr[index + 1]] numberB = arr[arr[index + 2]]
Теперь мы можем использовать оператор IF-ELIF для выполнения правильных вычислений и назначить вывод правильной позиции в массиве.
if operator == 99: return arr[0] elif operator == 1: arr[arr[index + 3]] = numberA + numberB elif operator == 2: arr[arr[index + 3]] = numberA * numberB
Если мы запустим это на примерах, приведенных в головоломке, это должно дать нам правильные ответы.
Тем не менее, мы еще не закончили с частью 1. В головоломке также упоминается, что мы должны Замените позицию 1 значением 12 и замените позицию 2 на значение 2
Перед запуском программы. Если мы включим это до нашей петли, наша программа закончена и будет работать для предоставленной входной последовательности:
arr[1] = 12 arr[2] = 2 for index in range(0, len(arr), 4): operator = arr[index] numberA = arr[arr[index + 1]] numberB = arr[arr[index + 2]] if operator == 99: return arr[0] elif operator == 1: arr[arr[index + 3]] = numberA + numberB elif operator == 2: arr[arr[index + 3]] = numberA * numberB print("SOLUTION:", arr[0])
Смотрите полное решение на GitHub
Часть 2
В части 2 мы заменяем первую и вторую позицию массива двумя переменными от 0 до 99: существительное (для arr [1]
) и глагол (для arr [2]
). Наша цель – найти сочетание существительного и глагола, которая выведет массив с 19690720
На первой позиции, а затем поместите их в простую формулу: 100 * существительное + глагол
Анкет
Мы можем в значительной степени повторно использовать тот же код, что и в части 2, и обернуть его внутри двух для петли, чтобы найти комбинацию существительных-верхов.
Чтобы сделать вещи более читаемыми, я также переместил код из части 1 в функции:
def process_array(input_arr): arr = input_arr[:] # Part 1 for-loop return arr[0]
Я также сделал мелкую копию входного массива. Это потому, что мы будем много зацикливаться на массиве (до 99*99
раз), и мы хотим запустить каждую итерацию с нашего первоначального входного массива, а не с модифицированными.
Остальное довольно прямое. Мы гнеземся на две петли, одна для существительного, а другой – для глагола, назначить существительное arr [1]
и глагол к Arr [2]
А потом позвоните в наш Process_array
функция
for noun in range(100): for verb in range(100): input_arr[1] = noun input_arr[2] = verb output = process_array(input_arr)
Тогда единственное, что осталось сделать, это остановиться или цикл, если выход равен 19690720
и положите их внутрь нашей формулы.
for noun in range(100): for verb in range(100): input_arr[1] = noun input_arr[2] = verb output = process_array(input_arr) if output == 19690720: print(100 * noun + verb) break
Также можно передать существительное и глагол в функцию обработки, поэтому его можно легко использовать для обеих частей упражнения.
Смотрите полное решение на GitHub
Оригинал: “https://dev.to/fossheim/advent-of-code-2019-day-2-solutions-in-python-455a”