X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;ds=sidebyside;f=advent25%2FMain.hs;fp=advent25%2FMain.hs;h=cc0a464c9fbd83ec28652aaedab4c7fe306ce08f;hb=248db8976bf09c43d7934468418a916d2fc06d29;hp=f6a284f2e2cab80058544b61795de9a6ab0cad85;hpb=2b91cfef52c969a7d534ca79b8d01e89e19c7e6f;p=advent-of-code-22.git

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'