Skip to content

Instantly share code, notes, and snippets.

@ynonp
Created December 18, 2020 11:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ynonp/edf640087c4d2f9eedd26a8e6f2f1764 to your computer and use it in GitHub Desktop.
Save ynonp/edf640087c4d2f9eedd26a8e6f2f1764 to your computer and use it in GitHub Desktop.
defmodule Day18 do
def read_input do
File.read!("input/day18.txt")
|> String.split("\n", trim: true)
end
def solve_part2(expr) do
cond do
String.contains?(expr, "(") ->
Regex.replace(~r/\(([^()]+)\)/, expr, fn _, expr -> solve_part2(expr) end)
|> solve_part2
String.contains?(expr, "+") ->
Regex.replace(~r/(\d+) \+ (\d+)/, expr, fn
_, op1, op2 -> Integer.to_string(String.to_integer(op1) + String.to_integer(op2))
end)
|> solve_part2
String.contains?(expr, "*") ->
Regex.replace(~r/(\d+) \* (\d+)/, expr, fn
_, op1, op2 -> Integer.to_string(String.to_integer(op1) * String.to_integer(op2))
end)
|> solve_part2
true -> expr
end
end
def solve_part1(expr) do
cond do
String.contains?(expr, "(") ->
Regex.replace(~r/\(([^()]+)\)/, expr, fn _, expr -> solve_part1(expr) end)
|> solve_part1
String.match?(expr, ~r/^(\d+) \+ (\d+)/) ->
Regex.replace(~r/^(\d+) \+ (\d+)/, expr, fn
_, op1, op2 -> Integer.to_string(String.to_integer(op1) + String.to_integer(op2))
end)
|> solve_part1
String.match?(expr, ~r/^(\d+) \* (\d+)/) ->
Regex.replace(~r/^(\d+) \* (\d+)/, expr, fn
_, op1, op2 -> Integer.to_string(String.to_integer(op1) * String.to_integer(op2))
end)
|> solve_part1
true -> expr
end
end
def part1 do
read_input()
|> Enum.map(&solve_part1/1)
|> Enum.map(&String.to_integer/1)
|> Enum.sum
|> IO.inspect
end
def part2 do
read_input()
|> Enum.map(&solve_part2/1)
|> Enum.map(&String.to_integer/1)
|> Enum.sum
|> IO.inspect
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment