Advent of Code solutions

2025 day 11

+76
+24
2025/11/p1.tri
··· 1 + import "trilogy:debug" use dbg 2 + import "trilogy:io" use readlines 3 + import "trilogy:parsec" use parse, apply, word, sep_by_1, string, char 4 + import "trilogy:array" use fold, map 5 + import "trilogy:iterator" as it 6 + import "trilogy:record" as rec 7 + 8 + proc connection!() { 9 + let source = apply word 10 + apply <| string ": " 11 + let outputs = apply (sep_by_1 (char ' ') word) 12 + return source:outputs 13 + } 14 + 15 + func paths_from _ {||} = 0 16 + func paths_from "out" _ = 1 17 + func paths_from from {| ^from => to, ..rest |} = 18 + fold (+) 0 <| map (fn to2. paths_from to2 rest) to 19 + 20 + proc main!() { 21 + let graph = rec::collect <| it::map (parse connection) <| readlines 22 + dbg!(graph) 23 + dbg!(paths_from "you" graph) 24 + }
+52
2025/11/p2.tri
··· 1 + import "trilogy:debug" use dbg 2 + import "trilogy:io" use readlines 3 + import "trilogy:parsec" use parse, apply, word, sep_by_1, string, char 4 + import "trilogy:array" use fold, map 5 + import "trilogy:iterator" as it 6 + import "trilogy:record" as rec 7 + 8 + proc connection!() { 9 + let source = apply word 10 + apply <| string ": " 11 + let outputs = apply (sep_by_1 (char ' ') word) 12 + return source:outputs 13 + } 14 + 15 + proc pathfinder!(graph) { 16 + let mut cache = {||} 17 + let paths_between = do(from, dest) { 18 + if from == dest { 19 + return 1 20 + } 21 + if !(rec::contains_key from graph) { 22 + return 0 23 + } 24 + if rec::contains_key (from:dest) cache { 25 + return cache.(from:dest) 26 + } 27 + let to = graph.from 28 + let result = fold (+) 0 <| map (fn to2. paths_between!(to2, dest)) to 29 + cache.(from:dest) = result 30 + return result 31 + } 32 + return fn a b. paths_between!(a, b) 33 + } 34 + 35 + proc main!() { 36 + let graph = rec::collect <| it::map (parse connection) <| readlines 37 + dbg!(graph) 38 + 39 + let paths_between = pathfinder!(graph) 40 + let dac_fft = paths_between "dac" "fft" 41 + 42 + if dac_fft == 0 { 43 + let inner = dbg!(paths_between "fft" "dac") 44 + let prefix = dbg!(paths_between "svr" "fft") 45 + let suffix = dbg!(paths_between "dac" "out") 46 + dbg!(inner * prefix * suffix) 47 + } else { 48 + let prefix = dbg!(paths_between "svr" "dac") 49 + let suffix = dbg!(paths_between "fft" "out") 50 + dbg!(dac_fft * prefix * suffix) 51 + } 52 + }