fn dist(a b : tuple3(int, int, int)) : int [ return (a.v1 - b.v1) * (a.v1 - b.v1) + (a.v2 - b.v2) * (a.v2 - b.v2) + (a.v3 - b.v3) * (a.v3 - b.v3); ] fn main [ var lines := list_break_to_lines(read_lazy(h[0])); var n_b := len(lines); var coords := empty(tuple3(int, int, int)); for l in lines do [ var c := map(list_break(l, ','), ston); coords +<= mktuple3(c[0], c[1], c[2]); ] var dists := empty(tuple3(int, int, int)); for i := 0 to n_b do [ for j := i + 1 to n_b do [ var d := dist(coords[i], coords[j]); dists +<= mktuple3(d, i, j); ] ] dists := list_sort(dists); var result : int; for n_conn := 1 to len(dists) do [ var connections := fill(empty(int), n_b); for i := 0 to n_conn do [ var a := dists[i].v2; var b := dists[i].v3; connections[a] +<= b; connections[b] +<= a; ] var used := fill(false, n_b); again: for i := 0 to n_b do [ if not used[i] then [ var size := 0; var worklist := 0 bts i; while worklist <> 0 do [ var j := bsr worklist; worklist btr= j; if used[j] then continue; used[j] := true; size += 1; for c in connections[j] do worklist bts= c; ] if size = n_b then [ var last_idx1 := dists[n_conn - 1].v2; var last_idx2 := dists[n_conn - 1].v3; result := coords[last_idx1].v1 * coords[last_idx2].v1; goto have_it; ] goto again; ] ] ] abort; have_it: write(h[1], ntos(result) + nl); ]