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