Advent of Code 2024 - Day 2
Mix.install([
{:kino_aoc, "~> 0.1"},
])
Section
{:ok, puzzle_input} =
KinoAOC.download_puzzle("2024", "2", System.fetch_env!("LB_AOC_SESSON_2024"))
defmodule Day02 do
def parse(input) do
input
|> String.split("\n", trim: true)
|> Enum.map(fn line ->
split = String.split(line)
Enum.map(split, fn s -> String.to_integer(s) end)
end)
end
def part1(input) do
Enum.count(input, &safe?/1)
end
def part2(input) do
Enum.count(input, &safe_variants?/1)
end
defp safe?([a, a | _]), do: false
defp safe?([a, b | rest]) do
multiplier = if b - a > 0, do: 1, else: -1
check_trend_consistency?([a, b | rest], multiplier)
end
defp check_trend_consistency?([_], _), do: true
defp check_trend_consistency?([a, b | rest], multiplier) do
((b - a) * multiplier) in 1..3 && check_trend_consistency?([b | rest], multiplier)
end
defp safe_variants?(list) do
subsets =
0..length(list)
|> Enum.map(&List.delete_at(list, &1))
safe?(list) || Enum.any?(subsets, &safe?/1)
end
end
Day02.parse(puzzle_input) |> Day02.part1()
Day02.parse(puzzle_input) |> Day02.part2()