d19p2
This commit is contained in:
parent
cbe8fbde87
commit
43a83d487b
26
19/part2.pl
26
19/part2.pl
@ -4,11 +4,19 @@
|
|||||||
|
|
||||||
main([FileName|_]) :-
|
main([FileName|_]) :-
|
||||||
input(FileName, Workflows),
|
input(FileName, Workflows),
|
||||||
findall(Limit, (wf(Workflows, in, Route, Limit), write(Route), write(" - "), write(Limit), nl), Limits),
|
findall(
|
||||||
or_limits(Limits, NewLimit),
|
Count-Limit,
|
||||||
write(NewLimit), nl,
|
(
|
||||||
choices(NewLimit, Answer),
|
wf(Workflows, in, Route, Limit),
|
||||||
write(Answer), nl.
|
Limit = [x-Xmin-Xmax, m-Mmin-Mmax, a-Amin-Amax, s-Smin-Smax],
|
||||||
|
Count is (Xmax - Xmin)*(Mmax - Mmin)*(Amax - Amin)*(Smax - Smin),
|
||||||
|
write(Route), write(" - "), write(Limit), write(" - "), write(Count), nl
|
||||||
|
),
|
||||||
|
Limits),
|
||||||
|
length(Limits, LenLimits), write("lenlimits = "), write(LenLimits), nl,
|
||||||
|
maplist([Count-Limit, Count]>>(true), Limits, CountsOnly),
|
||||||
|
sum_list(CountsOnly, Answer), write("answer = "), write(Answer), nl,
|
||||||
|
true.
|
||||||
|
|
||||||
choices(Limit, N) :-
|
choices(Limit, N) :-
|
||||||
foldl([_-Min-Max, V0, V]>>(V is V0*(Max - Min + 1)), Limit, 1, N).
|
foldl([_-Min-Max, V0, V]>>(V is V0*(Max - Min + 1)), Limit, 1, N).
|
||||||
@ -22,8 +30,8 @@ or_limits([Limit1, Limit2 | Limits], Limit) :-
|
|||||||
NewLimit),
|
NewLimit),
|
||||||
or_limits([NewLimit|Limits], Limit).
|
or_limits([NewLimit|Limits], Limit).
|
||||||
|
|
||||||
|
% x -> [Min, Max)
|
||||||
wf(_, accept, [accept], [x-1-4000, m-1-4000, a-1-4000, s-1-4000]).
|
wf(_, accept, [accept], [x-1-4001, m-1-4001, a-1-4001, s-1-4001]).
|
||||||
wf(Workflows, WorkflowName, [WorkflowName|Route], Limits) :-
|
wf(Workflows, WorkflowName, [WorkflowName|Route], Limits) :-
|
||||||
\+ WorkflowName = accept, \+ WorkflowName = reject,
|
\+ WorkflowName = accept, \+ WorkflowName = reject,
|
||||||
member(WorkflowName-Rules, Workflows),
|
member(WorkflowName-Rules, Workflows),
|
||||||
@ -46,9 +54,9 @@ with_rule(Workflows, [Attr-Cond-N-Dest|Rules], Route, NewLimits) :-
|
|||||||
|
|
||||||
negate('<'-N, '>'-NewN) :- NewN is N - 1.
|
negate('<'-N, '>'-NewN) :- NewN is N - 1.
|
||||||
negate('>'-N, '<'-NewN) :- NewN is N + 1.
|
negate('>'-N, '<'-NewN) :- NewN is N + 1.
|
||||||
combine(Min-Max, '<'-N, Min-NewMax) :- NewMax is min(N-1, Max), Min < NewMax.
|
combine(Min-Max, '<'-N, Min-NewMax) :- NewMax is min(N, Max), Min < NewMax.
|
||||||
combine(Min-Max, '>'-N, NewMin-Max) :- NewMin is max(N+1, Min), NewMin < Max.
|
combine(Min-Max, '>'-N, NewMin-Max) :- NewMin is max(N+1, Min), NewMin < Max.
|
||||||
|
|
||||||
% input parsing stuff below
|
% input parsing stuff below
|
||||||
input(FileName, Workflows) :-
|
input(FileName, Workflows) :-
|
||||||
phrase_from_file((workflows(Workflows), remainder(_)), FileName).
|
phrase_from_file((workflows(Workflows), remainder(_)), FileName).
|
||||||
|
Loading…
Reference in New Issue
Block a user