alternate day11 with no strings

This commit is contained in:
2024-12-11 20:06:25 -08:00
parent 45c4a2997c
commit d326a4d99f
6 changed files with 94 additions and 29 deletions

View File

@@ -14,26 +14,14 @@ pfunc divide uses (_,_) : String → String × String := `(s) => {
return _$2C_(undefined, undefined, s.slice(0,l), s.slice(l))
}`
step : List Int List Int
step = go Nil
where
go : List Int List Int List Int
go acc Nil = acc
go acc (0 :: xs) = go (1 :: acc) xs
go acc (x :: xs) =
let str = show x in
if slen str % 2 == 0
then let (a,b) = divide str in go (stringToInt a :: stringToInt b :: acc) xs
else go (2024 * x :: acc) xs
foldMap : a b. {{Ord a}} {{Eq a}} (b b b) SortedMap a b List (a × b) SortedMap a b
foldMap f m Nil = m
foldMap f m ((a,b) :: xs) = case lookupMap a m of
Nothing => foldMap f (updateMap a b m) xs
Just (_, b') => foldMap f (updateMap a (f b' b) m) xs
step2 : List (Int × Int) List (Int × Int)
step2 = go Nil
step : List (Int × Int) List (Int × Int)
step = go Nil
where
go : List (Int × Int) List (Int × Int) List (Int × Int)
go acc Nil = acc
@@ -49,7 +37,7 @@ iter count parts = let x = go count parts in foldl _+_ 0 $ map snd $ toList x
where
go : Int SortedMap Int Int SortedMap Int Int
go 0 stuff = stuff
go x stuff = go (x - 1) $ foldMap _+_ EmptyMap $ step2 $ toList stuff
go x stuff = go (x - 1) $ foldMap _+_ EmptyMap $ step $ toList stuff
run : String -> IO Unit
run fn = do
@@ -59,7 +47,7 @@ run fn = do
let p1 = iter 25 stuff
putStrLn $ "part1 " ++ show p1
let p2 = iter 75 stuff
putStrLn $ "iter " ++ show p2
putStrLn $ "part2 " ++ show p2
main : IO Unit
main = do

60
aoc2024/Day11b.newt Normal file
View File

@@ -0,0 +1,60 @@
module Day11b
import Prelude
import Node
import Aoc
import SortedMap
-- Alternate version that doesn't use string
infixl 7 _%_
pfunc _%_ : Int Int Int := `(x,y) => x % y`
-- 32 bit ints are too small
pfunc div53 : Int Int Int := `(x,y) => Math.floor(x / y)`
stone : Int Either Int (Int × Int)
stone num = if num == 0 then Left 1 else go num num 1
where
go : Int Int Int Either Int (Int × Int)
go a b mod =
if b == 0 then Right (a, num % mod)
else if b < 10 then Left (2024 * num)
else go (div53 a 10) (div53 b 100) (mod * 10)
foldMap : a b. {{Ord a}} {{Eq a}} (b b b) SortedMap a b List (a × b) SortedMap a b
foldMap f m Nil = m
foldMap f m ((a,b) :: xs) = case lookupMap a m of
Nothing => foldMap f (updateMap a b m) xs
Just (_, b') => foldMap f (updateMap a (f b' b) m) xs
step : List (Int × Int) List (Int × Int)
step xs = go Nil xs
where
go : List (Int × Int) List (Int × Int) List (Int × Int)
go acc Nil = acc
go acc ((x,c) :: xs) = case stone x of
Left a => go ((a,c) :: acc) xs
Right (a,b) => go ((a,c) :: (b,c) :: acc) xs
iter : Int SortedMap Int Int Int
iter count parts = let x = go count parts in foldl _+_ 0 $ map snd $ toList x
where
go : Int SortedMap Int Int SortedMap Int Int
go 0 stuff = stuff
go x stuff = go (x - 1) $ foldMap _+_ EmptyMap $ step $ toList stuff
run : String -> IO Unit
run fn = do
putStrLn fn
text <- readFile fn
let stuff = foldMap _+_ EmptyMap $ map (\ x => (stringToInt x, 1)) $ split (trim text) " "
let p1 = iter 25 stuff
putStrLn $ "part1 " ++ show p1
let p2 = iter 75 stuff
putStrLn $ "part2 " ++ show p2
main : IO Unit
main = do
run "aoc2024/day11/eg.txt"
run "aoc2024/day11/input.txt"