···11+import "trilogy:io" use readall
22+import "trilogy:debug" use dbg
33+import "trilogy:core" use length
44+import "trilogy:parsec" as p use parse, per_line, many_1, digit
55+import "trilogy:number" use from_digit
66+import "trilogy:grid" as grid
77+88+proc main!() {
99+ let input = parse (per_line (many_1 <| p::map from_digit digit)) readall!()
1010+ let h = length input
1111+ let w = length <| input.0
1212+1313+ let goal = grid::coord (w - 1) (h - 1)
1414+ let input_grid = grid::from input
1515+ let risk = grid::shortest_path_length!(input_grid, 0, goal)
1616+ dbg!(risk)
1717+}
+38
2021/15/p2.tri
···11+import "trilogy:io" use readall
22+import "trilogy:debug" use dbg
33+import "trilogy:core" use length
44+import "trilogy:parsec" as p use parse, per_line, many_1, digit
55+import "trilogy:number" use from_digit
66+import "trilogy:compare" use max
77+import "trilogy:grid" as grid
88+import "trilogy:array" as array
99+import "trilogy:iterator" as it
1010+import "trilogy:algorithm" use shortest_path_length
1111+1212+proc main!() {
1313+ let input = parse (per_line (many_1 <| p::map from_digit digit)) readall!()
1414+1515+ let tile_h = length input
1616+ let tile_w = length <| input.0
1717+ let h = 5 * tile_h
1818+ let w = 5 * tile_w
1919+2020+ let goal = grid::coord (w - 1) (h - 1)
2121+ let input_grid = grid::from input
2222+2323+ let risk = with shortest_path_length!(0, goal)
2424+ when 'neighbours(from_pos) resume
2525+ grid::adjacent from_pos
2626+ |> it::from
2727+ |> it::filter (fn p. grid::x p >= 0 && grid::y p >= 0 && grid::x p < w && grid::y p < h)
2828+ |> it::map (fn p.
2929+ let offset_weight = (grid::x p // tile_w) + (grid::y p // tile_h),
3030+ let mod_pos = grid::coord (grid::x p % tile_w) (grid::y p % tile_h),
3131+ let pos_weight = input_grid.mod_pos,
3232+ let total_weight = offset_weight + pos_weight,
3333+ p:if total_weight < 10 then total_weight else total_weight - 9
3434+ )
3535+ |> array::collect
3636+ else yield
3737+ dbg!(risk)
3838+}