+#! /usr/bin/python3
+
+import math as M
+import sys as SYS
+
+data = []
+for line in SYS.stdin: data.append(float(line))
+data.sort()
+data = [data]
+
+def cover(lo, hi):
+ mid = (lo + hi)/2
+ return mid, 1.0 - lo/mid
+
+def metric(vv):
+ print(";; measuring...")
+ tot = 0
+ for v in vv:
+ spread = M.pow(v[-1] - v[0], 0.5)
+ print(";;\t%g .. %g -> %g" % (v[0], v[-1], spread))
+ tot += spread
+ return tot
+
+def largest_gap(vv):
+ #print(";; finding gap...")
+ best, bestwd = None, None
+ for i, v in enumerate(vv):
+ lo = v[0]
+ for j in range(1, len(v)):
+ hi = v[j]
+ _, spread = cover(lo, hi)
+ #print(";;\t%d/%d: %g .. %g -> %g" % (i, j, lo, hi, spread))
+ if bestwd is None or spread > bestwd:
+ best, bestwd = (i, j), spread
+ lo = hi
+ #if best is None: print(";; already atomized")
+ #else: print(";; best gap %d/%d; %g" % (best[0], best[1], bestwd))
+ return best
+
+lastmetric = metric(data)
+while True:
+ best = largest_gap(data)
+ if best is None: break
+ i, j = best
+ newdata = data[:i] + [data[i][:j], data[i][j:]] + data[i + 1:]
+ newmetric = metric(newdata)
+ if newmetric > lastmetric: break
+ lastmetric, data = newmetric, newdata
+
+def format_duration(t):
+ f, t = M.modf(t)
+ frac = ("%g" % f)[1:]
+ if t >= 3600: return "%d:%02d:%02d%s" % (t//3600, (t//60)%60, t%60, frac)
+ elif t >= 60: return "%d:%02d%s" % (t//60, t%60, frac)
+ else: return "%d%s s" % (t, frac)
+
+for v in data:
+ mid, spread = cover(v[0], v[-1])
+ print("%s ± %g%%" % (format_duration(mid), 100.0*spread))