26 lines
617 B
Haskell
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 |