見出し画像

カプレカ数

「桁を並び替えてできる最大の数から最小の数を引く」

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桁ぐらいになってくると収束しないケースが多くなってくる。

いいなと思ったら応援しよう!