tangled
alpha
login
or
join now
eldridge.cam
/
advent-of-code
2
fork
atom
Advent of Code solutions
2
fork
atom
overview
issues
pulls
pipelines
2025 day 11
eldridge.cam
3 months ago
1742fe29
6680869e
+76
2 changed files
expand all
collapse all
unified
split
2025
11
p1.tri
p2.tri
+24
2025/11/p1.tri
···
1
1
+
import "trilogy:debug" use dbg
2
2
+
import "trilogy:io" use readlines
3
3
+
import "trilogy:parsec" use parse, apply, word, sep_by_1, string, char
4
4
+
import "trilogy:array" use fold, map
5
5
+
import "trilogy:iterator" as it
6
6
+
import "trilogy:record" as rec
7
7
+
8
8
+
proc connection!() {
9
9
+
let source = apply word
10
10
+
apply <| string ": "
11
11
+
let outputs = apply (sep_by_1 (char ' ') word)
12
12
+
return source:outputs
13
13
+
}
14
14
+
15
15
+
func paths_from _ {||} = 0
16
16
+
func paths_from "out" _ = 1
17
17
+
func paths_from from {| ^from => to, ..rest |} =
18
18
+
fold (+) 0 <| map (fn to2. paths_from to2 rest) to
19
19
+
20
20
+
proc main!() {
21
21
+
let graph = rec::collect <| it::map (parse connection) <| readlines
22
22
+
dbg!(graph)
23
23
+
dbg!(paths_from "you" graph)
24
24
+
}
+52
2025/11/p2.tri
···
1
1
+
import "trilogy:debug" use dbg
2
2
+
import "trilogy:io" use readlines
3
3
+
import "trilogy:parsec" use parse, apply, word, sep_by_1, string, char
4
4
+
import "trilogy:array" use fold, map
5
5
+
import "trilogy:iterator" as it
6
6
+
import "trilogy:record" as rec
7
7
+
8
8
+
proc connection!() {
9
9
+
let source = apply word
10
10
+
apply <| string ": "
11
11
+
let outputs = apply (sep_by_1 (char ' ') word)
12
12
+
return source:outputs
13
13
+
}
14
14
+
15
15
+
proc pathfinder!(graph) {
16
16
+
let mut cache = {||}
17
17
+
let paths_between = do(from, dest) {
18
18
+
if from == dest {
19
19
+
return 1
20
20
+
}
21
21
+
if !(rec::contains_key from graph) {
22
22
+
return 0
23
23
+
}
24
24
+
if rec::contains_key (from:dest) cache {
25
25
+
return cache.(from:dest)
26
26
+
}
27
27
+
let to = graph.from
28
28
+
let result = fold (+) 0 <| map (fn to2. paths_between!(to2, dest)) to
29
29
+
cache.(from:dest) = result
30
30
+
return result
31
31
+
}
32
32
+
return fn a b. paths_between!(a, b)
33
33
+
}
34
34
+
35
35
+
proc main!() {
36
36
+
let graph = rec::collect <| it::map (parse connection) <| readlines
37
37
+
dbg!(graph)
38
38
+
39
39
+
let paths_between = pathfinder!(graph)
40
40
+
let dac_fft = paths_between "dac" "fft"
41
41
+
42
42
+
if dac_fft == 0 {
43
43
+
let inner = dbg!(paths_between "fft" "dac")
44
44
+
let prefix = dbg!(paths_between "svr" "fft")
45
45
+
let suffix = dbg!(paths_between "dac" "out")
46
46
+
dbg!(inner * prefix * suffix)
47
47
+
} else {
48
48
+
let prefix = dbg!(paths_between "svr" "dac")
49
49
+
let suffix = dbg!(paths_between "fft" "out")
50
50
+
dbg!(dac_fft * prefix * suffix)
51
51
+
}
52
52
+
}