мысли, решение, другие решения, вынос
Первоначальные мысли
Это читается как классическая задача из 5-го класса по математике.
Нет, я не имею в виду, что это легко или что людям должно быть плохо, если они не решат ее. Но я заметил кое-что новое в AOC: у нас есть дополнительная информация, информация, о которой нам не нужно знать, чтобы внедрить решение. (например, опрос Go/No Go или о том, что для запуска модулей требуется топливо)
Я вижу, как кто-то читает блок этого текста и чувствует себя заблокированным из-за непонимания контекста запуска ракет или того, на что похожа процедура, чувствует себя запуганным или даже потерянным в отношении того, почему все это имеет значение.
Это, безусловно, умение распознавать сигнал в шуме.
По иронии судьбы, я прихожу в AOC из-за «шума» — я хочу почувствовать себя супергероем, спасающим Рождество. Я бы не чувствовал себя так, если бы в AOC не было истории… :(
Решение: Часть 1
Моя общая стратегия была такой:
- разобрать ввод в коллекцию (в моем случае массив)
- возьмите каждого члена коллекции и рассчитайте необходимое топливо
- суммировать необходимое топливо
Итак, я сделал свою функцию fuel_required
def fuel_required(mass) (mass / 3).floor - 2 en
и парсер для ввода
def parse_input(input_long_string) input_long_string .split("\n") .collect(&:to_i) end
Оглядываясь назад, я вижу, что этот код сочится моей паранойей для выполнения деления с плавающей запятой, которое я использовал как .floor
, так и .to_i
Да, наверное, это было излишеством… живи и учись!
Решение: Часть 2
Когда я впервые прочитал часть 2 о том, что топливу нужно топливо, и этому топливу нужно топливо, и тому топливу для топлива нужно топливо и т. д., я думаю о цикле. Обычно я мыслю итеративно, поэтому моя первая мысль until
(или while
)
Забавно, однако, когда я впервые столкнулся с этой проблемой, я программировал в паре с другом, который проводит большую часть своего времени в OCaml, поэтому их интуиция подсказала использовать рекурсивную функцию.
Мы решили это рекурсивно:
def recursive_fuel_required(mass) fuel = fuel_required(mass) if fuel <= 0 0 else fuel + recursive_fuel_required(fuel) end end
Я знаю, разве это название функции не является воплощением творчества?
И, черт возьми, давайте посмотрим на это последовательно:
def iterative_fuel_required(mass) fuel = fuel_required(mass) total_fuel = fuel until fuel <= 0 fuel = fuel_required(fuel) total_fuel += fuel end end
(итеративная функция отсутствует в репозитории github)
Больше мыслей
Заказ имеет значение
Я объединился с другим другом, у которого была идея, что это, возможно, можно оптимизировать, найдя сумму входных данных, а затем используя эту сумму в качестве входных данных для fuel_required
только один раз.
К сожалению, порядок операций имеет значение. То есть вычисление топлива, необходимого для каждого модуля, и последующее их суммирование приведут к другому ответу, чем суммирование модулей и последующее вычисление топлива, необходимого для суммы модулей.
Если кто-то помнит алгебру или даже часто вызывающую ужас PEMDAS, он может также вспомнить, что порядок имеет значение.
Например, 3 x 10 — 2
может привести к двум разным ответам в зависимости от того, выполняется ли сначала умножение или вычитание:
Выполнение умножения сначала означает, что 3 умножить на 10, что равно 30, минус 2 равно 28.
Вычитание сначала означает 10 минус 2, что равно 8, умножить на 3 равно 24.
Ради этого сообщения в блоге я не собираюсь глубоко погружаться в то, как мы можем использовать алгебру (или даже просто свойство распределения), чтобы мы могли выполнять суммирование модулей перед вычислением требуемого топлива, но даже если бы я мог объяснить Проще говоря, .floor
часть расчета делает это невозможным.
Должен ли я нырнуть глубоко здесь? Дайте мне знать, если у вас есть мысли!
Разное
Схема использования вывода одного в качестве входа другого напоминает мне о нейронах. Я прошел курс нейронауки восприятия и, основываясь на своих любительских исследованиях, думаю, что общий подход сверточных нейронных сетей очень похож на то, что мы знаем о зрительных системах млекопитающих. Что я знаю о конверсионных сетях? Ничего, кроме того, что представил Брэндон Рорер: Как работают сверточные нейронные сети
Также немного напоминает мне исчисление и все «по мере приближения к ‹значению›», но мы избавлены от необходимости заниматься этой математикой здесь, потому что мы очень сильно хотим.
Последние мысли (дальнейшие чтения)
Тема Reddit в 2019 году, день 1 — более 700 комментариев по состоянию на 31 января 2020 года; в основном решения, реализованные на разных языках, я еще не видел ничего особенно отличающегося или креативного, кроме тех, что написаны на малоизвестных языках, таких как Rockstar или это ванильное js-решение, которое буквально использует .innerText
Go/No Go Poll в Википедии — запуск вещей в космос
Базовые математические свойства, включая PEMDAS — с примерами и видео!
PS — Ваша замечательная компания набирает сотрудников? Дай мне знать! Я готов отказаться от funemployment.