RosettaCodeData/Task/Range-consolidation/Dyalect/range-consolidation.dyalect
2023-07-01 13:44:08 -04:00

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)
}