diff --git a/.dir-locals.el b/.dir-locals.el index 1979e53..98e4ff8 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -5,3 +5,5 @@ (intero-targets "adventofcode:lib" "adventofcode:exe:adventofcode-exe" "adventofcode:test:adventofcode-test"))) + + diff --git a/adventofcode.cabal b/adventofcode.cabal index ab4b735..b3ce6c6 100644 --- a/adventofcode.cabal +++ b/adventofcode.cabal @@ -38,6 +38,7 @@ library Day08 Day09 Day10 + Day11 other-modules: Paths_adventofcode build-depends: diff --git a/app/Main.hs b/app/Main.hs index db88af5..6369a14 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -16,6 +16,7 @@ import qualified Day07 import qualified Day08 import qualified Day09 import qualified Day10 +import qualified Day11 showSol :: [Char] -> Doc -> IO () showSol txt d = putText . toS . render $ @@ -37,6 +38,7 @@ solutions = Map.fromList [(["01"], day01) ,(["08"], day08) ,(["09"], day09) ,(["10"], day10) + ,(["11"], day11) ] day01 :: IO () @@ -105,3 +107,10 @@ day10 = do showSol "Solution 1" (int sol1) input2 <- Day10.parseInput2 showSol "Solution 2" (text (toS (Day10.solution2 input2))) + +day11 :: IO () +day11 = do + putText "Day 11:" + input <- Day11.parseInput + let sol1 = Day11.solution1 input + showSol "Solution 1" (int sol1) diff --git a/inputs/day11.txt b/inputs/day11.txt new file mode 100644 index 0000000..1cdbd36 --- /dev/null +++ b/inputs/day11.txt @@ -0,0 +1 @@ +ne,n,n,nw,nw,nw,nw,sw,nw,nw,s,sw,sw,sw,s,n,sw,s,s,s,s,se,se,s,s,se,s,s,se,se,se,nw,s,se,n,se,s,se,se,se,se,se,se,nw,n,se,nw,ne,ne,ne,se,ne,se,ne,ne,ne,ne,ne,ne,nw,ne,n,ne,sw,s,ne,ne,se,n,n,n,ne,nw,ne,ne,n,n,n,n,n,n,n,n,n,n,n,ne,n,se,n,n,n,n,ne,nw,n,s,n,nw,n,n,n,n,sw,n,n,nw,n,sw,n,nw,n,n,n,nw,sw,n,sw,n,nw,n,n,ne,sw,n,nw,se,sw,sw,nw,n,nw,n,n,nw,n,n,nw,nw,nw,n,nw,n,nw,nw,nw,nw,nw,nw,s,nw,nw,nw,ne,nw,sw,s,sw,nw,nw,nw,nw,nw,sw,sw,ne,sw,sw,nw,sw,nw,sw,n,nw,nw,se,n,nw,nw,n,sw,s,sw,nw,nw,nw,sw,sw,sw,nw,sw,sw,nw,nw,sw,nw,sw,sw,n,sw,sw,sw,nw,s,n,n,nw,sw,n,sw,sw,nw,sw,sw,sw,n,sw,se,sw,sw,sw,nw,se,sw,sw,sw,sw,nw,sw,n,sw,sw,sw,s,sw,sw,s,se,n,se,s,sw,sw,sw,sw,se,s,s,sw,sw,sw,sw,n,sw,sw,sw,sw,s,s,sw,sw,ne,sw,ne,sw,s,sw,sw,sw,s,s,s,sw,s,se,s,ne,s,s,s,ne,sw,s,s,s,s,s,s,s,s,s,ne,s,s,s,s,s,s,s,s,nw,s,s,sw,s,n,s,sw,s,s,s,n,s,s,n,se,s,s,s,s,s,s,s,ne,s,nw,sw,s,s,n,ne,s,s,s,se,n,s,nw,sw,se,s,s,s,s,s,s,ne,s,ne,se,s,s,n,s,n,s,s,s,s,s,s,s,se,n,ne,nw,ne,s,nw,s,s,s,s,nw,nw,se,s,s,se,se,s,s,s,s,s,s,s,se,se,se,nw,s,s,se,s,s,se,se,se,s,se,se,se,s,s,se,s,n,se,ne,s,s,se,se,s,se,sw,sw,se,ne,se,s,se,s,ne,se,se,s,se,se,ne,nw,se,s,se,se,s,se,s,se,s,sw,se,se,s,sw,s,se,se,s,s,se,se,se,nw,se,se,n,s,se,ne,se,se,se,se,se,se,se,se,se,se,n,s,se,se,sw,se,se,sw,ne,se,se,se,se,se,se,se,se,se,se,se,n,n,se,se,se,se,se,se,se,se,se,se,se,ne,se,se,sw,ne,se,se,se,se,se,se,ne,se,se,se,se,ne,se,se,sw,ne,se,sw,ne,ne,n,se,se,ne,se,s,sw,ne,se,se,se,se,se,se,se,ne,se,se,n,ne,ne,sw,sw,ne,s,ne,se,se,se,s,ne,s,sw,se,se,se,se,ne,n,se,nw,se,ne,ne,se,ne,se,se,ne,se,se,ne,nw,ne,se,ne,ne,ne,se,se,se,ne,se,sw,ne,se,nw,se,ne,ne,ne,se,ne,ne,n,nw,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,ne,sw,se,ne,se,ne,sw,ne,n,ne,s,ne,se,ne,ne,ne,se,sw,ne,s,se,sw,ne,ne,ne,ne,ne,ne,ne,ne,se,s,s,sw,ne,ne,ne,ne,nw,ne,ne,se,ne,ne,nw,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,sw,ne,ne,ne,ne,ne,se,ne,ne,ne,ne,ne,se,ne,nw,ne,ne,nw,sw,ne,ne,ne,ne,s,s,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,n,ne,ne,ne,n,nw,ne,ne,n,ne,ne,ne,n,ne,ne,n,ne,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,n,nw,ne,ne,ne,n,n,n,ne,ne,ne,ne,ne,ne,ne,n,ne,ne,n,ne,n,ne,ne,ne,n,n,sw,ne,ne,n,ne,ne,ne,ne,ne,ne,n,se,s,ne,ne,se,nw,s,ne,n,ne,n,ne,n,ne,n,ne,sw,ne,n,ne,n,ne,ne,s,s,se,ne,se,n,ne,se,n,n,ne,ne,nw,ne,n,n,ne,ne,ne,ne,ne,ne,ne,ne,n,n,n,n,ne,ne,n,n,ne,n,sw,n,ne,sw,ne,n,n,ne,s,n,s,n,ne,se,ne,n,s,n,ne,n,ne,n,ne,ne,n,n,ne,nw,n,n,n,ne,se,n,n,n,ne,n,n,ne,ne,ne,n,n,ne,nw,ne,ne,n,n,ne,n,n,s,n,ne,n,ne,n,n,n,n,ne,n,ne,n,n,n,ne,s,sw,sw,ne,n,n,n,n,n,n,n,ne,nw,n,ne,n,n,sw,n,n,n,ne,n,n,n,n,n,ne,n,s,n,ne,n,ne,ne,n,s,n,nw,n,n,s,se,n,n,n,n,n,se,se,n,n,n,n,n,nw,n,se,n,n,n,n,n,se,n,n,n,se,n,se,n,n,n,n,ne,n,n,ne,n,nw,n,n,n,n,n,n,nw,sw,n,nw,n,nw,n,n,n,nw,n,n,n,nw,n,n,ne,sw,n,n,n,nw,se,n,n,n,ne,n,s,n,n,n,ne,nw,se,n,n,n,nw,n,n,n,nw,n,n,n,n,n,sw,n,n,n,n,n,n,se,ne,nw,n,sw,se,n,sw,n,nw,n,n,sw,n,n,nw,ne,n,s,nw,n,n,n,n,s,ne,nw,n,nw,n,n,sw,n,nw,n,n,nw,n,n,nw,n,n,n,s,n,n,n,nw,nw,n,n,n,nw,n,nw,nw,n,nw,se,sw,se,nw,n,n,n,n,nw,n,n,sw,nw,n,nw,nw,n,n,n,nw,n,nw,n,n,n,n,nw,n,n,nw,nw,sw,n,nw,n,nw,n,n,n,s,nw,n,n,nw,ne,sw,n,ne,nw,n,n,n,n,se,nw,nw,n,nw,nw,s,n,nw,nw,nw,n,n,sw,nw,nw,ne,se,nw,nw,s,nw,nw,nw,nw,sw,s,n,nw,nw,n,nw,nw,nw,nw,nw,se,nw,s,nw,nw,n,n,se,n,nw,n,n,n,nw,ne,nw,nw,n,nw,n,nw,n,nw,nw,ne,se,nw,nw,nw,s,nw,sw,n,nw,nw,n,n,se,ne,nw,n,n,s,n,nw,nw,n,nw,n,sw,s,nw,nw,nw,n,ne,nw,nw,n,se,n,nw,s,nw,nw,n,se,n,n,se,n,ne,nw,ne,nw,s,nw,nw,nw,nw,nw,nw,n,n,nw,nw,se,nw,n,n,nw,nw,ne,n,nw,n,s,nw,n,nw,sw,n,nw,nw,nw,nw,n,s,n,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,n,n,ne,nw,nw,nw,nw,n,nw,nw,nw,n,nw,ne,nw,n,nw,n,nw,nw,nw,nw,se,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,s,nw,s,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,ne,nw,nw,nw,nw,nw,se,nw,s,nw,ne,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,se,nw,nw,nw,nw,se,nw,nw,s,nw,n,ne,nw,nw,nw,nw,nw,nw,nw,s,nw,nw,nw,nw,nw,nw,sw,s,nw,sw,nw,nw,nw,nw,nw,nw,sw,ne,nw,sw,nw,nw,nw,sw,nw,sw,nw,nw,nw,nw,ne,sw,nw,sw,nw,nw,ne,sw,nw,nw,nw,nw,nw,nw,nw,se,se,n,nw,nw,nw,nw,nw,nw,se,nw,sw,sw,nw,nw,sw,nw,nw,sw,nw,nw,nw,sw,nw,nw,nw,nw,n,ne,ne,nw,sw,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,sw,nw,nw,sw,sw,nw,nw,sw,nw,nw,n,sw,sw,nw,nw,se,nw,sw,nw,sw,nw,sw,nw,nw,nw,nw,sw,nw,sw,se,ne,ne,nw,se,s,nw,sw,n,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,sw,s,sw,sw,n,nw,nw,ne,sw,nw,nw,nw,sw,nw,sw,nw,se,nw,ne,nw,nw,nw,n,nw,se,nw,nw,nw,ne,nw,nw,nw,nw,sw,s,sw,nw,nw,sw,se,n,sw,n,sw,nw,sw,sw,sw,nw,nw,nw,sw,nw,nw,n,nw,n,sw,ne,nw,se,nw,nw,nw,nw,nw,sw,nw,sw,nw,nw,nw,sw,s,nw,sw,s,nw,sw,sw,sw,sw,s,n,nw,sw,nw,sw,ne,s,sw,n,nw,nw,nw,nw,nw,nw,sw,sw,nw,nw,sw,sw,sw,nw,nw,sw,sw,ne,n,nw,nw,n,s,nw,nw,sw,se,nw,nw,sw,nw,nw,se,nw,nw,sw,sw,nw,ne,nw,nw,se,nw,sw,sw,nw,ne,sw,nw,nw,sw,nw,sw,nw,sw,nw,sw,sw,sw,sw,nw,sw,nw,sw,s,nw,sw,nw,sw,sw,sw,nw,nw,nw,nw,s,sw,nw,sw,nw,ne,sw,nw,nw,s,nw,sw,nw,sw,sw,sw,se,nw,sw,nw,sw,sw,sw,nw,sw,nw,sw,sw,nw,nw,sw,sw,sw,nw,nw,ne,nw,s,sw,sw,ne,n,sw,sw,nw,n,sw,nw,sw,sw,ne,ne,nw,sw,nw,sw,n,sw,sw,s,sw,sw,s,sw,se,sw,se,sw,sw,sw,nw,sw,sw,sw,se,sw,sw,sw,sw,sw,n,sw,sw,nw,sw,nw,nw,sw,nw,se,s,sw,sw,sw,s,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,nw,ne,sw,sw,nw,sw,s,s,sw,sw,nw,nw,nw,sw,sw,ne,sw,sw,se,sw,sw,nw,nw,se,sw,sw,sw,sw,sw,sw,n,sw,sw,nw,sw,ne,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,sw,n,sw,sw,sw,nw,sw,sw,nw,n,sw,n,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,sw,se,s,sw,se,sw,ne,nw,n,sw,se,sw,se,sw,se,sw,ne,sw,sw,se,n,sw,ne,sw,sw,s,sw,ne,nw,se,s,se,sw,sw,sw,sw,sw,sw,se,sw,s,se,sw,s,sw,sw,sw,se,sw,sw,sw,sw,nw,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,ne,n,sw,nw,sw,ne,se,sw,ne,sw,sw,sw,sw,n,sw,ne,sw,sw,ne,sw,sw,s,sw,ne,s,ne,sw,se,n,ne,s,sw,sw,sw,sw,s,sw,sw,sw,s,sw,s,sw,sw,sw,s,sw,sw,sw,sw,sw,nw,sw,s,sw,sw,s,sw,sw,sw,sw,s,sw,sw,n,n,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,sw,sw,sw,s,sw,sw,s,nw,sw,sw,sw,sw,sw,sw,se,sw,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,s,sw,sw,n,ne,sw,ne,s,nw,n,sw,sw,n,nw,sw,sw,sw,ne,nw,n,sw,sw,ne,ne,s,sw,sw,se,sw,sw,sw,sw,sw,s,s,sw,ne,s,s,s,sw,nw,sw,s,sw,sw,s,s,sw,sw,se,ne,s,s,n,s,s,sw,n,sw,sw,sw,sw,sw,n,s,sw,sw,se,ne,sw,sw,nw,s,sw,s,sw,sw,s,nw,s,n,sw,s,n,s,sw,sw,sw,s,sw,sw,se,nw,sw,sw,se,sw,s,ne,s,sw,s,sw,nw,sw,sw,n,s,s,n,sw,sw,sw,sw,s,se,sw,s,s,sw,sw,s,s,s,s,s,sw,s,s,s,sw,ne,sw,sw,sw,sw,sw,sw,s,sw,nw,sw,sw,s,sw,sw,s,s,sw,s,s,s,s,sw,s,sw,s,nw,s,sw,sw,s,sw,sw,sw,sw,ne,sw,n,sw,s,s,s,sw,sw,sw,n,sw,se,s,sw,s,sw,sw,sw,s,sw,n,nw,se,sw,se,s,s,ne,s,nw,s,s,n,s,sw,sw,sw,sw,s,sw,sw,sw,se,s,s,nw,s,se,sw,sw,s,s,sw,s,s,sw,sw,s,sw,n,nw,sw,sw,sw,sw,s,sw,s,sw,sw,s,s,ne,s,se,sw,sw,s,sw,s,sw,s,sw,s,s,s,s,s,ne,sw,s,sw,nw,sw,s,sw,s,se,ne,nw,s,s,s,n,sw,sw,sw,s,s,sw,n,sw,sw,s,s,s,s,s,nw,sw,s,sw,n,n,s,sw,sw,s,sw,sw,sw,s,sw,n,n,se,s,s,s,sw,se,sw,s,sw,s,se,sw,sw,sw,sw,sw,n,s,sw,nw,ne,sw,s,s,s,se,s,s,sw,sw,ne,s,s,s,s,s,sw,s,sw,sw,n,sw,se,sw,sw,sw,n,sw,s,s,s,s,sw,s,s,s,sw,s,sw,sw,nw,se,sw,s,sw,s,sw,nw,s,sw,se,sw,n,s,nw,s,s,s,sw,sw,sw,s,s,s,s,sw,sw,s,s,s,s,nw,ne,s,sw,s,sw,s,sw,ne,s,s,s,n,n,s,s,nw,s,s,nw,s,s,s,n,s,s,s,sw,s,sw,s,n,s,sw,s,s,sw,s,sw,s,sw,se,s,s,s,s,ne,s,s,sw,s,s,s,sw,n,s,s,s,s,nw,s,s,sw,s,s,sw,sw,se,s,sw,sw,sw,se,se,s,sw,s,nw,ne,sw,s,ne,sw,sw,s,s,s,s,s,s,nw,s,ne,s,sw,s,s,sw,s,sw,s,s,s,s,sw,sw,se,s,se,sw,s,sw,s,s,s,s,s,sw,s,s,s,sw,s,s,sw,sw,s,s,sw,sw,s,n,s,sw,sw,s,s,sw,sw,s,s,s,sw,s,sw,s,sw,s,s,sw,s,s,s,s,sw,s,s,n,s,se,se,s,n,s,s,sw,sw,s,s,s,n,s,s,s,s,s,s,sw,n,s,s,s,ne,s,n,sw,s,s,s,s,s,s,sw,s,s,s,nw,s,sw,s,s,s,s,s,sw,nw,s,s,sw,s,s,s,sw,s,ne,s,s,s,s,s,s,s,s,s,s,se,s,s,s,s,sw,s,s,s,sw,s,s,s,s,s,s,n,s,s,s,s,s,s,s,s,s,s,sw,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,se,s,s,s,s,s,s,ne,s,s,s,s,nw,s,s,se,s,s,s,se,s,s,s,sw,s,s,sw,s,s,s,nw,s,s,ne,s,s,s,ne,s,se,s,s,se,s,s,s,s,ne,s,sw,sw,s,sw,ne,s,nw,s,s,s,s,s,s,s,s,s,s,s,s,se,s,s,s,s,sw,s,sw,s,s,s,s,s,se,s,s,ne,s,sw,sw,s,s,sw,sw,s,s,s,se,se,sw,s,s,ne,s,n,s,ne,nw,s,s,s,s,se,se,s,s,s,s,s,ne,s,s,s,s,ne,s,s,s,s,se,s,s,se,s,s,se,s,s,s,s,s,se,s,nw,n,ne,s,s,s,sw,s,ne,s,sw,s,nw,s,se,s,n,s,s,ne,sw,s,s,s,s,se,s,s,s,nw,s,s,s,s,s,se,s,s,sw,s,s,s,s,s,s,s,s,se,s,s,s,n,n,se,s,se,s,se,s,s,s,s,nw,s,s,s,s,ne,s,s,s,s,s,s,se,s,sw,s,ne,s,nw,s,s,s,s,s,se,s,s,se,se,s,s,se,s,s,s,se,s,sw,sw,s,n,s,s,s,s,s,n,n,s,s,s,s,s,s,s,se,n,s,s,se,ne,nw,s,nw,se,s,n,s,s,s,se,s,ne,se,s,s,s,n,s,nw,ne,sw,se,s,s,s,n,se,s,se,se,s,s,s,se,nw,sw,s,s,se,s,se,s,s,se,se,se,s,se,s,s,s,sw,s,se,s,s,s,s,s,se,s,n,s,s,s,ne,sw,se,sw,s,s,s,s,s,s,nw,se,s,s,nw,se,s,s,s,se,se,n,sw,sw,se,ne,s,n,s,ne,nw,s,n,ne,se,nw,nw,s,s,se,s,s,s,se,sw,se,s,s,se,s,ne,se,se,nw,se,s,s,s,n,s,ne,s,se,s,se,se,s,s,s,se,s,se,n,s,n,s,s,s,se,se,se,sw,se,s,se,sw,se,n,s,s,ne,s,s,se,ne,s,n,se,se,s,s,se,s,s,s,s,s,s,s,se,n,s,s,s,se,n,se,se,s,n,s,s,se,s,sw,se,ne,s,s,s,s,sw,se,s,s,s,s,s,sw,s,ne,se,s,se,s,se,sw,s,se,s,s,se,s,s,s,se,n,n,n,nw,s,s,s,s,sw,nw,se,se,n,sw,se,s,s,ne,sw,s,se,s,nw,s,se,s,se,se,s,se,s,s,s,s,ne,s,s,s,nw,se,se,ne,se,se,se,se,se,s,s,s,s,s,se,s,n,se,se,se,se,se,nw,se,s,s,se,s,s,s,s,s,s,se,se,se,s,se,se,ne,s,n,s,s,s,se,se,s,s,ne,se,s,se,se,se,ne,s,se,s,se,se,s,se,se,s,s,se,ne,s,se,se,se,se,s,se,se,se,sw,se,se,s,se,s,se,se,s,s,se,ne,n,sw,s,s,n,se,nw,s,se,s,se,se,se,se,n,se,s,sw,s,se,s,se,s,nw,se,s,se,s,se,s,se,s,se,se,se,s,se,se,s,se,se,se,nw,sw,sw,s,se,se,se,s,ne,se,nw,ne,ne,s,sw,sw,s,se,se,s,se,se,se,se,s,se,sw,nw,nw,s,se,s,se,s,n,se,se,se,se,s,ne,se,se,se,se,s,sw,nw,sw,s,se,se,s,s,n,se,sw,ne,se,se,n,se,sw,sw,ne,s,s,s,se,se,s,se,sw,s,se,s,se,se,n,s,se,s,nw,se,s,n,nw,se,sw,se,se,se,se,se,se,se,s,s,s,s,se,n,se,s,se,se,s,se,se,se,se,s,s,s,s,s,se,sw,se,se,se,s,se,s,se,se,s,se,se,se,sw,se,s,se,s,s,se,se,n,se,se,s,se,s,se,se,se,s,ne,se,se,s,se,se,ne,nw,sw,se,ne,s,se,se,se,sw,s,s,s,se,se,se,ne,se,s,se,s,s,se,se,n,se,s,se,se,se,s,ne,se,se,sw,s,se,s,se,s,se,se,s,s,sw,se,s,se,se,s,se,s,se,ne,se,se,s,se,se,se,se,ne,se,se,se,s,s,se,s,se,se,se,n,se,se,s,s,se,s,se,se,se,se,nw,se,se,ne,se,se,se,se,se,s,se,se,sw,se,s,s,n,s,se,se,s,nw,s,se,se,se,sw,se,s,se,se,se,se,se,se,nw,se,se,s,se,se,s,s,s,se,sw,n,se,se,ne,s,se,se,sw,se,s,se,se,se,se,s,se,nw,s,se,se,s,sw,ne,se,s,se,se,se,s,se,s,se,se,se,n,se,se,se,s,se,se,se,se,se,se,ne,se,se,nw,se,se,n,se,se,ne,se,se,se,se,se,sw,s,s,se,se,sw,se,n,n,s,se,s,se,se,ne,se,se,ne,se,se,nw,se,n,ne,se,se,sw,se,se,se,se,sw,s,s,se,se,se,n,se,s,n,se,se,se,s,se,s,se,se,se,se,se,se,se,se,se,se,se,se,se,ne,s,se,se,se,se,se,ne,se,se,n,s,se,se,n,se,se,se,se,se,se,se,se,se,s,se,se,se,se,se,se,n,se,se,se,se,se,se,se,se,se,se,se,se,se,se,ne,se,se,se,se,se,se,sw,sw,se,nw,se,sw,se,se,se,nw,se,se,se,s,se,se,se,se,ne,se,n,se,se,se,se,se,se,se,sw,se,s,nw,se,se,s,se,se,se,se,s,ne,se,se,se,se,ne,se,se,se,se,se,se,se,se,se,se,s,se,n,se,se,se,se,se,se,se,ne,se,s,se,se,se,se,s,se,se,se,se,sw,se,se,se,se,se,se,nw,se,se,se,nw,se,se,se,se,se,se,sw,se,sw,se,nw,se,se,se,ne,se,se,se,se,se,se,se,s,se,se,s,se,se,se,se,se,se,s,se,s,se,se,se,se,sw,sw,ne,se,ne,se,se,se,se,se,se,se,n,se,se,se,se,se,se,s,se,se,se,se,se,se,ne,se,se,ne,se,sw,se,se,se,se,sw,se,se,se,se,se,se,se,se,se,ne,se,se,se,se,se,se,se,sw,ne,n,ne,nw,se,n,se,ne,se,sw,se,se,se,ne,nw,nw,se,ne,se,se,se,ne,se,ne,se,ne,s,se,se,se,nw,se,se,se,s,ne,s,se,se,nw,se,se,se,sw,ne,se,s,se,se,se,se,nw,nw,se,s,ne,s,ne,se,se,se,s,sw,ne,sw,se,se,se,se,se,se,se,se,ne,se,se,se,sw,se,se,se,ne,se,se,se,se,se,n,se,se,s,se,se,se,se,se,ne,sw,se,ne,se,se,se,se,se,se,se,ne,se,se,se,se,sw,nw,se,ne,ne,ne,ne,se,se,se,se,ne,se,se,n,n,ne,s,ne,se,se,se,ne,se,se,se,se,se,ne,se,n,ne,se,ne,se,n,se,se,se,se,n,ne,se,ne,ne,se,s,sw,se,n,n,se,se,se,se,s,n,se,se,se,nw,se,ne,se,nw,se,n,ne,se,se,se,se,sw,se,se,sw,n,se,ne,se,se,ne,se,se,se,se,se,se,ne,ne,se,n,ne,ne,se,se,se,nw,se,n,se,se,se,se,nw,se,ne,sw,se,ne,se,se,se,se,se,ne,se,se,se,se,n,se,se,se,ne,s,se,ne,sw,nw,se,ne,se,se,se,se,se,sw,sw,ne,se,se,ne,se,ne,se,ne,se,sw,se,n,se,n,s,se,se,se,ne,se,sw,se,nw,se,ne,nw,n,se,sw,se,ne,n,se,se,se,se,ne,ne,ne,se,se,nw,ne,ne,se,se,se,ne,se,se,se,nw,se,s,ne,se,se,nw,ne,ne,ne,se,se,nw,ne,se,se,se,nw,se,s,ne,se,sw,se,se,sw,se,nw,se,s,se,se,se,se,se,se,se,se,sw,se,s,se,se,se,n,se,sw,se,se,se,se,se,sw,ne,ne,se,sw,nw,s,ne,ne,s,ne,ne,se,ne,ne,ne,se,ne,se,ne,ne,ne,nw,se,n,se,n,ne,se,ne,se,ne,ne,ne,se,nw,se,se,n,se,se,se,n,sw,ne,ne,se,ne,se,se,se,se,nw,se,ne,se,s,se,ne,s,se,ne,ne,s,ne,nw,se,nw,ne,se,se,se,n,ne,se,se,se,se,se,s,se,se,se,sw,n,se,se,se,se,ne,ne,ne,ne,ne,ne,ne,se,nw,se,sw,se,se,se,n,se,se,se,se,se,sw,sw,ne,sw,se,ne,ne,n,se,ne,se,ne,ne,se,ne,se,ne,s,se,ne,ne,se,ne,ne,ne,ne,s,n,ne,ne,s,ne,nw,sw,se,ne,s,ne,ne,ne,se,se,se,s,se,se,se,ne,sw,nw,se,ne,se,sw,sw,nw,ne,se,se,ne,s,se,ne,se,se,n,se,ne,se,se,ne,ne,se,se,se,nw,se,nw,se,ne,ne,ne,n,ne,se,s,se,se,ne,se,ne,se,ne,se,ne,n,nw,ne,ne,ne,ne,ne,se,n,nw,sw,se,ne,sw,ne,se,se,ne,nw,ne,se,ne,ne,ne,ne,n,ne,se,sw,ne,se,ne,se,se,n,se,se,se,ne,ne,nw,se,s,se,nw,ne,ne,nw,se,ne,s,se,ne,ne,ne,nw,ne,ne,ne,se,se,sw,sw,se,ne,n,ne,nw,se,se,se,ne,ne,ne,s,sw,ne,se,se,ne,se,se,ne,se,ne,se,se,sw,se,se,se,se,se,n,se,ne,ne,se,nw,ne,sw,se,n,se,ne,nw,se,ne,s,se,ne,ne,sw,ne,ne,se,ne,se,ne,se,ne,ne,ne,se,se,ne,se,se,nw,ne,ne,se,sw,se,se,s,ne,ne,se,se,s,se,n,ne,se,se,nw,nw,se,se,se,ne,ne,ne,ne,n,se,se,se,ne,ne,ne,ne,ne,ne,se,se,se,sw,ne,se,ne,ne,ne,ne,se,se,se,se,nw,sw,ne,ne,ne,s,s,ne,se,se,ne,sw,ne,ne,se,se,se,ne,ne,nw,se,se,se,se,se,se,ne,se,se,se,se,se,se,ne,ne,ne,ne,ne,se,se,n,se,ne,se,nw,se,se,se,ne,ne,ne,se,se,ne,ne,ne,se,se,sw,se,ne,ne,nw,ne,ne,se,ne,sw,ne,se,se,ne,ne,ne,ne,se,se,se,ne,ne,sw,se,nw,se,ne,s,ne,nw,se,ne,ne,se,ne,ne,se,s,ne,ne,se,se,se,se,s,ne,s,se,ne,n,ne,n,ne,s,ne,se,sw,ne,se,se,ne,se,ne,ne,se,se,se,ne,ne,ne,ne,se,nw,se,ne,se,ne,se,sw,ne,se,ne,ne,sw,ne,ne,ne,nw,se,ne,ne,se,se,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,sw,n,se,se,sw,ne,ne,ne,ne,se,ne,ne,se,se,se,ne,s,ne,s,ne,nw,n,s,se,se,ne,ne,ne,s,se,n,ne,n,ne,se,se,ne,se,ne,ne,se,ne,ne,se,nw,ne,ne,n,se,ne,ne,ne,ne,ne,ne,sw,se,ne,ne,nw,ne,ne,ne,se,ne,se,s,se,ne,nw,ne,se,ne,se,s,sw,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,se,ne,ne,n,ne,ne,ne,ne,ne,ne,se,ne,s,ne,se,se,ne,se,n,se,ne,se,ne,s,nw,ne,ne,nw,se,se,se,ne,s,s,n,ne,ne,se,ne,ne,ne,ne,ne,ne,nw,n,se,s,ne,ne,ne,ne,ne,se,ne,ne,ne,se,ne,ne,ne,se,ne,ne,ne,se,ne,ne,ne,ne,ne,ne,ne,sw,ne,se,s,ne,ne,se,s,ne,ne,s,ne,n,n,n,se,ne,ne,ne,se,ne,ne,ne,se,ne,se,ne,se,se,ne,ne,se,ne,ne,ne,ne,ne,ne,sw,s,ne,ne,ne,se,ne,ne,nw,ne,nw,ne,ne,ne,ne,sw,n,ne,se,se,s,se,ne,se,ne,ne,ne,se,sw,ne,ne,ne,s,ne,ne,se,ne,ne,ne,ne,ne,ne,se,n,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,ne,ne,sw,ne,se,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,se,ne,se,ne,se,ne,ne,ne,se,se,ne,ne,ne,ne,se,nw,ne,ne,se,ne,ne,se,ne,n,n,n,ne,ne,se,ne,ne,ne,ne,ne,ne,nw,se,nw,ne,n,ne,nw,ne,s,se,ne,ne,ne,ne,nw,s,ne,ne,ne,ne,se,ne,ne,n,ne,ne,ne,ne,nw,se,ne,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,se,ne,nw,se,ne,ne,n,ne,se,se,nw,s,ne,n,ne,ne,ne,ne,ne,ne,se,ne,ne,sw,ne,ne,se,n,s,ne,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,ne,ne,se,ne,sw,n,s,ne,ne,ne,ne,sw,ne,ne,ne,ne,s,ne,se,ne,ne,se,se,ne,se,se,ne,s,ne,ne,se,s,s,sw,ne,s,se,ne,ne,ne,ne,ne,ne,sw,s,ne,ne,ne,ne,se,ne,ne,ne,ne,ne,n,n,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,sw,n,se,se,ne,se,se,n,ne,se,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,nw,ne,s,sw,ne,ne,ne,ne,ne,sw,ne,sw,n,ne,ne,ne,ne,s,ne,ne,ne,ne,nw,ne,ne,ne,sw,ne,s,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,ne,ne,s,sw,nw,ne,ne,s,ne,ne,ne,ne,ne,ne,ne,sw,sw,sw,nw,ne,ne,s,s,s,sw,sw,se,sw,s,nw,nw,nw,nw,nw,sw,n,n,ne,nw,n,n,ne,n,n,n,n,se,ne,n,ne,n,se,ne,ne,ne,ne,s,ne,ne,s,ne,ne,ne,se,s,sw,s,se,se,se,ne,ne,se,ne,se,ne,se,se,se,se,se,se,se,se,s,sw,se,s,se,n,nw,nw,ne,nw,se,n,se,se,s,s,ne,s,nw,n,nw,s,se,ne,se,nw,s,s,se,s,s,nw,s,se,se,nw,s,s,s,sw,s,sw,s,nw,sw,s,nw,s,s,nw,s,s,s,ne,ne,s,s,s,s,sw,s,n,sw,sw,sw,sw,sw,s,s,sw,sw,sw,s,sw,sw,sw,sw,se,sw,nw,sw,sw,sw,ne,sw,nw,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,se,nw,sw,n,sw,nw,sw,nw,nw,sw,nw,nw,sw,nw,s,sw,n,sw,nw,nw,nw,sw,s,s,nw,nw,sw,sw,sw,nw,nw,nw,sw,se,ne,se,nw,sw,ne,sw,nw,nw,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,se,sw,nw,n,sw,nw,nw,nw,nw,nw,nw,nw,nw,s,nw,n,nw,sw,nw,nw,n,nw,nw,s,ne,nw,nw,ne,nw,nw,nw,nw,nw,n,nw,s,n,nw,nw,n,n,n,nw,nw,n,nw,se,nw,nw,nw,nw,se,n,nw,nw,nw,n,nw,sw,n,n,s,se,nw,ne,n,n,n,n,nw,nw,n,n,n,n,n,n,s,n,sw,nw,nw,nw,ne,n,n,n,n,n,n,n,sw,n,ne,n,n,n,n,n,n,nw,n,se,ne,n,n,n,n,sw,n,n,n,n,n,n,n,s,nw,n,n,n,n,n,n,ne,n,n,n,n,n,n,n,n,n,ne,s,s,n,n,sw,n,se,n,n,s,n,n,ne,ne,ne,n,ne,n,n,ne,ne,ne,n,ne,ne,ne,n,n,nw,n,n,n,ne,ne,sw,n,s,sw,n,n,n,n,n,n,n,n,n,sw,n,n,n,n,n,ne,nw,ne,ne,n,s,n,s,ne,n,ne,n,ne,n,ne,n,ne,n,se,ne,n,ne,nw,n,ne,sw,ne,ne,ne,n,n,ne,ne,ne,sw,nw,ne,se,ne,ne,sw,s,ne,s,ne,ne,ne,ne,ne,ne,ne,n,ne,ne,nw,ne,ne,s,ne,ne,ne,ne,ne,ne,se,sw,ne,ne,ne,ne,ne,n,ne,ne,ne,se,ne,ne,ne,sw,ne,sw,ne,se,ne,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,ne,se,ne,ne,ne,nw,ne,s,ne,ne,se,se,ne,ne,se,ne,s,se,ne,ne,ne,ne,ne,ne,ne,se,ne,se,ne,ne,ne,se,ne,se,ne,se,se,ne,se,se,ne,se,ne,ne,se,ne,ne,ne,ne,se,se,ne,s,s,ne,ne,se,se,ne,se,ne,s,ne,ne,se,se,ne,se,sw,ne,sw,se,ne,ne,sw,se,ne,ne,se,se,ne,se,se,se,se,se,nw,ne,se,ne,sw,ne,se,se,se,ne,se,se,se,se,ne,nw,ne,se,ne,se,ne,sw,se,se,ne,se,se,se,ne,se,nw,ne,s,se,se,ne,s,se,ne,ne,se,sw,nw,se,sw,n,n,se,se,s,se,s,se,ne,se,se,se,n,se,n,sw,ne,se,se,se,se,nw,se,n,se,se,ne,se,sw,se,n,n,se,s,se,se,n,se,se,nw,se,se,se,se,sw,se,se,se,ne,se,ne,se,se,se,se,se,se,se,se,se,nw,se,se,nw,se,n,se,se,se,se,se,se,se,se,se,sw,se,se,se,se,se,s,s,se,sw,ne,se,se,ne,nw,s,n,ne,s,se,se,se,n,ne,s,se,s,se,se,se,se,se,nw,se,se,nw,se,se,se,s,se,se,se,se,se,se,s,se,sw,ne,s,s,se,se,s,se,se,se,se,nw,se,se,se,nw,se,s,se,se,se,sw,se,se,nw,s,se,s,se,se,se,se,s,s,se,s,se,se,se,n,s,n,sw,s,se,s,s,se,s,se,s,se,se,s,se,sw,s,se,s,s,se,se,s,n,sw,se,s,se,se,se,s,s,se,nw,se,se,sw,se,s,s,se,se,s,s,se,ne,nw,se,s,s,se,s,n,s,ne,s,s,sw,s,s,se,sw,s,s,se,s,s,s,s,s,se,s,s,s,s,se,se,se,s,s,nw,se,s,s,s,s,se,nw,ne,s,se,s,se,s,ne,s,se,s,s,se,se,s,n,se,nw,n,se,s,s,n,se,n,sw,s,n,s,ne,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,se,se,s,ne,s,s,s,s,s,s,se,s,s,n,s,se,s,s,s,sw,s,s,s,s,s,s,s,s,sw,s,nw,nw,ne,s,n,se,s,s,ne,s,s,sw,nw,sw,s,s,nw,s,s,s,s,sw,s,s,s,s,ne,sw,s,sw,s,s,s,s,n,s,s,s,s,s,s,s,nw,s,s,s,s,se,s,s,s,n,s,s,s,s,s,s,se,s,ne,s,nw,nw,s,s,sw,s,nw,s,s,s,s,s,s,s,sw,sw,s,s,s,s,s,s,s,ne,s,s,s,s,sw,s,sw,nw,s,nw,sw,s,n,se,s,sw,s,s,ne,se,s,sw,sw,s,s,s,s,s,s,s,s,s,s,sw,s,s,s,s,sw,s,s,sw,s,s,s,s,s,s,ne,s,sw,sw,sw,s,sw,sw,nw,sw,sw,sw,s,sw,s,s,s,sw,s,s,s,se,s,s,nw,sw,sw,s,sw,s,s,s,s,s,sw,sw,sw,s,sw,sw,s,se,sw,ne,sw,sw,s,n,sw,s,s,s,s,s,s,sw,s,sw,s,sw,sw,nw,sw,se,s,s,s,ne,se,sw,sw,sw,sw,s,s,sw,s,sw,s,sw,sw,sw,n,n,sw,sw,s,sw,sw,sw,s,s,sw,sw,sw,sw,s,sw,s,sw,sw,s,s,sw,s,s,sw,sw,sw,s,sw,sw,sw,s,sw,n,s,nw,s,s,nw,sw,n,sw,sw,n,se,sw,s,se,s,sw,s,s,ne,sw,sw,s,nw,sw,n,se,sw,sw,sw,s,sw,sw,s,sw,sw,sw,nw,sw,sw,n,sw,se,n,sw,sw,s,n,sw,sw,sw,sw,sw,s,s,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,s,sw,s,sw,sw,sw,sw,sw,s,sw,sw,s,sw,s,nw,s,n,sw,s,s,sw,sw,sw,sw,sw,sw,s,sw,s,sw,s,sw,sw,s,sw,nw,s,se,s,sw,n,se,ne,sw,sw,sw,sw,sw,sw,sw,s,sw,sw,sw,s,sw,ne,sw,s,sw,sw,s,sw,ne,s,sw,sw,ne,ne,sw,sw,sw,sw,sw,nw,ne,s,sw,nw,sw,sw,ne,sw,sw,sw,sw,ne,s,sw,sw,sw,sw,sw,se,sw,sw,sw,sw,sw,sw,se,s,sw,sw,sw,sw,sw,se,sw,nw,sw,sw,sw,sw,sw,sw,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,ne,sw,sw,nw,sw,sw,sw,sw,ne,sw,sw,nw,s,sw,sw,sw,n,sw,nw,nw,sw,se,sw,sw,sw,s,nw,ne,sw,sw,sw,sw,sw,s,sw,sw,sw,ne,sw,sw,s,sw,sw,sw,sw,nw,sw,se,nw,sw,nw,sw,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,se,nw,n,sw,nw,sw,sw,sw,nw,sw,n,n,sw,nw,sw,sw,s,sw,sw,sw,n,s,nw,sw,sw,sw,sw,sw,nw,nw,nw,nw,ne,nw,sw,sw,n,se,nw,sw,nw,n,sw,nw,sw,sw,sw,sw,sw,sw,n,sw,sw,sw,nw,sw,sw,sw,sw,nw,nw,n,sw,se,nw,nw,sw,n,se,nw,se,nw,sw,sw,sw,nw,nw,sw,sw,s,sw,sw,nw,nw,sw,nw,sw,sw,nw,sw,sw,sw,sw,nw,sw,nw,sw,s,sw,sw,nw,sw,sw,sw,nw,nw,sw,sw,sw,nw,sw,sw,nw,sw,nw,nw,sw,nw,nw,sw,nw,sw,sw,sw,nw,nw,sw,sw,s,sw,nw,sw,ne,sw,sw,nw,sw,nw,sw,s,sw,nw,nw,se,sw,ne,sw,sw,sw,s,sw,nw,n,sw,n,nw,sw,nw,sw,nw,ne,nw,nw,nw,se,nw,n,nw,sw,sw,nw,nw,nw,sw,sw,nw,nw,ne,sw,sw,nw,sw,sw,nw,nw,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,se,ne,nw,nw,ne,sw,ne,nw,sw,sw,sw,nw,nw,nw,sw,nw,sw,sw,ne,nw,nw,nw,nw,nw,ne,nw,ne,nw,sw,nw,sw,nw,ne,nw,sw,sw,nw,nw,nw,nw,sw,sw,nw,se,ne,nw,se,sw,nw,n,nw,nw,nw,nw,nw,sw,sw,sw,nw,sw,sw,nw,sw,sw,sw,sw,n,n,sw,nw,n,ne,nw,s,sw,sw,nw,nw,nw,sw,nw,nw,nw,nw,nw,sw,sw,nw,nw,sw,s,nw,sw,sw,nw,nw,sw,nw,sw,nw,sw,nw,sw,nw,nw,nw,nw,sw,ne,nw,nw,nw,nw,nw,sw,sw,nw,s,nw,nw,nw,nw,nw,sw,nw,sw,nw,nw,nw,s,nw,nw,sw,sw,nw,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,nw,se,n,nw,sw,nw,sw,sw,nw,sw,nw,sw,ne,nw,nw,s,sw,ne,ne,s,sw,sw,sw,nw,ne,nw,nw,s,nw,nw,nw,n,s,sw,nw,nw,nw,nw,ne,nw,ne,se,nw,sw,nw,s,sw,nw,nw,nw,nw,sw,nw,ne,nw,nw,n,nw,nw,nw,nw,sw,nw,nw,nw,se,s,s,se,nw,nw,nw,nw,nw,ne,nw,sw,n,nw,nw,s,nw,nw,nw,nw,nw,nw,nw,n,nw,ne,ne,nw,nw,se,nw,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,sw,n,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,nw,nw,nw,s,n,n,nw,se,nw,nw,nw,nw,ne,nw,n,nw,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,sw,nw,nw,nw,n,s,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,n,nw,nw,nw,se,sw,n,nw,n,nw,nw,se,se,nw,nw,nw,nw,nw,nw,n,n,ne,sw,nw,nw,nw,n,nw,nw,n,s,nw,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,n,se,nw,s,n,nw,nw,nw,se,nw,nw,nw,n,nw,nw,n,n,nw,nw,nw,nw,sw,nw,nw,nw,nw,nw,n,nw,nw,n,n,nw,n,nw,se,n,nw,nw,sw,nw,nw,nw,nw,sw,nw,se,n,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,se,ne,nw,nw,ne,nw,nw,n,nw,se,nw,n,nw,sw,nw,nw,n,nw,se,n,nw,se,nw,nw,nw,se,n,nw,n,nw,n,n,nw,se,nw,s,nw,nw,se,s,nw,nw,n,nw,nw,nw,nw,nw,n,nw,se,nw,nw,nw,nw,nw,s,nw,nw,nw,nw,nw,nw,se,nw,se,nw,se,nw,n,nw,nw,nw,nw,n,nw,n,nw,nw,nw,nw,nw,s,sw,nw,nw,nw,ne,sw,ne,nw,s,nw,nw,n,nw,sw,nw,se,n,n,nw,nw,se,nw,nw,nw,n,n,nw,ne,nw,n,n,n,n,nw,ne,nw,n,ne,n,n,nw,n,nw,nw,n,s,n,nw,nw,nw,nw,nw,n,nw,n,nw,n,nw,s,n,nw,n,nw,nw,nw,s,sw,s,ne,nw,nw,n,nw,nw,nw,nw,nw,nw,sw,sw,n,n,sw,s,ne,n,n,n,nw,ne,nw,n,nw,se,n,sw,n,n,nw,n,nw,nw,s,nw,nw,n,nw,sw,nw,n,n,nw,nw,nw,n,nw,nw,n,se,nw,n,n,nw,nw,n,nw,n,nw,n,n,nw,nw,nw,nw,n,n,s,nw,sw,n,n,n,n,ne,n,nw,n,n,se,nw,nw,nw,nw,nw,n,n,nw,nw,nw,s,n,n,nw,n,n,nw,nw,nw,nw,nw,nw,s,s,nw,nw,nw,s,sw,nw,s,s,nw,n,nw,n,sw,sw,n,n,nw,n,sw,nw,n,n,nw,nw,nw,nw,n,n,nw,n,nw,n,s,nw,n,n,nw,n,nw,n,nw,nw,nw,n,ne,n,n,nw,n,nw,nw,nw,nw,ne,n,n,ne,nw,se,se,ne,nw,n,nw,n,n,se,n,n,n,n,n,sw,n,nw,n,se,nw,n,n,n,n,se,n,n,n,se,nw,n,se,nw,n,n,nw,n,sw,n,nw,n,n,se,nw,sw,n,n,n,n,n,sw,n,n,n,sw,sw,n,ne,n,n,nw,n,n,n,n,n,n,se,nw,n,n,s,se,n,nw,ne,n,nw,nw,n,nw,n,n,n,n,n,nw,n,n,n,n,nw,nw,n,nw,n,n,n,n,n,nw,nw,n,n,ne,n,n,n,nw,s,sw,n,n,n,n,n,nw,n,n,nw,s,n,n,n,n,n,ne,ne,se,n,nw,n,n,nw,se,nw,n,nw,n,n,nw,n,s,nw,s,n,n,nw,nw,n,nw,n,n,n,n,ne,n,nw,nw,n,n,nw,n,n,n,n,n,nw,n,n,nw,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,nw,n,n,n,sw,nw,sw,n,nw,n,sw,nw,n,s,n,n,ne,n,sw,n,ne,nw,n,nw,n,n,n,n,nw,n,n,n,n,n,n,n,n,nw,ne,n,se,n,n,n,n,n,n,n,n,nw,n,n,n,n,nw,n,nw,se,n,sw,ne,n,n,n,n,n,n,n,n,n,nw,n,n,n,n,n,n,n,n,n,nw,n,n,n,n,n,n,n,n,n,se,n,s,nw,ne,n,n,se,n,ne,ne,n,nw,n,n,n,n,ne,ne,n,n,n,nw,ne,s,n,n,n,nw,n,n,se,n,n,sw,sw,n,s,ne,n,sw,se,nw,n,ne,n diff --git a/package.yaml b/package.yaml index 19ac42a..359c6ef 100644 --- a/package.yaml +++ b/package.yaml @@ -23,6 +23,7 @@ library: - Day08 - Day09 - Day10 + - Day11 dependencies: - base >=4.7 && <5 - protolude diff --git a/src/Day11.hs b/src/Day11.hs new file mode 100644 index 0000000..d7edc24 --- /dev/null +++ b/src/Day11.hs @@ -0,0 +1,99 @@ +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE OverloadedStrings #-} +{-| +description: + +--- Day 11: Hex Ed --- + +Crossing the bridge, you've barely reached the other side of the stream when a +program comes up to you, clearly in distress. "It's my child process," she says, +"he's gotten lost in an infinite grid!" + +Fortunately for her, you have plenty of experience with infinite grids. + +Unfortunately for you, it's a hex grid. + +The hexagons ("hexes") in this grid are aligned such that adjacent hexes can be +found to the north, northeast, southeast, south, southwest, and northwest: + + \ n / +nw +--+ ne + / \ +-+ +- + \ / +sw +--+ se + / s \ + +You have the path the child process took. Starting where he started, you need to +determine the fewest number of steps required to reach him. (A "step" means to +move from the hex you are in to any adjacent hex.) + +For example: + +- ne,ne,ne is 3 steps away. +- ne,ne,sw,sw is 0 steps away (back where you started). +- ne,ne,s,s is 2 steps away (se,se). +- se,sw,se,sw,sw is 3 steps away (s,s,sw). + +--- Part Two --- + +How many steps away is the furthest he ever got from his starting position? + +|-} + +module Day11 where + +import Protolude + +import qualified Data.Text as T +import Data.List (scanl',last) + +data Move = NW | N | NE | SE | S | SW deriving (Show, Eq, Ord) + + +parseInput :: IO [Move] +parseInput = parseTxt <$> readFile "inputs/day11.txt" + +parseTxt :: Text -> [Move] +parseTxt str = str & T.strip & T.splitOn "," & map strToMove + where + strToMove "n" = N + strToMove "nw" = NW + strToMove "ne" = NE + strToMove "s" = S + strToMove "sw" = SW + strToMove "se" = SE + +data Coord = Coord Int Int Int deriving (Show, Eq, Ord) + +direction :: Move -> Coord +direction N = Coord 0 1 (-1) +direction S = Coord 0 (-1) 1 +direction NE = Coord 1 0 (-1) +direction SW = Coord (-1) 0 1 +direction NW = Coord (-1) 1 0 +direction SE = Coord 1 (-1) 0 + +sumCoord :: Coord -> Coord -> Coord +sumCoord (Coord x1 y1 z1) (Coord x2 y2 z2) = + Coord (x1 + x2) (y1 + y2) (z1 + z2) + +origin :: Coord +origin = Coord 0 0 0 + +dist :: Coord -> Int +dist (Coord x1 y1 z1) = + (abs x1 + abs y1 + abs z1) `div` 2 + +solution1 :: [Move] -> Int +solution1 moves = + map direction moves + & foldl' sumCoord origin + & dist + +solution2 :: [Move] -> Int +solution2 moves = + map direction moves + & scanl' sumCoord origin + & map dist + & maximum diff --git a/test/Spec.hs b/test/Spec.hs index 235ac7d..f974a34 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -11,6 +11,7 @@ import qualified Day06 import qualified Day07 import qualified Day08 import qualified Day10 +import qualified Day11 main :: IO () @@ -93,4 +94,16 @@ main = defaultMain $ , testCase "solution 2 1,2,4" $ Day10.solution2 "1,2,4" @?= "63960835bcdc130f0b66d7ff4f6a5a8e" ] + , testGroup "Day 11" + [ testGroup "Solution 1" + [ testCase "Example 1" $ + Day11.solution1 (Day11.parseTxt "ne,ne,ne") @?= 3 + , testCase "Example 2" $ + Day11.solution1 (Day11.parseTxt "ne,ne,sw,sw") @?= 0 + , testCase "Example 3" $ + Day11.solution1 (Day11.parseTxt "ne,ne,s,s") @?= 2 + , testCase "Example 4" $ + Day11.solution1 (Day11.parseTxt "se,sw,se,sw,sw") @?= 3 + ] + ] ]