program smith_numbers; loop for s in [n : n in [2..9999] | smith(n)] do putchar(lpad(str s, 5)); if (i +:= 1) mod 16=0 then print; end if; end loop; print; proc smith(n); facs := factors(n); return #facs /= 1 and +/digits(n) = +/[+/digits(f) : f in facs]; end proc; proc digits(n); d := []; loop while n > 0 do d with:= n mod 10; n div:= 10; end loop; return d; end proc; proc factors(n); f := []; loop while even n do n div:= 2; f with:= 2; end loop; d := 3; loop while d <= n do loop while n mod d = 0 do n div:= d; f with:= d; end loop; d +:= 2; end loop; return f; end proc; end program;