Range consolidation: Difference between revisions

Content added Content deleted
(Added Prolog Solution)
m (Show ranges before and after consolidation)
Line 965: Line 965:
merge([Range], [Range]):-!.
merge([Range], [Range]):-!.
merge([r(Min1, Max1), r(Min2, Max2)|Rest], Merged):-
merge([r(Min1, Max1), r(Min2, Max2)|Rest], Merged):-
overlap(Min1, Max1, Min2, Max2),
Min2 =< Max1,
!,
!,
Min is min(Min1, Min2),
Max is max(Max1, Max2),
Max is max(Max1, Max2),
merge([r(Min, Max)|Rest], Merged).
merge([r(Min1, Max)|Rest], Merged).
merge([Range|Ranges], [Range|Merged]):-
merge([Range|Ranges], [Range|Merged]):-
merge(Ranges, Merged).
merge(Ranges, Merged).

overlap(Min1, Max1, Min2, Max2):-
Min1 =< Max2,
Min2 =< Max1.


write_range(r(Min, Max)):-
write_range(r(Min, Max)):-
Line 983: Line 978:
write_ranges([Range]):-
write_ranges([Range]):-
!,
!,
write_range(Range),
write_range(Range).
nl.
write_ranges([Range|Ranges]):-
write_ranges([Range|Ranges]):-
write_range(Range),
write_range(Range),
Line 999: Line 993:
forall(test_case(Ranges),
forall(test_case(Ranges),
(consolidate_ranges(Ranges, Consolidated),
(consolidate_ranges(Ranges, Consolidated),
write_ranges(Consolidated))).</lang>
write_ranges(Ranges), write(' -> '),
write_ranges(Consolidated), nl)).</lang>


{{out}}
{{out}}
<pre>
<pre>
[1.1, 2.2]
[1.1, 2.2] -> [1.1, 2.2]
[6.1, 8.3]
[6.1, 7.2], [7.2, 8.3] -> [6.1, 8.3]
[1, 2], [3, 4]
[4, 3], [2, 1] -> [1, 2], [3, 4]
[-2, -1], [1, 2], [3, 10]
[4, 3], [2, 1], [-1, -2], [3.9, 10] -> [-2, -1], [1, 2], [3, 10]
[-6, -1], [1, 8]
[1, 3], [-6, -1], [-4, -5], [8, 2], [-6, -6] -> [-6, -1], [1, 8]
</pre>
</pre>