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