···1+import "trilogy:io" use readall
2+import "trilogy:debug" use dbg
3+import "trilogy:core" use length
4+import "trilogy:parsec" as p use parse, per_line, many_1, digit
5+import "trilogy:number" use from_digit
6+import "trilogy:grid" as grid
7+8+proc main!() {
9+ let input = parse (per_line (many_1 <| p::map from_digit digit)) readall!()
10+ let h = length input
11+ let w = length <| input.0
12+13+ let goal = grid::coord (w - 1) (h - 1)
14+ let input_grid = grid::from input
15+ let risk = grid::shortest_path_length!(input_grid, 0, goal)
16+ dbg!(risk)
17+}
+38
2021/15/p2.tri
···00000000000000000000000000000000000000
···1+import "trilogy:io" use readall
2+import "trilogy:debug" use dbg
3+import "trilogy:core" use length
4+import "trilogy:parsec" as p use parse, per_line, many_1, digit
5+import "trilogy:number" use from_digit
6+import "trilogy:compare" use max
7+import "trilogy:grid" as grid
8+import "trilogy:array" as array
9+import "trilogy:iterator" as it
10+import "trilogy:algorithm" use shortest_path_length
11+12+proc main!() {
13+ let input = parse (per_line (many_1 <| p::map from_digit digit)) readall!()
14+15+ let tile_h = length input
16+ let tile_w = length <| input.0
17+ let h = 5 * tile_h
18+ let w = 5 * tile_w
19+20+ let goal = grid::coord (w - 1) (h - 1)
21+ let input_grid = grid::from input
22+23+ let risk = with shortest_path_length!(0, goal)
24+ when 'neighbours(from_pos) resume
25+ grid::adjacent from_pos
26+ |> it::from
27+ |> it::filter (fn p. grid::x p >= 0 && grid::y p >= 0 && grid::x p < w && grid::y p < h)
28+ |> it::map (fn p.
29+ let offset_weight = (grid::x p // tile_w) + (grid::y p // tile_h),
30+ let mod_pos = grid::coord (grid::x p % tile_w) (grid::y p % tile_h),
31+ let pos_weight = input_grid.mod_pos,
32+ let total_weight = offset_weight + pos_weight,
33+ p:if total_weight < 10 then total_weight else total_weight - 9
34+ )
35+ |> array::collect
36+ else yield
37+ dbg!(risk)
38+}