カプレカ数
「桁を並び替えてできる最大の数から最小の数を引く」
3桁ならば495, 4桁ならば6174に収束する。
123からスタート
321 - 123 =198, 981 - 189 = 792, 972 - 279 =693, 963 - 369=594,
954 - 459 = 495, 954 - 459 = 495.
:- write('usage: calc_kap(N)'),nl.
get_three(A,I,J,K) :-
number_codes(A,[X,Y,Z]),
number_codes(I,[X]),
number_codes(J,[Y]),
number_codes(K,[Z]),
!.
get_number_list(N,L) :-
number_codes(N,List),
get_num_aux(List,L),!.
get_num_aux([],[]) :- !.
get_num_aux([X|Rest],[N|L]) :-
number_codes(N,[X]),
get_num_aux(Rest,L).
sort_three(I,J,K,Max,MM,Min) :-
(
I>J,J>K, Max = I, MM = J, Min = K;
I>K,K>J, Max = I, MM = K, Min = J;
J>I,I>K, Max = J, MM = I, Min = K;
J>K,K>I, Max = J, MM = K, Min = I;
K>J,J>I, Max = K, MM = J, Min = I;
K>I,I>J, Max = K, MM = I, Min = J
),
!.
sort_four([I,J,K,L],Ans) :-
sort_four_aux([I,J,K,L],Ans),!.
sort_four_aux([],[]) :- !.
sort_four_aux([N|Rest],[N|L]) :-
check_max(N,Rest),
sort_four_aux(Rest,L).
sort_four_aux([N|Rest],L) :-
append(Rest,[N],Next),
sort_four_aux(Next,L).
sort_list(List,Ans) :-
sort_list_aux(List,Ans),!.
sort_list_aux([],[]) :- !.
sort_list_aux([N|Rest],[N|L]) :-
check_max(N,Rest),
sort_list_aux(Rest,L).
sort_list_aux([N|Rest],L) :-
append(Rest,[N],Next),
sort_list_aux(Next,L).
check_max(X,L) :-
check_max_aux(X,L),!.
check_max_aux(X,[]) :- !.
check_max_aux(X,[Y|Rest]) :-
X >= Y,
check_max_aux(X,Rest).
get_max_min(List,MaxN,MinN) :-
length(List,3),
List=[I,J,K],
MaxN is I*100 + J*10 + K,
MinN is K*100 + J*10 + I,
!.
get_max_min(List,MaxN,MinN) :-
length(List,4),
List=[I,J,K,L],
MaxN is (1000*I+100*J+10*K+L),
MinN is (L*1000+K*100+J*10+I),
!.
get_max_min(List,MaxN,MinN) :-
length(List,6),
List=[A,B,C,D,E,F],
MaxN is (100000*A+10000*B+1000*C+100*D+10*E+F),
MinN is (F*100000+E*10000+D*1000+C*100+B*10+A),
!.
calc_kap(N) :-
N < 1000,
calc_kap_aux(N),!.
calc_kap(N) :-
N < 10000,
calc_kap_aux2(N),!.
calc_kap(N) :-
N < 100000,
calc_kap_aux3(N),!.
calc_kap(N) :-
calc_kap_aux4(N),!.
calc_kap_aux(0) :- !.
calc_kap_aux(N) :-
get_number_list(N,List),
sort_list(List,SORT),
get_max_min(SORT,MaxN,MinN),
Ans is MaxN - MinN,
det_number1(N,Ans).
det_number1(N,Ans) :-
N =:= Ans,
write(N),write(':'),write(Ans),nl.
det_number1(N,Ans) :-
write(N),write(':'),write(Ans),nl,
calc_kap_aux(Ans).
% 4桁
calc_kap_aux2(0) :- !.
calc_kap_aux2(N) :-
get_number_list(N,List),
sort_list(List,SORT),
get_max_min(SORT,MaxN,MinN),
Ans is MaxN - MinN,
N =:= Ans,
write(N),write(':'),write(Ans),nl.
calc_kap_aux2(N) :-
get_number_list(N,List),
sort_list(List,SORT),
get_max_min(SORT,MaxN,MinN),
Ans is MaxN - MinN,
write(N),write(':'),write(Ans),nl,
calc_kap_aux2(Ans).
% 5桁
calc_kap_aux3(N) :-
get_number_list(N,List),
sort_list(List,SORT),
SORT = [A,B,C,D,E],
Ans is (10000*A+1000*B+100*C+10*D+E) - (E*10000+D*1000+C*100+B*10+A),
det_number(N,Ans).
det_number(N,Ans) :-
N =:= Ans,
write(N),write(':'),write(Ans),nl.
det_number(N,Ans) :-
write(N),write(':'),write(Ans),nl,
calc_kap_aux3(Ans).
calc_kap_aux4(N) :-
get_number_list(N,List),
sort_list(List,SORT),
get_max_min(SORT,MaxN,MinN),
Ans is MaxN - MinN,
det_number2(N,Ans).
det_number2(N,Ans) :-
N =:= Ans,
write(N),write(':'),write(Ans),nl.
det_number2(N,Ans) :-
write(N),write(':'),write(Ans),nl,
calc_kap_aux4(Ans).
| ?-calc_kap(557).
557:198
198:792
792:693
693:594
594:495
495:495
yes
| ?-calc_kap(123).
123:198
198:792
792:693
693:594
594:495
495:495
yes
| ?-calc_kap(1234).
1234:3087
3087:8352
8352:6174
6174:6174
yes
| ?-calc_kap(123789).
123789:863532
863532:631764
631764:631764
yes
6桁ぐらいになってくると収束しないケースが多くなってくる。