Skip to content

Instantly share code, notes, and snippets.

@Gazler
Created December 6, 2018 15:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Gazler/bead3be2d4d0eaa62f640a45b721b526 to your computer and use it in GitHub Desktop.
Save Gazler/bead3be2d4d0eaa62f640a45b721b526 to your computer and use it in GitHub Desktop.
defmodule Advent2018.Day5 do
def solve(input) do
parse_polymers(input, <<>>, nil)
end
def parse_polymers(<<>>, acc, _), do: byte_size(acc)
def parse_polymers(
<<a::size(2), _::size(1), b::size(5), rest::binary>>,
seen,
<<a::size(2), _::size(1), b::size(5)>> = ignore
) do
parse_polymers(rest, seen, ignore)
end
def parse_polymers(<<a, rest::binary>>, <<b, seen::binary>>, ignore) when abs(a - b) == 32 do
parse_polymers(rest, seen, ignore)
end
def parse_polymers(<<a, b, rest::binary>>, seen, ignore) when abs(a - b) == 32 do
parse_polymers(rest, seen, ignore)
end
def parse_polymers(<<"\n", rest::binary>>, seen, ignore) do
parse_polymers(rest, seen, ignore)
end
def parse_polymers(<<a, rest::binary>>, seen, ignore) do
parse_polymers(rest, <<a>> <> seen, ignore)
end
end
defmodule Advent2018.Day5Part2 do
def solve(input) do
Enum.reduce(?a..?z, {nil, nil}, fn chr, {best, best_chr} ->
len = Advent2018.Day5.parse_polymers(input, <<>>, <<chr>>)
if !best || len < best do
{len, chr}
else
{best, best_chr}
end
end)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment