|
1 | 1 | defmodule Day3 do
|
2 |
| - def houses_covered(directions, start) do |
3 |
| - Enum.scan(directions, start, &where_to/2) |
| 2 | + # Part 1 entry |
| 3 | + def houses_covered_only_santa(directions, start) do |
| 4 | + houses_covered(directions, start) ++ [start] |
4 | 5 | |> Enum.uniq
|
5 | 6 | |> length
|
6 | 7 | end
|
7 | 8 |
|
8 |
| - def where_to(direction, house_number) do |
| 9 | + # Part 2 entry |
| 10 | + def houses_covered_with_robo(directions, start) do |
| 11 | + %{0 => santa_directions, 1 => robo_santa_directions} = Enum.with_index(directions) |
| 12 | + |> Enum.group_by(fn {_, index} -> rem(index,2) end) |
| 13 | + # Group by reversed the list so I reverse it back after pulling the direction out of the tuple |
| 14 | + santa_directions = Enum.map(santa_directions, fn {direction, _} -> direction end) |> Enum.reverse |
| 15 | + robo_santa_directions = Enum.map(robo_santa_directions, fn {direction, _} -> direction end) |> Enum.reverse |
| 16 | + |
| 17 | + houses_covered(santa_directions, start) ++ houses_covered(robo_santa_directions, start) ++ [start] |
| 18 | + |> Enum.uniq |
| 19 | + |> length |
| 20 | + end |
| 21 | + |
| 22 | + defp houses_covered(directions, start), do: Enum.scan(directions, start, &where_to/2) |
| 23 | + |
| 24 | + defp where_to(direction, house_number) do |
9 | 25 | {addX, addY} = case direction do
|
10 | 26 | ?^ -> {0, 1}
|
11 | 27 | ?v -> {0, -1}
|
12 | 28 | ?> -> {1, 0}
|
13 | 29 | ?< -> {-1, 0}
|
14 |
| - _ -> {0, 0} |
15 | 30 | end
|
16 | 31 | {x, y} = house_number
|
17 | 32 | {x + addX, y + addY}
|
|
20 | 35 |
|
21 | 36 | {:ok, input} = File.read("input/day3.txt")
|
22 | 37 | directions = to_char_list(input)
|
23 |
| -IO.inspect Day3.houses_covered(directions, {0, 0}) |
| 38 | +IO.inspect Day3.houses_covered_only_santa(directions, {0, 0}) |
| 39 | +IO.inspect Day3.houses_covered_with_robo(directions, {0, 0}) |
0 commit comments