40 lines
1 KiB
Text
40 lines
1 KiB
Text
type Pt(s, e) with Lookup
|
|
|
|
func Pt.Min() => min(this.s, this.e)
|
|
func Pt.Max() => max(this.s, this.e)
|
|
func Pt.ToString() => "(\(this.s), \(this.e))"
|
|
|
|
let rng = [
|
|
[ Pt(1.1, 2.2) ],
|
|
[ Pt(6.1, 7.2), Pt(7.2, 8.3) ],
|
|
[ Pt(4.0, 3.0), Pt(2, 1) ],
|
|
[ Pt(4.0, 3.0), Pt(2, 1), Pt(-1, 2), Pt(3.9, 10) ],
|
|
[ Pt(1.0, 3.0), Pt(-6, -1), Pt(-4, -5), Pt(8, 2), Pt(-6, -6) ]
|
|
]
|
|
|
|
func overlap(left, right) =>
|
|
left.Max() > right.Max() ? right.Max() >= left.Min()
|
|
: left.Max() >= right.Min()
|
|
|
|
func consolidate(left, right) => Pt(min(left.Min(), right.Min()), max(left.Max(), right.Max()))
|
|
|
|
func normalize(range) => Pt(range.Min(), range.Max())
|
|
|
|
for list in rng {
|
|
var z = list.Length() - 1
|
|
|
|
while z >= 1 {
|
|
for y in (z - 1)^-1..0 when overlap(list[z], list[y]) {
|
|
list[y] = consolidate(list[z], list[y])
|
|
break list.RemoveAt(z)
|
|
}
|
|
z -= 1
|
|
}
|
|
|
|
for i in list.Indices() {
|
|
list[i] = normalize(list[i])
|
|
}
|
|
|
|
list.Sort((x,y) => x.s - y.s)
|
|
print(list)
|
|
}
|