Range consolidation: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (→{{header|Perl 6}}: Remove stray comma) |
(Added Dyalect programming language) |
||
Line 99: | Line 99: | ||
(-1, 2), (3, 10) |
(-1, 2), (3, 10) |
||
(-6, -1), (1, 8)</pre> |
(-6, -1), (1, 8)</pre> |
||
=={{header|Dyalect}}== |
|||
{{trans|C#}} |
|||
<lang dyalect>func max(x, y) { |
|||
if x > y { |
|||
x |
|||
} else { |
|||
y |
|||
} |
|||
} |
|||
func min(x, y) { |
|||
if x < y { |
|||
x |
|||
} else { |
|||
y |
|||
} |
|||
} |
|||
func overlap(left, right) { |
|||
if max(left.s, left.e) > max(right.s, right.e) { |
|||
max(right.s, right.e) >= min(left.s, left.e) |
|||
} else { |
|||
max(left.s, left.e) >= min(right.s, right.e) |
|||
} |
|||
} |
|||
func consolidate(left, right) { |
|||
(s: min(min(left.s, left.e), min(right.s, right.e)), e: max(max(left.s, left.e), max(right.s, right.e))) |
|||
} |
|||
func normalize(range) { |
|||
(s: min(range.s, range.e), e: max(range.s, range.e)) |
|||
} |
|||
for list in [ |
|||
[ (s: 1.1, e: 2.2) ], |
|||
[ (s: 6.1, e: 7.2), (s: 7.2, e: 8.3) ], |
|||
[ (s: 4.0, e: 3.0), (s: 2, e: 1) ], |
|||
[ (s: 4.0, e: 3.0), (s: 2, e: 1), (s: -1, e: 2), (s: 3.9, e: 10) ], |
|||
[ (s: 1.0, e: 3.0), (s: -6, e: -1), (s: -4, e: -5), (s: 8, e: 2), (s: -6, e: -6) ] |
|||
] { |
|||
var z = list.len()-1 |
|||
while z >= 1 { |
|||
for y in (z - 1)..0 { |
|||
if overlap(list[z], list[y]) { |
|||
list[y] = consolidate(list[z], list[y]) |
|||
list.removeAt(z) |
|||
break |
|||
} |
|||
} |
|||
z -= 1 |
|||
} |
|||
for i in list.indices() { |
|||
list[i] = normalize(list[i]) |
|||
} |
|||
list.sort((x,y) => x.s - y.s) |
|||
print(list) |
|||
} |
|||
</lang> |
|||
{{out}} |
|||
<pre>[(s: 1.1, e: 2.2)] |
|||
[(s: 6.1, e: 8.3)] |
|||
[(s: 1, e: 2), (s: 3, e: 4)] |
|||
[(s: -1, e: 2), (s: 3, e: 10)] |
|||
[(s: -6, e: -1), (s: 1, e: 8)]</pre> |
|||
=={{header|Go}}== |
=={{header|Go}}== |