RosettaCodeData/Task/Smith-numbers/SETL/smith-numbers.setl
2023-12-16 21:33:55 -08:00

38 lines
867 B
Text

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;