1
- :- use_module (library(yall )).
2
-
3
1
add_idx (Xs , Ys ) :- findall (I - X , nth1(I , Xs , X ), Ys ).
4
2
5
3
expand (Xs0 , Ys ) :-
6
4
add_idx(Xs0 , Xs ),
7
5
maplist([I0 - X ,L ]>> (I is mod(I0 ,2 )* (1 + I0 //2), length(L ,X ), maplist(= (I ),L )), Xs , Xs2 ),
8
6
flatten(Xs2 , Xs3 ), maplist([A ,B ]>> (B is A - 1 ), Xs3 , Ys ).
9
7
8
+ f1 (I -A ,J -B ,C ) :- I < J -> C =[J -A ,I -B ]; C = [] .
9
+ f2 (SwapDict , I -_ ) :- get_assoc(I , SwapDict , _ ).
10
+
10
11
insert (Xs , Empty , Full , N , Ys ) :-
11
12
length(EmptyTrim , N ), length(FullTrim , N ),
12
13
append(EmptyTrim , _ , Empty ), append(FullTrim , _ , Full ),
13
- maplist([ I - A , J - B , C ] >> ( I < J -> C =[ J - A , I - B ] ; C = [] ) , EmptyTrim , FullTrim , Swap0 ),
14
+ maplist(f1 , EmptyTrim , FullTrim , Swap0 ),
14
15
flatten(Swap0 , Swap ), list_to_assoc(Swap , SwapDict ),
15
- exclude({ SwapDict }/[ I - _ ] >> (get_assoc( I , SwapDict , _ ) ), Xs , Rem ),
16
+ exclude(f2( SwapDict ), Xs , Rem ),
16
17
append(Rem , Swap , Final ), sort(Final , Ys ).
17
18
18
19
next_empty (_ , N , Ys0 , Ys ) :- length(Ys0 , N ), reverse(Ys0 , Ys ), ! .
@@ -37,7 +38,7 @@ solve(In, Part1, Part2) :-
37
38
include([I - A ]>> (A \= (- 1 )), ExpIdx , Full0 ), reverse(Full0 , Full ),
38
39
length(Empty , N1 ), length(Full ,N2 ), N is min(N1 ,N2 ),
39
40
insert(ExpIdx , Empty , Full , N , Exp1 ),
40
- aggregate_all(sum(I * M ), (nth0(I ,Exp1 ,_ - M ), M \= - 1 ), Part1 ),
41
+ aggregate_all(sum(I2 * M ), (nth0(I2 ,Exp1 ,_ - M ), M \= - 1 ), Part1 ),
41
42
pairs_values(Full , Values0 ), sort(Values0 ,Values1 ), reverse(Values1 ,Values ),
42
43
insert2(Values , ExpIdx , Exp2 ),
43
44
aggregate_all(sum(I * M ), (nth0(I ,Exp2 ,_ - M ), M \= - 1 ), Part2 ).
0 commit comments