let is_rel_prime x ps = not ( List.exists ( fun y -> x mod y = 0 ) ps ) ;; let rec is_truncable_left x ps = (x=0) || ((List.mem x ps) && (is_truncable_left (x/10) ps)) ;; let digits x = let rec digits d = if( 10*d > x ) then d else digits (10*d) in digits 1 ;; let is_truncable_right x ps = let rec is_truncable_right x d = if( x=0 ) then true else if( List.mem x ps ) then is_truncable_right (x mod d) (d/10) else false in is_truncable_right x (digits x) ;; let is_truncable x ps = (is_truncable_left x ps) && (is_truncable_right x ps) ;; let search = let rec search x ps n s = Printf.printf "%d\n" x; if( n = 11 ) then (Printf.printf "sum=%d\n" s) else if( is_rel_prime x ps ) then if( is_truncable x (x::ps) ) then ( Printf.printf "%d\n" x; search (x+2) (x::ps) (n+1) (s+x) ) else search (x+2) (x::ps) n s else search (x+2) ps n s in search 11 [2;3;5;7] 0 0