···22import "trilogy:debug" use dbg
33import "trilogy:iterator" use map, fold
44import "trilogy:string" use skip
55-import "trilogy:parsec" use parse, integer
55+import "trilogy:number" use parse_from_digits
6677func combine [a] = "${a}${a}"
88func combine [a, .._, b] = "${a}${b}"
···3030 let total = readlines
3131 |> map digits
3232 |> map combine
3333- |> map (parse integer)
3333+ |> map parse_from_digits
3434 |> fold (+) 0
3535 dbg!(total)
3636}
+2-3
2023/2/p2.tri
···33import "trilogy:compare" use max
44import "trilogy:array" use fold, flatten
55import "trilogy:iterator" as it
66+import "trilogy:record" use update
67import "trilogy:parsec" use parse, apply, string, integer, char, sep_by_1, prefixed_by, choice
7889slot init = {| "red" => 0, "green" => 0, "blue" => 0 |}
9101010-func max_color {| "red" => best, ..cs |} n:"red" = {| "red" => max n best, ..cs |}
1111-func max_color {| "green" => best, ..cs |} n:"green" = {| "green" => max n best, ..cs |}
1212-func max_color {| "blue" => best, ..cs |} n:"blue" = {| "blue" => max n best, ..cs |}
1111+func max_color n:col rec = update (max n) 0 col rec
13121413func power {| "red" => r, "green" => g, "blue" => b |} = r * g * b
1514
+1-1
2025/1/p2.tri
···1010 return if dir == 'R' then amt else -amt
1111}
12121313-func rotate pos amt = {
1313+func rotate amt pos = {
1414 let full = abs amt // 100
1515 let rotated = pos + amt % 100
1616 let crossed = rotated < 0 || rotated > 99
···11import "trilogy:debug" use dbg
22import "trilogy:io" use readlines
33import "trilogy:string" use chars, chomp
44-import "trilogy:number" use from_digit
44+import "trilogy:number" use from_digit, from_digits_base
55import "trilogy:compare" use max
66import "trilogy:iterator" as it
77import "trilogy:array" as arr use take, skip
···2626 >> chars
2727 >> arr::map from_digit
2828 >> joltage
2929- >> arr::fold (fn a b. a * 10 + b) 0
2929+ >> from_digits_base 10
3030 )
3131 |> it::sum
3232 dbg!(total)
+1-1
2025/5/p2.tri
···1919 let fresh:_ = readall!()
2020 |> parse input
2121 |> sort_by (asc <| fn a. a.'left)
2222- |> fold (fn (fresh:index) (low:high). fresh + ((max index (high + 1)) - (max index low)):(max index (high + 1))) (0:0)
2222+ |> fold (fn (low:high) (fresh:index). fresh + ((max index (high + 1)) - (max index low)):(max index (high + 1))) (0:0)
2323 dbg!(fresh)
2424}
+2-1
2025/7/p2.tri
···44import "trilogy:number" use im
55import "trilogy:compare" use max
66import "trilogy:array" use map, reduce, length
77+import "trilogy:record" use update
78import "trilogy:set" use push, contains, collect
89import "trilogy:iterator" as it
910···3940 beams = beams
4041 |> it::from
4142 |> it::flat_map (fn beam:val. if contains beam splitters then it::from [beam + 1 + 1i: val, beam - 1 + 1i: val] else it::of (beam + 1i:val))
4242- |> it::fold (fn rec pos:val. {| ..rec, pos => val + with rec.pos { when 'mia cancel 0 } |}) {||}
4343+ |> it::fold (fn pos:val rec. update ((+) val) 0 pos rec) {||}
4344 i += 1
4445 }
4546 dbg!(reduce (+) [val for _:val in beams])
-15
2025/9/p2.tri
···2929 let points = readlines
3030 |> it::map (parse (sep_by (char ',') integer))
3131 |> collect
3232- dbg!('points(length points))
3333-3432 let edges = zip points [..tail points, first points]
3535- dbg!('edges(length edges))
36333734 # It has been observed that the shape is convex and without holes or interior crossings
3835 #
3936 # So we can make a series of rectangles that represent the illegal area by sending beams
4037 # from each edge
4138 let verticals = sort_by (asc <| (x << left)) <| filter is_vertical edges
4242- dbg!('verticals(length verticals))
4343-4439 let horizontals = sort_by (asc <| (y << left)) <| filter is_horizontal edges
4545- dbg!('horizontals(length horizontals))
4646-4740 let xs = map (x << left) verticals
4848- dbg!('xs(length xs))
4949-5041 let ys = map (y << left) horizontals
5151- dbg!('ys(length ys))
52425343 let [min_x, .._, max_x] = xs
5444 let [min_y, .._, max_y] = ys
55455646 let illegal = []
57475858- dbg!(min_x:max_x)
5959- dbg!(min_y:max_y)
6060-6148 let y_ranges = zip ys (tail ys)
6249 let mut i = 0
6350 while i < length y_ranges {
···7057 push!(illegal, [min_x, y1]:[x1, y2])
7158 push!(illegal, [x2, y1]:[max_x, y2])
7259 }
7373- dbg!('illegal(length illegal))
74607561 let x_ranges = zip xs (tail xs)
7662 let mut i = 0
···8470 push!(illegal, [x1, min_y]:[x2, y1])
8571 push!(illegal, [x1, y2]:[x2, max_y])
8672 }
8787- dbg!('illegal(length illegal))
88738974 # Then we just run standard collision of the area boxes with those
9075 let mut best = 0