aoc2022/25-a.hs

26 lines
617 B
Haskell

readSNAFUDigit '2' = 2
readSNAFUDigit '1' = 1
readSNAFUDigit '0' = 0
readSNAFUDigit '-' = -1
readSNAFUDigit '=' = -2
readSNAFUDigit _ = undefined
readSNAFU :: String -> Int
readSNAFU s = sum $ zipWith (\c m -> readSNAFUDigit c * m) s (map (5 ^) (reverse [0 .. length s - 1]))
showSNAFUDigit 0 = '0'
showSNAFUDigit 1 = '1'
showSNAFUDigit 2 = '2'
showSNAFUDigit 3 = '='
showSNAFUDigit 4 = '-'
showSNAFUDigit _ = undefined
showSNAFU :: Int -> String
showSNAFU n
| n > 0 = showSNAFU ((n + 2) `div` 5) ++ [showSNAFUDigit (n `mod` 5)]
| otherwise = ""
main = interact $ showSNAFU
. sum
. map readSNAFU
. lines