ability to run code and check output in tests

This commit is contained in:
2024-12-28 13:19:15 -08:00
parent 95f90c8698
commit a6e68ac2a2
62 changed files with 459 additions and 31 deletions

6
aoc2024/Day1.newt.golden Normal file
View File

@@ -0,0 +1,6 @@
aoc2024/day1/eg.txt
part1 11
part2 31
aoc2024/day1/input.txt
part1 1197984
part2 23387399

18
aoc2024/Day10.newt.golden Normal file
View File

@@ -0,0 +1,18 @@
aoc2024/day10/eg.txt
part1 1
part2 16
aoc2024/day10/eg2.txt
part1 2
part2 2
aoc2024/day10/eg3.txt
part1 4
part2 13
aoc2024/day10/eg4.txt
part1 3
part2 3
aoc2024/day10/eg5.txt
part1 36
part2 81
aoc2024/day10/input.txt
part1 510
part2 1058

View File

@@ -0,0 +1,6 @@
aoc2024/day11/eg.txt
part1 55312
part2 65601038650482
aoc2024/day11/input.txt
part1 186175
part2 220566831337810

View File

@@ -0,0 +1,6 @@
aoc2024/day11/eg.txt
part1 55312
part2 65601038650482
aoc2024/day11/input.txt
part1 186175
part2 220566831337810

View File

@@ -0,0 +1,9 @@
aoc2024/day12/eg.txt
part1 140
part2 80
aoc2024/day12/eg2.txt
part1 772
part2 436
aoc2024/day12/input.txt
part1 1450816
part2 865662

View File

@@ -0,0 +1,6 @@
aoc2024/day13/eg.txt
part1 480
part2 875318608908
aoc2024/day13/input.txt
part1 28059
part2 102255878088512

109
aoc2024/Day14.newt.golden Normal file
View File

@@ -0,0 +1,109 @@
aoc2024/day14/input.txt
(121, 119, 119, 132)
part1 226179492
500
7502
..................................*.*................................................................
.....................................................................................................
...................................*..........................*......................................
...............*..............................................*..................................*...
.....*.......................*..............................*........................................
.....................................................................................................
.....................................................................................................
.....................................................................................................
.............*.........................*.............................................................
........................................................*............................................
.....................................................................................................
.....................................................................................................
......................................................................................*..............
........................................................*.*..........................................
....................................*................................................................
.....................................................................................................
....................................................................*................................
.................*...................................................................................
....................................*...............*******************************..................
..................*..................*............*.*.............................*..................
.......*............................................*.............................*..**..............
....................................................*.............................*..................
.......*........................*...................*.............................*..................
....................................................*..............*..............*..............*...
.................*..................................*.............***.............*..................
........*...........................................*............*****............*...*..............
....................................................*...........*******...........*..................
....................................................*..........*********..........*...*..............
....................................................*............*****............*..................
....................................................*...........*******...........*.......*..........
.....................*..............................*..........*********..........*.................*
....................................................*.........***********.........*..................
......*.............................................*........*************........*..................
............................................*.......*..........*********..........*..................
....................................................*.........***********.........*..................
....................................................*........*************........*..................
....................................................*.......***************.......*..................
....................................................*......*****************......*..................
....................................................*........*************........*..................
....................................................*.......***************.......*..................
....................................................*......*****************......*..................
...........*..........................*.............*.....*******************.....*..................
.......*...*........................................*....*********************....*..................
....................................................*.............***.............*..................
.........*......................................*...*.............***.............*..................
...................................*................*.............***.............*..................
....................................................*.............................*.......*..........
......*...*.........................................*.............................*..................
.....................*..............................*.............................*..................
.............................*......................*.............................*..................
.................................*.........*........*******************************..................
............*....................................*..........................................*....*...
.........*........*...........................................*......................*...............
...................................................*.*..............*................................
.....................................................................................................
....*..............................................*..........................*......................
....................................*..............................*.................................
..................*..................................................................................
....*...............................................*..............*.................*...............
..*.*....................................*................*..........................................
................*..............*...............................*.....................................
......*..........*..............*.......................................*............................
......................................................*..............................................
.................*............................................................*......................
.....................................................................................................
..................................................................................*...*..............
.....................................................................................................
....................*................................................................*...............
.....................................................................................................
.....................................................................................................
............*...........................................................................*............
.....................................................................................................
.......*...*.......................................................................*.................
........................................*.......................................................*....
...........*........*............*..................................................................*
................................................................................................*....
...............*...............................*.....................................................
..*......................................................*..................*.......................*
.........*...........................................................................................
*.....................*.........................................................................*....
...............................................................................*.....................
.....................................................................................................
........................................................*..........................*.................
.......................................*.............................................................
.....................................................................................................
*..................................*.................................................................
.......................................................*.............................................
.......................................*.....................*.......................................
..............*.*.....................................*......................................*.......
.....................................................................................................
.....................................................................................................
................................*....................................................................
......*..............................................................................................
.......................*....*........................................................................
..........................*...................................................*...........*..........
.......*...................................................*...................*.*...................
.......................*.............................................................................
..........*...........................................*..............................................
...................................................................*.................................
......................................*............................*.................................
..........................................*............*....................*........................
.....................................................................................................
...*.................................................................................................

View File

@@ -0,0 +1,6 @@
aoc2024/day15/eg.txt
part1 10092
part2 9021
aoc2024/day15/input.txt
part1 1406628
part2 1432781

View File

@@ -0,0 +1,9 @@
aoc2024/day16/eg.txt
part1 7036
part2 45
aoc2024/day16/eg2.txt
part1 11048
part2 64
aoc2024/day16/input.txt
part1 90460
part2 575

11
aoc2024/Day17.newt.golden Normal file
View File

@@ -0,0 +1,11 @@
aoc2024/day17/eg.txt
part1 4,6,3,5,6,3,5,2,1,0
fail
aoc2024/day17/eg2.txt
part1 5,7,3,0
part2 117440
aoc2024/day17/input.txt
part1 5,0,3,5,7,6,1,5,4
part2 164516454365621

10
aoc2024/Day18.newt.golden Normal file
View File

@@ -0,0 +1,10 @@
aoc2024/day18/eg.txt
12
part1 22
best 20
part2 6,1
aoc2024/day18/input.txt
1024
part1 260
best 2881
part2 24,48

View File

@@ -0,0 +1,6 @@
aoc2024/day19/eg.txt
part1 6
part2 16
aoc2024/day19/input.txt
part1 371
part2 650354687260341

6
aoc2024/Day2.newt.golden Normal file
View File

@@ -0,0 +1,6 @@
aoc2024/day2/eg.txt
part1 2
part2 4
aoc2024/day2/input.txt
part1 524
part2 569

View File

@@ -0,0 +1,8 @@
aoc2024/day20/eg.txt
base 84
part1 1
part2 285
aoc2024/day20/input.txt
base 9440
part1 1332
part2 987695

View File

@@ -0,0 +1,8 @@
aoc2024/day20/eg.txt
base 84
part1 1
part2 285
aoc2024/day20/input.txt
base 9440
part1 1332
part2 987695

View File

@@ -0,0 +1,8 @@
aoc2024/day21/eg.txt
[("0", 3, 1), ("1", 2, 0), ("2", 2, 1), ("3", 2, 2), ("4", 1, 0), ("5", 1, 1), ("6", 1, 2), ("7", 0, 0), ("8", 0, 1), ("9", 0, 2), ("A", 3, 2)]
part1 126384
part2 154115708116294
aoc2024/day21/input.txt
[("0", 3, 1), ("1", 2, 0), ("2", 2, 1), ("3", 2, 2), ("4", 1, 0), ("5", 1, 1), ("6", 1, 2), ("7", 0, 0), ("8", 0, 1), ("9", 0, 2), ("A", 3, 2)]
part1 248108
part2 303836969158972

View File

@@ -0,0 +1,8 @@
aoc2024/day21/eg.txt
[("0", 3, 1), ("1", 2, 0), ("2", 2, 1), ("3", 2, 2), ("4", 1, 0), ("5", 1, 1), ("6", 1, 2), ("7", 0, 0), ("8", 0, 1), ("9", 0, 2), ("A", 3, 2)]
part1 126384
part2 154115708116294
aoc2024/day21/input.txt
[("0", 3, 1), ("1", 2, 0), ("2", 2, 1), ("3", 2, 2), ("4", 1, 0), ("5", 1, 1), ("6", 1, 2), ("7", 0, 0), ("8", 0, 1), ("9", 0, 2), ("A", 3, 2)]
part1 248108
part2 303836969158972

View File

@@ -0,0 +1,6 @@
aoc2024/day22/eg2.txt
part1 37990510
part2 23
aoc2024/day22/input.txt
part1 13429191512
part2 1582

View File

@@ -0,0 +1,6 @@
aoc2024/day22/eg2.txt
part1 37990510
part2 23
aoc2024/day22/input.txt
part1 13429191512
part2 1582

10
aoc2024/Day23.newt.golden Normal file
View File

@@ -0,0 +1,10 @@
aoc2024/day23/eg.txt
32 pairs
64 dpairs
part1 7
part2 co,de,ka,ta
aoc2024/day23/input.txt
3380 pairs
6760 dpairs
part1 1170
part2 bo,dd,eq,ik,lo,lu,ph,ro,rr,rw,uo,wx,yg

View File

@@ -177,7 +177,6 @@ run : String -> IO Unit
run fn = do
putStrLn fn
text <- readFile fn
putStrLn text
let (Right (wires, gates)) = parseFile text | Left msg => putStrLn $ "fail: " ++ msg
let state = foldMap const EmptyMap wires
let gateMap = foldMap const EmptyMap $ map (\ gate => (out gate, gate)) gates

View File

@@ -0,0 +1,8 @@
aoc2024/day24/input.txt
part1 51745744348272
SWAP z18 and hmt
SWAP bfq and z27
SWAP z31 and hkh
SWAP fjp and bng
part2 bfq,bng,fjp,hkh,hmt,z18,z27,z31

View File

@@ -55,7 +55,6 @@ run : String -> IO Unit
run fn = do
putStrLn fn
text <- readFile fn
putStrLn text
let chunks = parseFile text
let (locks,keys) = splitKeys chunks Nil Nil
debugLog (length locks, length keys)

View File

@@ -0,0 +1,6 @@
aoc2024/day25/eg.txt
(2, 3)
part1 3
aoc2024/day25/input.txt
(250, 250)
part1 3397

6
aoc2024/Day3.newt.golden Normal file
View File

@@ -0,0 +1,6 @@
aoc2024/day3/eg.txt
part1 161
part2 161
aoc2024/day3/input.txt
part1 164730528
part2 70478672

6
aoc2024/Day4.newt.golden Normal file
View File

@@ -0,0 +1,6 @@
aoc2024/day4/eg.txt
part1 18
part2 9
aoc2024/day4/input.txt
part1 2591
part2 1880

8
aoc2024/Day5.newt.golden Normal file
View File

@@ -0,0 +1,8 @@
aoc2024/day5/eg.txt
part1 143
3
part2 123
aoc2024/day5/input.txt
part1 5268
107
part2 5799

8
aoc2024/Day6.newt.golden Normal file
View File

@@ -0,0 +1,8 @@
aoc2024/day6/eg.txt
part1 41
part2 6
100
aoc2024/day6/input.txt
part1 5331
part2 1812
16900

6
aoc2024/Day7.newt.golden Normal file
View File

@@ -0,0 +1,6 @@
aoc2024/day7/eg.txt
part1 3749
part2 11387
aoc2024/day7/input.txt
part1 21572148763543
part2 581941094529163

10
aoc2024/Day8.newt.golden Normal file
View File

@@ -0,0 +1,10 @@
aoc2024/day8/eg.txt
maxrow 11
maxcol 11
part1 14
part2 34
aoc2024/day8/input.txt
maxrow 49
maxcol 49
part1 364
part2 1231

8
aoc2024/Day9.newt.golden Normal file
View File

@@ -0,0 +1,8 @@
aoc2024/day9/eg.txt
10 files
part1 1928
part2 2858
aoc2024/day9/input.txt
10000 files
part1 6283404590840
part2 6304576012713

View File

@@ -1,200 +0,0 @@
module SortedMap
import Prelude
-- TODO We'll want to replace Ord/Eq with (a → Ordering) (and rewrite most of our aoc solutions...)
-- data Ordering : U where
-- LT EQ GT : Ordering
data T23 : Nat -> U -> U -> U where
Leaf : k v. k -> v -> T23 Z k v
Node2 : h k v. T23 h k v -> k -> T23 h k v -> T23 (S h) k v
Node3 : h k v. T23 h k v -> k -> T23 h k v -> k -> T23 h k v -> T23 (S h) k v
lookupT23 : h k v. {{Ord k}} {{Eq k}} -> k -> T23 h k v -> Maybe (k × v)
lookupT23 key (Leaf k v)= if k == key then Just (k,v) else Nothing
lookupT23 key (Node2 t1 k1 t2) =
if key <= k1 then lookupT23 key t1 else lookupT23 key t2
lookupT23 key (Node3 t1 k1 t2 k2 t3) =
if key <= k1 then lookupT23 key t1
else if key <= k2 then lookupT23 key t2
else lookupT23 key t3
insertT23 : h k v. {{Ord k}} {{Eq k}} -> k -> v -> T23 h k v -> Either (T23 h k v) (T23 h k v × k × T23 h k v)
insertT23 key value (Leaf k v) =
if key == k then Left (Leaf key value)
else if key <= k then Right (Leaf key value, key, Leaf k v)
else Right (Leaf k v, k, Leaf key value)
insertT23 key value (Node2 t1 k1 t2) =
if key <= k1 then
case insertT23 key value t1 of
Left t1' => Left (Node2 t1' k1 t2)
Right (a,b,c) => Left (Node3 a b c k1 t2)
else case insertT23 key value t2 of
Left t2' => Left (Node2 t1 k1 t2')
Right (a,b,c) => Left (Node3 t1 k1 a b c)
insertT23 key value (Node3 t1 k1 t2 k2 t3) =
if key <= k1 then
case insertT23 key value t1 of
Left t1' => Left (Node3 t1' k1 t2 k2 t3)
Right (a,b,c) => Right (Node2 a b c, k1, Node2 t2 k2 t3)
else if key <= k2 then
case insertT23 key value t2 of
Left t2' => Left (Node3 t1 k1 t2' k2 t3)
Right (a,b,c) => Right (Node2 t1 k1 a, b, Node2 c k2 t3)
else
case insertT23 key value t3 of
Left t3' => Left (Node3 t1 k1 t2 k2 t3')
Right (a,b,c) => Right (Node2 t1 k1 t2, k2, Node2 a b c)
-- This is cribbed from Idris. Deleting nodes takes a bit of code.
Hole : Nat U U U
Hole Z k v = Unit
Hole (S n) k v = T23 n k v
Node4 : k v h. T23 h k v k T23 h k v k T23 h k v k T23 h k v T23 (S (S h)) k v
Node4 t1 k1 t2 k2 t3 k3 t4 = Node2 (Node2 t1 k1 t2) k2 (Node2 t3 k3 t4)
Node5 : k v h. T23 h k v k T23 h k v k T23 h k v k T23 h k v k T23 h k v T23 (S (S h)) k v
Node5 a b c d e f g h i = Node2 (Node2 a b c) d (Node3 e f g h i)
Node6 : k v h. T23 h k v k T23 h k v k T23 h k v k T23 h k v k T23 h k v k T23 h k v T23 (S (S h)) k v
Node6 a b c d e f g h i j k = Node2 (Node3 a b c d e) f (Node3 g h i j k)
Node7 : k v h. T23 h k v k T23 h k v k T23 h k v k T23 h k v k T23 h k v k T23 h k v k T23 h k v T23 (S (S h)) k v
Node7 a b c d e f g h i j k l m = Node3 (Node3 a b c d e) f (Node2 g h i) j (Node2 k l m)
merge1 : k v h. T23 h k v k T23 (S h) k v k T23 (S h) k v T23 (S (S h)) k v
merge1 a b (Node2 c d e) f (Node2 g h i) = Node5 a b c d e f g h i
merge1 a b (Node2 c d e) f (Node3 g h i j k) = Node6 a b c d e f g h i j k
merge1 a b (Node3 c d e f g) h (Node2 i j k) = Node6 a b c d e f g h i j k
merge1 a b (Node3 c d e f g) h (Node3 i j k l m) = Node7 a b c d e f g h i j k l m
merge2 : k v h. T23 (S h) k v k T23 h k v k T23 (S h) k v T23 (S (S h)) k v
merge2 (Node2 a b c) d e f (Node2 g h i) = Node5 a b c d e f g h i
merge2 (Node2 a b c) d e f (Node3 g h i j k) = Node6 a b c d e f g h i j k
merge2 (Node3 a b c d e) f g h (Node2 i j k) = Node6 a b c d e f g h i j k
merge2 (Node3 a b c d e) f g h (Node3 i j k l m) = Node7 a b c d e f g h i j k l m
merge3 : k v h. T23 (S h) k v k T23 (S h) k v k T23 h k v T23 (S (S h)) k v
merge3 (Node2 a b c) d (Node2 e f g) h i = Node5 a b c d e f g h i
merge3 (Node2 a b c) d (Node3 e f g h i) j k = Node6 a b c d e f g h i j k
merge3 (Node3 a b c d e) f (Node2 g h i) j k = Node6 a b c d e f g h i j k
merge3 (Node3 a b c d e) f (Node3 g h i j k) l m = Node7 a b c d e f g h i j k l m
-- height is erased in the data everywhere but the top, but needed for case
-- I wonder if we could use a 1 + 1 + 1 type instead of Either Tree Hole and condense this
deleteT23 : k v. {{Ord k}} {{Eq k}} (h : Nat) -> k -> T23 h k v -> Either (T23 h k v) (Hole h k v)
deleteT23 Z key (Leaf k v) = if k == key then Right MkUnit else Left (Leaf k v)
deleteT23 (S Z) key (Node2 t1 k1 t2) =
if key <= k1
then case deleteT23 Z key t1 of
Left t1 => Left (Node2 t1 k1 t2)
Right _ => Right t2
else case deleteT23 Z key t2 of
Left t2 => Left (Node2 t1 k1 t2)
Right MkUnit => Right t1
deleteT23 (S Z) key (Node3 t1 k1 t2 k2 t3) =
if key <= k1
then case deleteT23 _ key t1 of
Left t1 => Left (Node3 t1 k1 t2 k2 t3)
Right MkUnit => Left (Node2 t2 k2 t3)
else if key <= k2 then case deleteT23 _ key t2 of
Left t2 => Left (Node3 t1 k1 t2 k2 t3)
Right _ => Left (Node2 t1 k1 t3)
else case deleteT23 _ key t3 of
Left t3 => Left (Node3 t1 k1 t2 k2 t3)
Right _ => Left (Node2 t1 k1 t2)
deleteT23 (S (S h)) key (Node2 t1 k1 t2) =
if key <= k1
then case deleteT23 (S h) key t1 of
Left t1 => Left (Node2 t1 k1 t2)
Right t1 => case t2 of
Node2 t2' k2' t3' => Right (Node3 t1 k1 t2' k2' t3')
Node3 t2 k2 t3 k3 t4 => Left $ Node4 t1 k1 t2 k2 t3 k3 t4
else case deleteT23 _ key t2 of
Left t2 => Left (Node2 t1 k1 t2)
Right t2 => case t1 of
Node2 a b c => Right (Node3 a b c k1 t2)
Node3 a b c d e => Left (Node4 a b c d e k1 t2)
deleteT23 (S (S h)) key (Node3 t1 k1 t2 k2 t3) =
if key <= k1
then case deleteT23 _ key t1 of
Left t1 => Left (Node3 t1 k1 t2 k2 t3)
Right t1 => Left (merge1 t1 k1 t2 k2 t3)
else if key <= k2 then case deleteT23 _ key t2 of
Left t2 => Left (Node3 t1 k1 t2 k2 t3)
Right t2 => Left (merge2 t1 k1 t2 k2 t3)
else case deleteT23 _ key t3 of
Left t3 => Left (Node3 t1 k1 t2 k2 t3)
Right t3 => Left (merge3 t1 k1 t2 k2 t3)
treeLeft : h k v. T23 h k v (k × v)
treeLeft (Leaf k v) = (k, v)
treeLeft (Node2 t1 _ _) = treeLeft t1
treeLeft (Node3 t1 _ _ _ _) = treeLeft t1
treeRight : h k v. T23 h k v (k × v)
treeRight (Leaf k v) = (k, v)
treeRight (Node2 _ _ t2) = treeRight t2
treeRight (Node3 _ _ _ _ t3) = treeRight t3
data SortedMap : U -> U -> U where
EmptyMap : k v. SortedMap k v
-- not erased so we know what happens in delete
MapOf : k v. {h : Nat} T23 h k v -> SortedMap k v
deleteMap : k v. {{Ord k}} {{Eq k}} k SortedMap k v SortedMap k v
deleteMap key EmptyMap = EmptyMap
-- REVIEW if I split h separately in a nested case, it doesn't sort out Hole
deleteMap key (MapOf {k} {v} {Z} tree) = case deleteT23 Z key tree of
Left t => MapOf t
Right t => EmptyMap
deleteMap key (MapOf {k} {v} {S n} tree) = case deleteT23 (S n) key tree of
Left t => MapOf t
Right t => MapOf t
leftMost : k v. SortedMap k v Maybe (k × v)
leftMost EmptyMap = Nothing
leftMost (MapOf m) = Just (treeLeft m)
rightMost : k v. SortedMap k v Maybe (k × v)
rightMost EmptyMap = Nothing
rightMost (MapOf m) = Just (treeRight m)
-- TODO issue with metas and case if written as `do` block
pop : k v. {{Eq k}} {{Ord k}} SortedMap k v Maybe ((k × v) × SortedMap k v)
pop m = case leftMost m of
Just (k,v) => Just ((k,v), deleteMap k m)
Nothing => Nothing
lookupMap : k v. {{Ord k}} {{Eq k}} -> k -> SortedMap k v -> Maybe (k × v)
lookupMap k EmptyMap = Nothing
lookupMap k (MapOf map) = lookupT23 k map
lookupMap' : k v. {{Ord k}} {{Eq k}} -> k -> SortedMap k v -> Maybe v
lookupMap' k EmptyMap = Nothing
lookupMap' k (MapOf map) = snd <$> lookupT23 k map
updateMap : k v. {{Ord k}} {{Eq k}} -> k -> v -> SortedMap k v -> SortedMap k v
updateMap k v EmptyMap = MapOf $ Leaf k v
updateMap k v (MapOf map) = case insertT23 k v map of
Left map' => MapOf map'
Right (a, b, c) => MapOf (Node2 a b c)
toList : k v. SortedMap k v List (k × v)
toList {k} {v} (MapOf smap) = reverse $ go smap Nil
where
go : h. T23 h k v List (k × v) List (k × v)
go (Leaf k v) acc = (k, v) :: acc
go (Node2 t1 k1 t2) acc = go t2 (go t1 acc)
go (Node3 t1 k1 t2 k2 t3) acc = go t3 $ go t2 $ go t1 acc
toList _ = Nil
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