X-Git-Url: https://git.njae.me.uk/?p=advent-of-code-22.git;a=blobdiff_plain;f=advent25%2FMain.hs;fp=advent25%2FMain.hs;h=39ba5c16dff3170a329caa0c1365c2e98d2c6923;hp=0000000000000000000000000000000000000000;hb=3047c5925ea808b3b6dadfa23bcec7651efc5ec9;hpb=37f5b0276e3c8858847f51290f15de169de82201 diff --git a/advent25/Main.hs b/advent25/Main.hs new file mode 100644 index 0000000..39ba5c1 --- /dev/null +++ b/advent25/Main.hs @@ -0,0 +1,49 @@ +-- Writeup at https://work.njae.me.uk/2022/12/01/advent-of-code-2022-day-1/ + +import AoC +import Data.List + + +main :: IO () +main = + do dataFileName <- getDataFileName + numStrs <- readFile dataFileName + let fuels = fmap readSnafu $ lines numStrs + putStrLn $ showSnafu $ sum fuels + -- print $ part1 fuels + +readSnafu :: String -> Int +readSnafu cs = foldl' go 0 cs + where go acc c = acc * 5 + (snafuValue c) + +snafuValue :: Char -> Int +snafuValue '2' = 2 +snafuValue '1' = 1 +snafuValue '0' = 0 +snafuValue '-' = -1 +snafuValue '=' = -2 +snafuValue _ = error "Illegal digit in read" + +showSnafu :: Int -> String +showSnafu n = reverse $ packSnafu 0 $ toBase5R n + +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)) + where d' = d + carry + +snafuRep :: Int -> Char +snafuRep 2 = '2' +snafuRep 1 = '1' +snafuRep 0 = '0' +snafuRep -1 = '-' +snafuRep -2 = '=' +snafuRep _ = error "Illegal number in show"