Advent of Code 2024 Day 4 Part 2
Mix.install([
{:kino_aoc, "~> 0.1"}
])
Get Inputs
{:ok, puzzle_input} =
KinoAOC.download_puzzle("2024", "4", System.fetch_env!("LB_SESSION"))
My answer
input =
"""
MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX
"""
turned_input =
input
|> String.trim()
|> String.split("\n")
|> Enum.with_index()
|> Enum.map(fn {row, index} ->
String.duplicate(".", index) <> row <> String.duplicate(".", String.length(row) - index - 1)
end)
|> Enum.map(&String.codepoints(&1))
|> Enum.zip()
|> Enum.map(fn col -> col |> Tuple.to_list() |> Enum.join() end)
|> Enum.join("\n")
IO.puts(turned_input)
turned_input
|> String.replace(~r/MAS/, "M+S")
|> String.replace(~r/SAM/, "S+M")
|> IO.puts()
output_a =
turned_input
|> String.replace(~r/MAS/, "M+S")
|> String.replace(~r/SAM/, "S+M")
|> String.split("\n")
|> Enum.map(&String.codepoints(&1))
|> Enum.zip()
|> Enum.map(fn col ->
col
|> Tuple.to_list()
|> Enum.join()
|> String.trim(".")
|> String.replace(~r/[A-Z]/, ".")
end)
output_a
|> Enum.join("\n")
|> IO.puts()
turn = fn input, direction ->
input
|> String.trim()
|> String.split("\n")
|> Enum.with_index()
|> Enum.map(fn {row, index} ->
case direction do
:left ->
String.duplicate(".", index) <> row <> String.duplicate(".", String.length(row) - index - 1)
_ ->
String.duplicate(".", String.length(row) - index - 1) <> row <> String.duplicate(".", index)
end
end)
|> Enum.map(&String.codepoints(&1))
|> Enum.zip()
|> Enum.map(fn col -> col |> Tuple.to_list() |> Enum.join() end)
|> Enum.join("\n")
end
replase_mas = fn turned_input ->
turned_input
|> String.replace(~r/MAS/, "M+S")
|> String.replace(~r/SAM/, "S+M")
|> String.split("\n")
|> Enum.map(&String.codepoints(&1))
|> Enum.zip()
|> Enum.map(fn col ->
col
|> Tuple.to_list()
|> Enum.join()
|> String.trim(".")
|> String.replace(~r/[A-Z]/, ".")
end)
end
output_b =
input
|> turn.(:right)
|> replase_mas.()
output_b
|> Enum.join("\n")
|> IO.puts()
Enum.zip(output_a, output_b)
|> Enum.map(fn {row_a, row_b} ->
Enum.zip(
String.codepoints(row_a),
String.codepoints(row_b)
)
|> Enum.count(fn ab -> ab == {"+", "+"} end)
end)
|> Enum.sum()
output_a =
puzzle_input
|> turn.(:left)
|> replase_mas.()
output_b =
puzzle_input
|> turn.(:right)
|> replase_mas.()
Enum.zip(output_a, output_b)
|> Enum.map(fn {row_a, row_b} ->
Enum.zip(
String.codepoints(row_a),
String.codepoints(row_b)
)
|> Enum.count(fn ab -> ab == {"+", "+"} end)
end)
|> Enum.sum()