this repo has no description
1<!-- vim:set ft=markdown: -->
2
3<!-- livebook:{"persist_outputs":true} -->
4
5# Day 11
6
7```elixir
8input =
9 File.read!("day11.txt")
10 |> String.split("\n")
11 |> Enum.map(&String.trim/1)
12 |> Enum.map(fn line ->
13 for <<c <- line>>, do: c - ?0
14 end)
15 |> Enum.with_index()
16 |> Enum.flat_map(fn {row, y} ->
17 for {v, x} <- Enum.with_index(row), do: {{x, y}, v}
18 end)
19 |> Map.new()
20
21defmodule Day11 do
22 def step(map) do
23 updated = Map.new(map, fn {k, v} -> {k, v + 1} end)
24
25 lightup(updated, 0)
26 end
27
28 @diffs for dx <- -1..1, dy <- -1..1, dx != 0 or dy != 0, do: {dx, dy}
29
30 def lightup(map, n) do
31 map
32 |> Enum.reduce({map, 0}, fn
33 {_, v}, acc when v < 10 ->
34 acc
35
36 {{x, y} = k, _}, {map, count} ->
37 new_map =
38 @diffs
39 |> Enum.reduce(map, fn {dx, dy}, acc ->
40 point = {x + dx, y + dy}
41
42 case Map.fetch(acc, point) do
43 {:ok, value} when value != 0 -> %{acc | point => value + 1}
44 _ -> acc
45 end
46 end)
47 |> Map.put(k, 0)
48
49 {new_map, count + 1}
50 end)
51 |> case do
52 {map, 0} -> {map, n}
53 {map, m} -> lightup(map, n + m)
54 end
55 end
56end
57```
58
59```output
60{:module, Day11, <<70, 79, 82, 49, 0, 0, 11, ...>>, {:lightup, 2}}
61```
62
63## Task 1
64
65```elixir
66draw = fn map ->
67 for x <- 0..9 do
68 IO.puts(for y <- 0..9, do: ?0 + map[{x, y}])
69 end
70
71 IO.puts("")
72end
73
741..100
75|> Enum.reduce({input, 0}, fn _, {map, n} ->
76 {new_map, m} = Day11.step(map)
77 {new_map, n + m}
78end)
79|> elem(1)
80```
81
82```output
831688
84```
85
86## Task 2
87
88```elixir
89Stream.unfold(1, &{&1, &1 + 1})
90|> Enum.reduce_while(input, fn idx, map ->
91 case Day11.step(map) do
92 {_, 100} -> {:halt, idx}
93 {next, _} -> {:cont, next}
94 end
95end)
96```
97
98```output
99403
100```