47 lines
1.2 KiB
Elixir
47 lines
1.2 KiB
Elixir
defmodule Aoc2023.Day13 do
|
|
use Aoc2023
|
|
|
|
def parse(input) do
|
|
input
|
|
|> String.split("\n\n")
|
|
|> Enum.map(pipe(lines |> Enum.map(&String.to_charlist/1)))
|
|
end
|
|
|
|
defp reflected_row(block, smudges) do
|
|
0..(length(block) - 2)
|
|
|> Enum.filter(fn i ->
|
|
Enum.zip_with(
|
|
Enum.take(block, i + 1) |> Enum.reverse() |> Enum.concat(),
|
|
Enum.drop(block, i + 1) |> Enum.concat(),
|
|
&Kernel.==/2
|
|
)
|
|
|> Enum.count(&(not &1))
|
|
|> Kernel.==(smudges)
|
|
end)
|
|
|> head
|
|
end
|
|
|
|
defp reflected_column(block, smudges) do
|
|
block |> transpose() |> reflected_row(smudges)
|
|
end
|
|
|
|
defp reflection(block, smudges \\ 0) do
|
|
row = reflected_row(block, smudges)
|
|
if row != nil, do: {:h, row + 1}, else: {:v, reflected_column(block, smudges) + 1}
|
|
end
|
|
|
|
def part1(input) do
|
|
reflections = input |> Enum.map(&reflection/1)
|
|
|
|
(Keyword.get_values(reflections, :h) |> Enum.sum()) * 100 +
|
|
(Keyword.get_values(reflections, :v) |> Enum.sum())
|
|
end
|
|
|
|
def part2(input) do
|
|
reflections = input |> Enum.map(pipe(reflection(1)))
|
|
|
|
(Keyword.get_values(reflections, :h) |> Enum.sum()) * 100 +
|
|
(Keyword.get_values(reflections, :v) |> Enum.sum())
|
|
end
|
|
end
|