diff options
-rw-r--r-- | 2015/day10.exs | 4 | ||||
-rw-r--r-- | 2015/day11.exs | 87 |
2 files changed, 90 insertions, 1 deletions
diff --git a/2015/day10.exs b/2015/day10.exs index 384a15f..99673a5 100644 --- a/2015/day10.exs +++ b/2015/day10.exs @@ -1,8 +1,10 @@ start = File.read!("inputs/day10.txt") +digitRegex = ~r/(\d)\1*/ + lookAndSayStream = Stream.iterate(start, fn current -> - Regex.scan(~r/(\d)\1*/, current) + Regex.scan(digitRegex, current) |> Enum.map(fn [seq, _] -> length = String.length(seq) type = String.at(seq, 0) diff --git a/2015/day11.exs b/2015/day11.exs new file mode 100644 index 0000000..1801b00 --- /dev/null +++ b/2015/day11.exs @@ -0,0 +1,87 @@ +start = String.trim(File.read!("inputs/day11.txt")) + +startCharlist = String.to_charlist(start) +startNums = Enum.reverse(startCharlist) + +defmodule A do + def incrementPassword([head | tail]) do + if decreasingStraight?(tail) do + simpleIncrementPassword([head | tail]) + else + [second | _] = tail + + if head < second && second < ?z && !(second >= ?h && second <= ?n) do + [second + 1 | tail] + else + [?a | simpleIncrementPassword(tail)] + end + end + end + + def simpleIncrementPassword([?z | tail]) do + [?a | simpleIncrementPassword(tail)] + end + + def simpleIncrementPassword([?h | tail]) do + [?j | tail] + end + + def simpleIncrementPassword([?n | tail]) do + [?p | tail] + end + + def simpleIncrementPassword([?k | tail]) do + [?m | tail] + end + + def simpleIncrementPassword([head | tail]) do + [head + 1 | tail] + end + + def decreasingStraight?([]) do + false + end + + def decreasingStraight?([_]) do + false + end + + def decreasingStraight?([_, _]) do + false + end + + def decreasingStraight?([a, b, c | _]) when b === a - 1 and c === a - 2 do + true + end + + def decreasingStraight?([_ | tail]) do + decreasingStraight?(tail) + end + + def twoDifferentPairs?(list) do + differentPairs = + Enum.zip(list, Enum.drop(list, 1)) + |> Enum.flat_map(fn + {a, a} -> [a] + {_, _} -> [] + end) + |> Enum.dedup() + |> Enum.count() + + differentPairs >= 2 + end +end + +validPasswords = + Stream.iterate(startNums, &A.incrementPassword(&1)) + |> Stream.filter(fn password -> + A.decreasingStraight?(password) && + A.twoDifferentPairs?(password) + end) + +nextPasswords = + Enum.take(validPasswords, 2) + |> Enum.map(&Enum.reverse(&1)) + |> Enum.join("\n") + +IO.puts("New passwords:\n#{nextPasswords}") |