Powered by AppSignal & Oban Pro

Day 02

elixir/day02.livemd

Day 02

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])
input = Kino.Input.textarea("Problem input")

Part 1

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(&String.split(&1, " "))
|> Stream.map(fn
  ["forward", x] -> [String.to_integer(x), 0]
  ["down", x] -> [0, String.to_integer(x)]
  ["up", x] -> [0, -String.to_integer(x)]
end)
|> Enum.zip()
|> Enum.map(&Tuple.sum/1)
|> Enum.product()

Part 2

defmodule Recursion do
  def recur([head | tail]), do: recur(tail, head, [0, 0, 0])

  def recur([head | tail], ["forward", x], [h, d, a]),
    do: recur(tail, head, [h + x, d + a * x, a])

  def recur([head | tail], ["up", x], [h, d, a]), do: recur(tail, head, [h, d, a - x])
  def recur([head | tail], ["down", x], [h, d, a]), do: recur(tail, head, [h, d, a + x])
  def recur([], ["forward", x], [h, d, a]), do: recur([], [], [h + x, d + a * x, a])
  def recur([], _, [h, d, _a]), do: h * d
end
input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(&String.split(&1, " "))
|> Enum.map(fn [x, y] -> [x, String.to_integer(y)] end)
|> Recursion.recur()

Part 2 - reduce

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(&String.split(&1, " "))
|> Enum.map(fn [x, y] -> [x, String.to_integer(y)] end)
|> Enum.reduce({_h = 0, _d = 0, _a = 0}, fn
  ["forward", x], {h, d, a} -> {h + x, d + a * x, a}
  ["up", x], {h, d, a} -> {h, d, a - x}
  ["down", x], {h, d, a} -> {h, d, a + x}
end)
|> then(fn {h, d, _a} -> h * d end)