мысли, решение, другие решения, вынос

Первоначальные мысли

Это читается как классическая задача из 5-го класса по математике.

Нет, я не имею в виду, что это легко или что людям должно быть плохо, если они не решат ее. Но я заметил кое-что новое в AOC: у нас есть дополнительная информация, информация, о которой нам не нужно знать, чтобы внедрить решение. (например, опрос Go/No Go или о том, что для запуска модулей требуется топливо)

Я вижу, как кто-то читает блок этого текста и чувствует себя заблокированным из-за непонимания контекста запуска ракет или того, на что похожа процедура, чувствует себя запуганным или даже потерянным в отношении того, почему все это имеет значение.

Это, безусловно, умение распознавать сигнал в шуме.

По иронии судьбы, я прихожу в AOC из-за «шума» — я хочу почувствовать себя супергероем, спасающим Рождество. Я бы не чувствовал себя так, если бы в AOC не было истории… :(

Решение: Часть 1

полный код здесь

Моя общая стратегия была такой:

  1. разобрать ввод в коллекцию (в моем случае массив)
  2. возьмите каждого члена коллекции и рассчитайте необходимое топливо
  3. суммировать необходимое топливо

Итак, я сделал свою функцию 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.