procedure main() write("First 25 vampire numbers and their fangs:") every fangs := vampire(n := seq())\25 do write(right(n,20),":",fangs) write("\nOther numbers:") every n := 16758243290880 | 24959017348650 | 14593825548650 do write(right(n,20),": ",vampire(n)|"toothless") end procedure vampire(n) ns := string(n) if *ns % 2 = 1 then fail every (fangs := "") ||:= " "||fangCheck(n, *ns/2, f1 := 2 to integer(sqrt(n)), n/f1) if *fangs > 0 then return fangs end procedure fangCheck(n, n2, f1, f2) if f1*f2 ~= n then fail if n2 ~= *(f1|f2) then fail if (f1|f2) % 10 ~= 0 then if csort(f1||f2) == csort(n) then return "("||f1||","||f2||")" end procedure csort(s) # Adapted from csort(s) in Icon IPL every (s1 := "", c := !cset(s)) do every find(c, s) do s1 ||:= c return s1 end