this repo has no description
at master 1.8 kB view raw
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```