ability to run code and check output in tests
This commit is contained in:
6
aoc2024/Day1.newt.golden
Normal file
6
aoc2024/Day1.newt.golden
Normal 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
18
aoc2024/Day10.newt.golden
Normal 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
|
||||
6
aoc2024/Day11.newt.golden
Normal file
6
aoc2024/Day11.newt.golden
Normal file
@@ -0,0 +1,6 @@
|
||||
aoc2024/day11/eg.txt
|
||||
part1 55312
|
||||
part2 65601038650482
|
||||
aoc2024/day11/input.txt
|
||||
part1 186175
|
||||
part2 220566831337810
|
||||
6
aoc2024/Day11b.newt.golden
Normal file
6
aoc2024/Day11b.newt.golden
Normal file
@@ -0,0 +1,6 @@
|
||||
aoc2024/day11/eg.txt
|
||||
part1 55312
|
||||
part2 65601038650482
|
||||
aoc2024/day11/input.txt
|
||||
part1 186175
|
||||
part2 220566831337810
|
||||
9
aoc2024/Day12.newt.golden
Normal file
9
aoc2024/Day12.newt.golden
Normal 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
|
||||
6
aoc2024/Day13.newt.golden
Normal file
6
aoc2024/Day13.newt.golden
Normal 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
109
aoc2024/Day14.newt.golden
Normal file
@@ -0,0 +1,109 @@
|
||||
aoc2024/day14/input.txt
|
||||
(121, 119, 119, 132)
|
||||
part1 226179492
|
||||
500
|
||||
7502
|
||||
..................................*.*................................................................
|
||||
.....................................................................................................
|
||||
...................................*..........................*......................................
|
||||
...............*..............................................*..................................*...
|
||||
.....*.......................*..............................*........................................
|
||||
.....................................................................................................
|
||||
.....................................................................................................
|
||||
.....................................................................................................
|
||||
.............*.........................*.............................................................
|
||||
........................................................*............................................
|
||||
.....................................................................................................
|
||||
.....................................................................................................
|
||||
......................................................................................*..............
|
||||
........................................................*.*..........................................
|
||||
....................................*................................................................
|
||||
.....................................................................................................
|
||||
....................................................................*................................
|
||||
.................*...................................................................................
|
||||
....................................*...............*******************************..................
|
||||
..................*..................*............*.*.............................*..................
|
||||
.......*............................................*.............................*..**..............
|
||||
....................................................*.............................*..................
|
||||
.......*........................*...................*.............................*..................
|
||||
....................................................*..............*..............*..............*...
|
||||
.................*..................................*.............***.............*..................
|
||||
........*...........................................*............*****............*...*..............
|
||||
....................................................*...........*******...........*..................
|
||||
....................................................*..........*********..........*...*..............
|
||||
....................................................*............*****............*..................
|
||||
....................................................*...........*******...........*.......*..........
|
||||
.....................*..............................*..........*********..........*.................*
|
||||
....................................................*.........***********.........*..................
|
||||
......*.............................................*........*************........*..................
|
||||
............................................*.......*..........*********..........*..................
|
||||
....................................................*.........***********.........*..................
|
||||
....................................................*........*************........*..................
|
||||
....................................................*.......***************.......*..................
|
||||
....................................................*......*****************......*..................
|
||||
....................................................*........*************........*..................
|
||||
....................................................*.......***************.......*..................
|
||||
....................................................*......*****************......*..................
|
||||
...........*..........................*.............*.....*******************.....*..................
|
||||
.......*...*........................................*....*********************....*..................
|
||||
....................................................*.............***.............*..................
|
||||
.........*......................................*...*.............***.............*..................
|
||||
...................................*................*.............***.............*..................
|
||||
....................................................*.............................*.......*..........
|
||||
......*...*.........................................*.............................*..................
|
||||
.....................*..............................*.............................*..................
|
||||
.............................*......................*.............................*..................
|
||||
.................................*.........*........*******************************..................
|
||||
............*....................................*..........................................*....*...
|
||||
.........*........*...........................................*......................*...............
|
||||
...................................................*.*..............*................................
|
||||
.....................................................................................................
|
||||
....*..............................................*..........................*......................
|
||||
....................................*..............................*.................................
|
||||
..................*..................................................................................
|
||||
....*...............................................*..............*.................*...............
|
||||
..*.*....................................*................*..........................................
|
||||
................*..............*...............................*.....................................
|
||||
......*..........*..............*.......................................*............................
|
||||
......................................................*..............................................
|
||||
.................*............................................................*......................
|
||||
.....................................................................................................
|
||||
..................................................................................*...*..............
|
||||
.....................................................................................................
|
||||
....................*................................................................*...............
|
||||
.....................................................................................................
|
||||
.....................................................................................................
|
||||
............*...........................................................................*............
|
||||
.....................................................................................................
|
||||
.......*...*.......................................................................*.................
|
||||
........................................*.......................................................*....
|
||||
...........*........*............*..................................................................*
|
||||
................................................................................................*....
|
||||
...............*...............................*.....................................................
|
||||
..*......................................................*..................*.......................*
|
||||
.........*...........................................................................................
|
||||
*.....................*.........................................................................*....
|
||||
...............................................................................*.....................
|
||||
.....................................................................................................
|
||||
........................................................*..........................*.................
|
||||
.......................................*.............................................................
|
||||
.....................................................................................................
|
||||
*..................................*.................................................................
|
||||
.......................................................*.............................................
|
||||
.......................................*.....................*.......................................
|
||||
..............*.*.....................................*......................................*.......
|
||||
.....................................................................................................
|
||||
.....................................................................................................
|
||||
................................*....................................................................
|
||||
......*..............................................................................................
|
||||
.......................*....*........................................................................
|
||||
..........................*...................................................*...........*..........
|
||||
.......*...................................................*...................*.*...................
|
||||
.......................*.............................................................................
|
||||
..........*...........................................*..............................................
|
||||
...................................................................*.................................
|
||||
......................................*............................*.................................
|
||||
..........................................*............*....................*........................
|
||||
.....................................................................................................
|
||||
...*.................................................................................................
|
||||
|
||||
6
aoc2024/Day15.newt.golden
Normal file
6
aoc2024/Day15.newt.golden
Normal file
@@ -0,0 +1,6 @@
|
||||
aoc2024/day15/eg.txt
|
||||
part1 10092
|
||||
part2 9021
|
||||
aoc2024/day15/input.txt
|
||||
part1 1406628
|
||||
part2 1432781
|
||||
9
aoc2024/Day16.newt.golden
Normal file
9
aoc2024/Day16.newt.golden
Normal 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
11
aoc2024/Day17.newt.golden
Normal 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
10
aoc2024/Day18.newt.golden
Normal 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
|
||||
6
aoc2024/Day19.newt.golden
Normal file
6
aoc2024/Day19.newt.golden
Normal 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
6
aoc2024/Day2.newt.golden
Normal file
@@ -0,0 +1,6 @@
|
||||
aoc2024/day2/eg.txt
|
||||
part1 2
|
||||
part2 4
|
||||
aoc2024/day2/input.txt
|
||||
part1 524
|
||||
part2 569
|
||||
8
aoc2024/Day20.newt.golden
Normal file
8
aoc2024/Day20.newt.golden
Normal 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
|
||||
8
aoc2024/Day20b.newt.golden
Normal file
8
aoc2024/Day20b.newt.golden
Normal 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
|
||||
8
aoc2024/Day21.newt.golden
Normal file
8
aoc2024/Day21.newt.golden
Normal 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
|
||||
8
aoc2024/Day21monad.newt.golden
Normal file
8
aoc2024/Day21monad.newt.golden
Normal 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
|
||||
6
aoc2024/Day22.newt.golden
Normal file
6
aoc2024/Day22.newt.golden
Normal file
@@ -0,0 +1,6 @@
|
||||
aoc2024/day22/eg2.txt
|
||||
part1 37990510
|
||||
part2 23
|
||||
aoc2024/day22/input.txt
|
||||
part1 13429191512
|
||||
part2 1582
|
||||
6
aoc2024/Day22b.newt.golden
Normal file
6
aoc2024/Day22b.newt.golden
Normal 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
10
aoc2024/Day23.newt.golden
Normal 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
|
||||
@@ -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
|
||||
|
||||
8
aoc2024/Day24.newt.golden
Normal file
8
aoc2024/Day24.newt.golden
Normal 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
|
||||
|
||||
@@ -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)
|
||||
|
||||
6
aoc2024/Day25.newt.golden
Normal file
6
aoc2024/Day25.newt.golden
Normal 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
6
aoc2024/Day3.newt.golden
Normal 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
6
aoc2024/Day4.newt.golden
Normal 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
8
aoc2024/Day5.newt.golden
Normal 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
8
aoc2024/Day6.newt.golden
Normal 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
6
aoc2024/Day7.newt.golden
Normal 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
10
aoc2024/Day8.newt.golden
Normal 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
8
aoc2024/Day9.newt.golden
Normal 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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user