NB. Kaprekar number NB. written by SHIMURA Masato //15 Apr 2011 NB. Usage calc_kap ^:(i.10) 4683 NB. 4683 5175 5994 5355 1998 8082 8532 6174 6174 6174 NB. Usage: calc_kap(^:10)L:0 (4683; 5472; 3973) NB. ------------------- NB. | 6174| 6174| 6174| NB. ------------------- divide=: >@ (". L:0)@( {@>)@ ": NB. 4683 --> 4 6 8 3 sort0=:[: > [: 10&#. L:0 (\:~ ; /:~)@divide NB. down&up sort NB. 10&#. is connect 4683<-- 4 6 8 3 calc_kap=: 1 x: -/@: sort0 NB. calc NB. -------------------------------- NB. Kaprekar's self numbers NB. *add_column 1975 NB. *find_C_sub1 1975 NB. *find_C 1985 NB. check_self (L:0) 1974 1975 NB. check_self_many 2000+i.100 add_column =: +/@:divide find_C_sub=: 3 : 0 NB. add keta /do until 1 dight NB. usage: u 1975 NB. ans is 22 4 tmp=. y while. (# divide tmp)> 1 do. tmp=. add_column tmp end. ) find_C=: 3 : 0 NB. usage: u 1975 NB. halve but if odd before add 9 C0=. find_C_sub y select. 1= 2| C0 NB. even or odd case. 0 do. C=. -: C0 NB. even case. 1 do. C=. -: 9+C0 NB. odd end. ) check_self=: 3 : 0 tmp=. # divide y C=: find_C y TGT=: +/\C,(<:tmp)#9 IND=: 1= *y-TGT TGT=: IND#TGT VAL=: > add_column L:0 {@> y-TGT (y-TGT),TGT,VAL,:y=VAL+y-TGT ) NB. calc at once and pick self numbers NB. check_self_many 1900+i.100 NB. 1906 1917 1919 1930 1941 1952 1963 1974 1985 1996 check_self_many=: 3 : 0 y#~ 0= > +/@: {: L:0 check_self L:0 {@> y )