Powered by AppSignal & Oban Pro

Advent of Code 2024 Day 4 Part 2

2024_day4_part2.livemd

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()