type t := real128; record hail [ x y z : t; vx vy vz : t; ] fn solve_it(h1 h2 h3 : hail) : (int, int, int) [ var xh1 := h1.x; var yh1 := h1.y; var zh1 := h1.z; var vxh1 := h1.vx; var vyh1 := h1.vy; var vzh1 := h1.vz; var xh2 := h2.x; var yh2 := h2.y; var zh2 := h2.z; var vxh2 := h2.vx; var vyh2 := h2.vy; var vzh2 := h2.vz; var xh3 := h3.x; var yh3 := h3.y; var zh3 := h3.z; var vxh3 := h3.vx; var vyh3 := h3.vy; var vzh3 := h3.vz; var ax := (xh3-xh1)*(yh2-yh1); var ay := (yh3-yh1)*(xh2-xh1); var aymax := ay-ax; var bx := (vxh3-vxh1)*(yh2-yh1)+(xh3-xh1)*(vyh3-vyh1); var by := (vyh3-vyh1)*(xh2-xh1)+(yh3-yh1)*(vxh3-vxh1); var bxmby := bx-by; var cx := (xh3-xh1)*(vyh2-vyh3); var cy := (yh3-yh1)*(vxh2-vxh3); var cymcx := cy-cx; var dx := (vxh3-vxh1)*(vyh2-vyh3); var dy := (vyh3-vyh1)*(vxh2-vxh3); var dxmdy := dx-dy; var ex := (xh3-xh1)*(zh2-zh1); var ey := (zh3-zh1)*(xh2-xh1); var eymex := ey-ex; var fx := (vxh3-vxh1)*(zh2-zh1)+(xh3-xh1)*(vzh3-vzh1); var fy := (vzh3-vzh1)*(xh2-xh1)+(zh3-zh1)*(vxh3-vxh1); var fxmfy := fx-fy; var gx := (xh3-xh1)*(vzh2-vzh3); var gy := (zh3-zh1)*(vxh2-vxh3); var gymgx := gy-gx; var hx := (vxh3-vxh1)*(vzh2-vzh3); var hy := (vzh3-vzh1)*(vxh2-vxh3); var hxmhy := hx-hy; var a := cymcx*hxmhy-gymgx*dxmdy; var b := aymax*hxmhy+cymcx*fxmfy-eymex*dxmdy-gymgx*bxmby; var c := aymax*fxmfy-eymex*bxmby; var t21 := (-b+sqrt(b*b-4*a*c))/(2*a); var t22 := (-b-sqrt(b*b-4*a*c))/(2*a); var t11 := (aymax+t21*cymcx)/(bxmby+t21*dxmdy); var t12 := (aymax+t22*cymcx)/(bxmby+t22*dxmdy); //eval debug(format("% %; % %", [t11, t21, t12, t22])); var t1i : int := round(t11); var t2i : int := round(t21); fn is_valid(r : t, ri : int) := not is_exception ri and r >= 0 and abs(r - ri) < 0.0000000001; if not is_valid(t11, t1i) or not is_valid(t21, t2i) then [ t1i := round(t12); t2i := round(t22); if not is_valid(t12, t1i) or not is_valid(t22, t2i) then [ abort; ] ] //eval debug(ntos(t1i) + ", " + ntos(t2i)); var vxr := (xh1 - xh2 + vxh1 * t1i - vxh2 * t2i) / (t1i - t2i); var vyr := (yh1 - yh2 + vyh1 * t1i - vyh2 * t2i) / (t1i - t2i); var vzr := (zh1 - zh2 + vzh1 * t1i - vzh2 * t2i) / (t1i - t2i); //eval debug("v: " + ntos(vxr) + ", " + ntos(vyr) + ", " + ntos(vzr)); var xr : int := round(xh1 + vxh1 * t1i - vxr * t1i); var yr : int := round(yh1 + vyh1 * t1i - vyr * t1i); var zr : int := round(zh1 + vzh1 * t1i - vzr * t1i); //eval debug("pos: " + ntos(xr) + ", " + ntos(yr) + ", " + ntos(zr)); return xr, yr, zr; ] fn main [ var lines := list_break_to_lines(read_lazy(h[0])); var test_area_start : t := select(len(lines) <> 5, 7, 200000000000000); var test_area_end : t := select(len(lines) <> 5, 27, 400000000000000); var hails := empty(hail); for line in lines do [ line := list_replace_substring(line, " @ ", ","); line := list_replace_substring(line, " ", ""); var num := map(list_break(line, ','), ston); hails +<= hail.[ x : num[0], y : num[1], z : num[2], vx : num[3], vy : num[4], vz : num[5], ]; ] var xr, yr, zr := solve_it(hails[0], hails[1], hails[2]); write(h[1], ntos(xr + yr + zr) + nl); ]