Range consolidation: Difference between revisions

Added Prolog Solution
m (→‎{{header|Raku}}: Fix link: Perl 6 --> Raku)
(Added Prolog Solution)
Line 948:
{{4,3},{2,1},{-1,-2},{3.9,10}} => {{-2,-1},{1,2},{3,10}}
{{1,3},{-6,-1},{-4,-5},{8,2},{-6,-6}} => {{-6,-1},{1,8}}
</pre>
 
=={{header|Prolog}}==
{{works with|SWI Prolog}}
<lang prolog>consolidate_ranges(Ranges, Consolidated):-
normalize(Ranges, Normalized),
sort(Normalized, Sorted),
merge(Sorted, Consolidated).
 
normalize([], []):-!.
normalize([r(X, Y)|Ranges], [r(Min, Max)|Normalized]):-
(X > Y -> Min = Y, Max = X; Min = X, Max = Y),
normalize(Ranges, Normalized).
 
merge([], []):-!.
merge([Range], [Range]):-!.
merge([r(Min1, Max1), r(Min2, Max2)|Rest], Merged):-
overlap(Min1, Max1, Min2, Max2),
!,
Min is min(Min1, Min2),
Max is max(Max1, Max2),
merge([r(Min, Max)|Rest], Merged).
merge([Range|Ranges], [Range|Merged]):-
merge(Ranges, Merged).
 
overlap(Min1, Max1, Min2, Max2):-
Min1 =< Max2,
Min2 =< Max1.
 
write_range(r(Min, Max)):-
writef('[%w, %w]', [Min, Max]).
 
write_ranges([]):-!.
write_ranges([Range]):-
!,
write_range(Range),
nl.
write_ranges([Range|Ranges]):-
write_range(Range),
write(', '),
write_ranges(Ranges).
 
test_case([r(1.1, 2.2)]).
test_case([r(6.1, 7.2), r(7.2, 8.3)]).
test_case([r(4, 3), r(2, 1)]).
test_case([r(4, 3), r(2, 1), r(-1, -2), r(3.9, 10)]).
test_case([r(1, 3), r(-6, -1), r(-4, -5), r(8, 2), r(-6, -6)]).
 
main:-
forall(test_case(Ranges),
(consolidate_ranges(Ranges, Consolidated),
write_ranges(Consolidated))).</lang>
 
{{out}}
<pre>
[1.1, 2.2]
[6.1, 8.3]
[1, 2], [3, 4]
[-2, -1], [1, 2], [3, 10]
[-6, -1], [1, 8]
</pre>
 
1,777

edits