clpz:monotonic. :- use_module(library(pairs)). :- use_module(library(tabling)). range(X..Y) --> number(X), "-", number(Y). union(X,Y,X\/Y). input(I) :- phrase_from_file(sequence(range,",",[Range|Ranges]),"i/02.in"), foldl(union,Ranges,Range,I). table encode/4. encode(K,X,P,Z) :- length(Ls,P), foldl([K,X]+\_^Z0^Z^(#Z #= #X * #Z0 + #K),Ls,0,Z). num_digs(X,N) :- N in 1..20, 10^(#N-1) #=< #X, #X #< 10 ^ #N, indomain(N). silly(X,N,Rep) :- num_digs(X,D_), #D_ #= #D * #N, num_digs(Rep,D), #B #= 10 ^ #D, encode(Rep,B,N,X). sillies(I,Sillies) :- X in I, N in 2..10, findall(N-X,(silly(X,N,Rep),indomain(Rep)),Sillies). part(Pred) --> tfilter(Pred), pairs_values, list_to_set, sum. p1pred(N-_,T) :- =(N,2,T). p2pred(_, true). solve(P1,P2) :- input(I), sillies(I,Sillies), part(p1pred,Sillies,P1), part(p2pred,Sillies,P2). test :- make_test(day(2),solve,23560874270,44143124633).
It's only day 2, and I'm already struggling so much... This took a lot of planning to get a solution that executes in a reasonable time. It runs in under 10 seconds, which would normally be extremely slow. However, since I'm number crunching in Prolog, I consider that execution time to be a miracle. Encode relates Z with K + KX + KX^2 + KX^3 + ... + KX^P.
~/aoc25pl/02