1 -- Writeup at https://work.njae.me.uk/2022/12/01/advent-of-code-2022-day-1/
9 do dataFileName <- getDataFileName
10 numStrs <- readFile dataFileName
11 let fuels = fmap readSnafu $ lines numStrs
12 putStrLn $ showSnafu $ sum fuels
13 -- print $ part1 fuels
15 readSnafu :: String -> Int
16 readSnafu cs = foldl' go 0 cs
17 where go acc c = acc * 5 + (snafuValue c)
19 snafuValue :: Char -> Int
25 snafuValue _ = error "Illegal digit in read"
27 showSnafu :: Int -> String
28 showSnafu = packSnafu . toBase5R
30 toBase5R :: Int -> [Int]
32 toBase5R n = (r : (toBase5R k))
33 where (k, r) = n `divMod` 5
35 packSnafu :: [Int] -> String
38 | otherwise = (snafuRep carry) : shown
39 where (carry, shown) = foldl' packSnafuDigit (0, "") digits
41 packSnafuDigit :: (Int, String) -> Int -> (Int, String)
42 packSnafuDigit (carry, acc) d
43 | d' <= 2 = (0, (snafuRep d') : acc)
44 | otherwise = (1, (snafuRep (d' - 5) : acc))
47 snafuRep :: Int -> Char
53 snafuRep _ = error "Illegal number in show"