You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.2 KiB
Elixir
89 lines
2.2 KiB
Elixir
# 94154500 too low
|
|
|
|
defmodule Day14 do
|
|
def run do
|
|
robots =
|
|
File.read!("data.txt")
|
|
|> String.trim()
|
|
|> String.split("\n")
|
|
|> Enum.map(&parse_robot/1)
|
|
|
|
width = 101
|
|
height = 103
|
|
steps = 100
|
|
|
|
new_robots =
|
|
Enum.reduce(1..steps, robots, fn idx, acc ->
|
|
step(acc, {width, height})
|
|
end)
|
|
|
|
quads = [
|
|
Enum.filter(new_robots, fn r -> r.p.x < trunc(width / 2) and r.p.y < trunc(height / 2) end),
|
|
Enum.filter(new_robots, fn r -> r.p.x > trunc(width / 2) and r.p.y < trunc(height / 2) end),
|
|
Enum.filter(new_robots, fn r -> r.p.x < trunc(width / 2) and r.p.y > trunc(height / 2) end),
|
|
Enum.filter(new_robots, fn r -> r.p.x > trunc(width / 2) and r.p.y > trunc(height / 2) end)
|
|
]
|
|
|
|
part1 = Enum.map(quads, &length/1) |> Enum.reduce(1, &*/2)
|
|
dbg(part1)
|
|
|
|
# part 2, print until i guess i see a tree
|
|
Enum.reduce(1..100_000, robots, fn idx, acc ->
|
|
IO.puts(idx)
|
|
|
|
res = step(acc, {width, height})
|
|
|
|
# ok only print if we see something interesting like an empty corner?
|
|
if corner_block(res) do
|
|
render(res, {width, height})
|
|
end
|
|
|
|
res
|
|
end)
|
|
end
|
|
|
|
defp corner_block(robots) do
|
|
Enum.all?(0..10, fn col ->
|
|
Enum.all?(0..10, fn row ->
|
|
rs = Enum.filter(robots, fn %{p: %{x: x, y: y}} -> x == col and y == row end)
|
|
length(rs) == 0
|
|
end)
|
|
end)
|
|
end
|
|
|
|
defp render(robots, {width, height}) do
|
|
Enum.each(0..(height - 1), fn row ->
|
|
Enum.each(0..(width - 1), fn col ->
|
|
r = Enum.filter(robots, fn %{p: %{x: x, y: y}} -> x == col and y == row end) |> length
|
|
if r == 0, do: IO.write("."), else: IO.write(r)
|
|
end)
|
|
|
|
IO.write("\n")
|
|
end)
|
|
|
|
IO.write("\n\n\n\n\n")
|
|
Process.sleep(300)
|
|
IO.puts(IO.ANSI.clear())
|
|
|
|
robots
|
|
end
|
|
|
|
defp step(robots, {width, height}) do
|
|
Enum.map(robots, fn %{p: p, v: v} ->
|
|
x = Integer.mod(p.x + v.x, width)
|
|
y = Integer.mod(p.y + v.y, height)
|
|
%{p: %{x: x, y: y}, v: v}
|
|
end)
|
|
end
|
|
|
|
defp parse_robot(str) do
|
|
~r/p=(.+),(.+) v=(.+),(.+)/
|
|
|> Regex.run(str)
|
|
|> tl()
|
|
|> Enum.map(&String.to_integer/1)
|
|
|> (fn [a, b, c, d] -> %{p: %{x: a, y: b}, v: %{x: c, y: d}} end).()
|
|
end
|
|
end
|
|
|
|
Day14.run()
|