aboutsummaryrefslogtreecommitdiff
path: root/challenge-276/atschneid/prolog/ch-1.pro
blob: 8c48194ac83686f4bd85f2d0b455b187c07336fb (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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
:- initialization(main).

increment_count_recur( _, _, [], []).
increment_count_recur( Index, Current, [O|Os], [N|Ns] ) :-
    Index > Current, N = O, succ(Current, C1),
    increment_count_recur( Index, C1, Os, Ns ).
increment_count_recur( Index, Index, [O|Os], [N|Os] ) :-
    succ(O,N).

increment_count( Index, Old, New ) :-
    increment_count_recur( Index, 0, Old, New ).

sum_inverses( [], _, 0 ).
sum_inverses( [H|T], Counts, X ) :-
    Idx is H mod 24, InvIdx is (24 - Idx) mod 24,
    succ(Idx, Idx1), nth(Idx1, Counts, Xplus),
    increment_count(InvIdx, Counts, Counts1),
    sum_inverses( T, Counts1, X1 ),
    X is X1 + Xplus.

check_completed_days_v2( [], 0 ).
check_completed_days_v2( Days, Count ) :-
    sum_inverses(
	Days,
	[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
	Count).

check_reciprocal_count( _, [], 0 ).
check_reciprocal_count( V, [H|T], X ) :-
    0 =:= (V + H) mod 24,
    check_reciprocal_count( V, T, X1 ),
    succ(X1, X).
check_reciprocal_count( V, [H|T], X ) :-
    0 =\= (V + H) mod 24,
    check_reciprocal_count( V, T, X ).

check_completed_days_v1( [], 0 ).
check_completed_days_v1( [H|T], X ) :-
    check_reciprocal_count( H, T, X1 ),
    check_completed_days_v1( T, X2 ),
    X is X1 + X2.

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

main :-
    Inputs = [
	[12, 12, 30, 24, 24],
	[72, 48, 24, 5],
	[12, 18, 24],
	[36, 36, 36, 1, 1, 1, 1, 1, 1, 47, 47, 47, 47]
    ],
    maplist( check_completed_days_v1, Inputs, Outputs ),
    maplist( output_helper, Outputs, _ ),
    halt.