55 lines
977 B
Markdown
55 lines
977 B
Markdown
# Day 2 AOC 2024
|
|
|
|
```elixir
|
|
Mix.install([
|
|
{:nx, "0.9.2"},
|
|
{:req, "0.5.8"}
|
|
])
|
|
```
|
|
|
|
## Section
|
|
|
|
|
|
|
|
```elixir
|
|
input = """
|
|
7 6 4 2 1
|
|
1 2 7 8 9
|
|
9 7 6 2 1
|
|
1 3 2 4 5
|
|
8 6 4 4 1
|
|
1 3 6 7 9
|
|
"""
|
|
```
|
|
|
|
```elixir
|
|
is_safe? = fn report ->
|
|
differences = report
|
|
|> Stream.chunk_every(2, 1, :discard)
|
|
|> Enum.map(fn [a, b] -> a - b end)
|
|
is_monotone? = differences |> Enum.all?(&(&1 < 0)) or differences |> Enum.all?(&(&1 > 0))
|
|
is_gradual? = differences |> Stream.map(&(abs(&1))) |> Enum.all?(&(&1 >= 1 and &1 <= 3))
|
|
is_monotone? and is_gradual?
|
|
end
|
|
```
|
|
|
|
```elixir
|
|
can_be_dampened? = fn report ->
|
|
Stream.with_index(report) |> Enum.any?(fn {_,i} ->
|
|
List.delete_at(report, i) |> is_safe?.()
|
|
end)
|
|
end
|
|
```
|
|
|
|
```elixir
|
|
for line <- input |> String.trim() |> String.split("\n") do
|
|
for c <- line |> String.split(" "),
|
|
c = c |> String.to_integer() do
|
|
c
|
|
end
|
|
end
|
|
|> Stream.filter(fn report ->
|
|
is_safe?.(report) # or can_be_dampened?.(report)
|
|
end)
|
|
|> Enum.count
|
|
```
|