Рубрики
Без рубрики

Advent of Code 2019: День 2 Решения в Python

Первоначально опубликовано на fossheim.io. Ранее мы решили первый день появления Code 2019 Challen … Tagged with AdventofCode, Python, Tutorial.

Первоначально опубликовано на 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”