Created
December 7, 2017 21:43
-
-
Save MitjaBezensek/30a878329feac8ea88c067b9c51e840a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| defmodule Advent3 do | |
| def generate(lastNum, next_element_fn), do: generate({1, 0, 0}, %{{0, 0} => 1}, 0, 0, 0, 0, lastNum, "right", next_element_fn) | |
| def generate({num, x, y}, _, _, _, _, _, lastNum, _, _) when num >= lastNum do | |
| IO.inspect(abs(x) + abs(y)) | |
| IO.inspect(num) | |
| end | |
| def generate({num, x, y}, map, top, right, bottom, left, lastNum, "right", next_element_fn) do | |
| nextValue = next_element_fn.({num, x + 1, y}, map) | |
| nextElement = {nextValue, x + 1, y} | |
| map = Map.put(map, {x + 1, y}, nextValue) | |
| if(x + 1 > right) do | |
| generate(nextElement, map, top, right + 1, bottom, left, lastNum, "up", next_element_fn) | |
| else | |
| generate(nextElement, map, top, right, bottom, left, lastNum, "right", next_element_fn) | |
| end | |
| end | |
| def generate({num, x, y}, map, top, right, bottom, left, lastNum, "up", next_element_fn) do | |
| nextValue = next_element_fn.({num, x, y + 1}, map) | |
| nextElement = {nextValue, x, y + 1} | |
| map = Map.put(map, {x, y + 1}, nextValue) | |
| if(y + 1 > top) do | |
| generate(nextElement, map, top + 1, right, bottom, left, lastNum, "left", next_element_fn) | |
| else | |
| generate(nextElement, map, top, right, bottom, left, lastNum, "up", next_element_fn) | |
| end | |
| end | |
| def generate({num, x, y}, map, top, right, bottom, left, lastNum, "left", next_element_fn) do | |
| nextValue = next_element_fn.({num, x - 1, y}, map) | |
| nextElement = {nextValue, x - 1, y} | |
| map = Map.put(map, {x - 1, y}, nextValue) | |
| if(x - 1 < left) do | |
| generate(nextElement, map, top, right, bottom, left - 1, lastNum, "down", next_element_fn) | |
| else | |
| generate(nextElement, map, top, right, bottom, left, lastNum, "left", next_element_fn) | |
| end | |
| end | |
| def generate({num, x, y}, map, top, right, bottom, left, lastNum, "down", next_element_fn) do | |
| nextValue = next_element_fn.({num, x, y - 1}, map) | |
| nextElement = {nextValue, x, y - 1} | |
| map = Map.put(map, {x, y - 1}, nextValue) | |
| if(y - 1 < bottom) do | |
| generate(nextElement, map, top, right, bottom - 1, left, lastNum, "right", next_element_fn) | |
| else | |
| generate(nextElement, map, top, right, bottom, left, lastNum, "down", next_element_fn) | |
| end | |
| end | |
| def part1_next_element({num, _, _}, _), do: num + 1 | |
| def part2_next_element({num, x, y}, map) do | |
| Enum.sum( | |
| for x_offset <- -1..1, y_offset <- -1..1, {:ok, value} <- [Map.fetch(map, {x + x_offset, y + y_offset})] do | |
| value | |
| end | |
| ) | |
| end | |
| end | |
| Advent3.generate(368078, &Advent3.part1_next_element/2) | |
| Advent3.generate(368078, &Advent3.part2_next_element/2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment