2015 Day 11 in Haskell
This commit is contained in:
parent
c9666b358b
commit
dadb40a0e3
42
2015/day11/day11.hs
Normal file
42
2015/day11/day11.hs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import Aoc
|
||||||
|
import Data.Char ( ord, chr )
|
||||||
|
import Data.List ( group, nub )
|
||||||
|
import Data.Bifunctor ( bimap )
|
||||||
|
|
||||||
|
toBase26' :: Char -> Int
|
||||||
|
toBase26' = (\n->n-97) . ord
|
||||||
|
|
||||||
|
fromBase26' :: Int -> Char
|
||||||
|
fromBase26' = chr . (97+)
|
||||||
|
|
||||||
|
toBase26 :: [Char] -> [Int]
|
||||||
|
toBase26 = reverse . map toBase26'
|
||||||
|
|
||||||
|
fromBase26 :: [Int] -> [Char]
|
||||||
|
fromBase26 = reverse . map fromBase26'
|
||||||
|
|
||||||
|
next :: [Int] -> [Int]
|
||||||
|
next (25:rest) = 0:next rest
|
||||||
|
next (x:rest)
|
||||||
|
| x `elem` [7,10,13] = x+2:rest -- skip i,o,l
|
||||||
|
| otherwise = x+1:rest
|
||||||
|
|
||||||
|
lengthy :: [a] -> Bool
|
||||||
|
lengthy = (>1) . length
|
||||||
|
|
||||||
|
getAnswer :: [[Int]] -> [Char]
|
||||||
|
getAnswer = fromBase26 . head
|
||||||
|
|
||||||
|
part1 :: String -> (String, [[Int]])
|
||||||
|
part1 = (\ps -> (getAnswer ps, tail ps)) . filter isSecure . iterate next . toBase26
|
||||||
|
where
|
||||||
|
hasStraight = any lengthy . filter ((==1) . head) . group . map (uncurry (-)) . adjacents
|
||||||
|
hasNoIOL = not . any (`elem` [8,14,11])
|
||||||
|
hasPair = lengthy . nub . map head . filter lengthy . group
|
||||||
|
isSecure ns = hasStraight ns && hasNoIOL ns && hasPair ns
|
||||||
|
|
||||||
|
part2 :: p -> [[Int]] -> String
|
||||||
|
part2 _ = getAnswer
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = aocMain' single part1 part2
|
Loading…
Reference in New Issue
Block a user