Day - 13
Setup
Mix.install([
{:kino, "~> 0.4.1"},
{:vega_lite, "~> 0.1.1"}
])
alias VegaLite, as: Vl
input = Kino.Input.textarea("Please enter your Input")
[dots, folds] =
input
|> Kino.Input.read()
|> String.trim()
|> String.split("\n\n")
|> Enum.map(fn str -> String.split(str, "\n") end)
paper =
Enum.map(dots, fn dot ->
[x, y] = String.split(dot, ",")
{String.to_integer(x), String.to_integer(y)}
end)
folds =
Enum.map(folds, fn "fold along " <> fold ->
[dir, fold] = String.split(fold, "=")
{String.to_atom(dir), String.to_integer(fold)}
end)
folder = fn
:x, fold -> fn {x, y} -> {fold - abs(x - fold), y} end
:y, fold -> fn {x, y} -> {x, fold - abs(y - fold)} end
end
Part 1
folds
|> Enum.take(1)
|> Enum.reduce(paper, fn {dir, fold}, paper ->
paper
|> Enum.map(folder.(dir, fold))
|> Enum.uniq()
end)
|> length()
Part 2
folded =
Enum.reduce(folds, paper, fn {dir, fold}, paper ->
Enum.map(paper, folder.(dir, fold))
end)
{width, _} = Enum.max_by(folded, &elem(&1, 0))
{_, height} = Enum.max_by(folded, &elem(&1, 1))
grid = MapSet.new(folded)
for y <- 0..height do
for x <- 0..width do
if {x, y} in grid do
IO.write("# ")
else
IO.write(" ")
end
end
IO.puts("")
end