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
|