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