aboutsummaryrefslogtreecommitdiff
path: root/challenge-276/atschneid/prolog/ch-2.pro
blob: 5b0bacc53fc9f22f03530adf70f31969a4472200 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
:- initialization(main).

head([H|_], H).

count_top( _, [], 0 ).
count_top( V, [H|_], X ) :-
    V =\= H, X is 0, !.
count_top( H, [H|T], X ) :-
    count_top( H, T, X0 ), succ( X0, X ).

count_adjacents( _, [], [1] ).
count_adjacents( I, [I|Is], [O|Os] ) :-
    count_adjacents( I, Is, [O0|Os] ), succ( O0, O ), !.
count_adjacents( _, [I|Is], [1|Os] ) :-
    count_adjacents( I, Is, Os ).

count_adjacents( [], 0 ).
count_adjacents( [I|T], Out ) :-
    count_adjacents( I, T, Out ).

max_freq_count( [], 0 ).
max_freq_count( L, X ) :-
    msort( L, L1 ), count_adjacents( L1, L2 ),
    msort( L2, L3 ), reverse( L3, L4 ),
    head( L4, H ),
    count_top( H, L4, X0 ),
    X is X0 * H.

output_helper( X, X ) :-
    format( " ~p ~n", [X] ).

main :-
    Inputs = [
	[1, 2, 2, 4, 1, 5],
	[1, 2, 3, 4, 5]
    ],
    maplist( max_freq_count, Inputs, Outputs ),
    maplist( output_helper, Outputs, _ ),
    halt.