From: Neil Smith Date: Sun, 25 Dec 2022 20:10:27 +0000 (+0000) Subject: Rebuilt as a fold X-Git-Url: https://git.njae.me.uk/?p=advent-of-code-22.git;a=commitdiff_plain;h=248db8976bf09c43d7934468418a916d2fc06d29 Rebuilt as a fold --- diff --git a/advent25/Main.hs b/advent25/Main.hs index f6a284f..cc0a464 100644 --- a/advent25/Main.hs +++ b/advent25/Main.hs @@ -25,21 +25,23 @@ snafuValue '=' = -2 snafuValue _ = error "Illegal digit in read" showSnafu :: Int -> String -showSnafu = reverse . (packSnafu 0) . toBase5R +showSnafu = packSnafu . toBase5R toBase5R :: Int -> [Int] toBase5R 0 = [] toBase5R n = (r : (toBase5R k)) where (k, r) = n `divMod` 5 -packSnafu :: Int -> [Int] -> String -packSnafu 0 [] = "" -packSnafu carry [] = [snafuRep carry] -packSnafu carry (d:ds) - | d' <= 2 = ((snafuRep d') : (packSnafu 0 ds)) - | otherwise = ((snafuRep (d' - 5)) : (packSnafu 1 ds)) +packSnafu :: [Int] -> String +packSnafu = snd . foldl' packSnafuDigit (0, "") + +packSnafuDigit :: (Int, String) -> Int -> (Int, String) +packSnafuDigit (carry, acc) d + | d' <= 2 = (0, (snafuRep d') : acc) + | otherwise = (1, (snafuRep (d' - 5) : acc)) where d' = d + carry + snafuRep :: Int -> Char snafuRep 2 = '2' snafuRep 1 = '1'