fn n_paths~cache(conn : array(int, [ ipower(36, 3) ]), start end : int) : int [ if start = end then return 1; var t := conn[start]; var sum := 0; while t <> 0 do [ var f := bsr t; t btr= f; sum += n_paths(conn, f, end); ] return sum; ] fn main [ var lines := list_break_to_lines(read_lazy(h[0])); var conn := array_fill(0, [ ipower(36, 3) ]); for l in lines do [ var f := ston_base(l[ .. 3], 36); var tl := list_break_whitespace(l); var t := 0; for i := 1 to len(tl) do [ t bts= ston_base(tl[i], 36); ] conn[f] := t; ] var start := ston_base("svr", 36); var way1 := ston_base("dac", 36); var way2 := ston_base("fft", 36); var end := ston_base("out", 36); var result := n_paths~spark(conn, start, way1) * n_paths~spark(conn, way1, way2) * n_paths~spark(conn, way2, end); result += n_paths~spark(conn, start, way2) * n_paths~spark(conn, way2, way1) * n_paths~spark(conn, way1, end); write(h[1], ntos(result) + nl); ]