Day 5
This commit is contained in:
parent
8f639ecdcd
commit
ad64a23257
|
@ -0,0 +1,105 @@
|
|||
defmodule Day5 do
|
||||
|
||||
@doc """
|
||||
Compares two codepoints for opposite case.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> Day5.react('dabAcCaCBAcCcaDA')
|
||||
'dabCBAcaDA'
|
||||
|
||||
"""
|
||||
def react(chars) do
|
||||
chars
|
||||
|> Enum.reduce('', fn
|
||||
c, [prev | rest] = s ->
|
||||
if oppCase(c, prev) do
|
||||
rest
|
||||
else
|
||||
[c | s]
|
||||
end
|
||||
c, [] ->
|
||||
[c]
|
||||
end)
|
||||
|> Enum.reverse()
|
||||
|> case do
|
||||
^chars -> chars
|
||||
remaining -> react(remaining)
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Compares two codepoints for opposite case.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> Day5.oppCase(?a, ?A)
|
||||
true
|
||||
iex> Day5.oppCase(?A, ?a)
|
||||
true
|
||||
iex> Day5.oppCase(?A, ?A)
|
||||
false
|
||||
iex> Day5.oppCase(?B, ?A)
|
||||
false
|
||||
|
||||
"""
|
||||
def oppCase(c1, c2) do
|
||||
s1 = <<c1::utf8>>
|
||||
s2 = <<c2::utf8>>
|
||||
lower1 = String.downcase(s1)
|
||||
upper1 = String.upcase(s1)
|
||||
lower2 = String.downcase(s2)
|
||||
|
||||
cond do
|
||||
lower1 != lower2 -> false
|
||||
s1 == lower1 && s1 == s2 -> false
|
||||
s1 == upper1 && s1 == s2 -> false
|
||||
true -> true
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Compares two codepoints for opposite case.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> Day5.min_length("dabAcCaCBAcCcaDA")
|
||||
4
|
||||
|
||||
"""
|
||||
def min_length(input) do
|
||||
input
|
||||
|> String.downcase()
|
||||
|> String.to_charlist()
|
||||
|> Enum.uniq()
|
||||
|> Enum.map(fn c ->
|
||||
s = <<c::utf8>>
|
||||
str = String.replace(input, s, "")
|
||||
str = String.replace(str, String.upcase(s), "")
|
||||
input
|
||||
|> String.replace(s, "")
|
||||
|> String.replace(String.upcase(s), "")
|
||||
|> String.to_charlist()
|
||||
|> react()
|
||||
end)
|
||||
|> Enum.min_by(&length/1)
|
||||
|> length()
|
||||
end
|
||||
|
||||
def parse_input() do
|
||||
File.read!("lib/day5/input.txt")
|
||||
end
|
||||
|
||||
def part1() do
|
||||
parse_input()
|
||||
|> String.to_charlist()
|
||||
|> react()
|
||||
|> length()
|
||||
end
|
||||
|
||||
def part2() do
|
||||
parse_input()
|
||||
|> min_length()
|
||||
end
|
||||
|
||||
end
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,4 @@
|
|||
defmodule Day5Test do
|
||||
use ExUnit.Case
|
||||
doctest Day5
|
||||
end
|
Loading…
Reference in New Issue