func is_vampire (n) { return [] if n.ilog10.is_even var l1 = n.isqrt.ilog10.ipow10 var l2 = n.isqrt var s = n.digits.sort.join gather { n.divisors.each { |d| d < l1 && next d > l2 && break var t = n/d next if (d%%10 && t%%10) next if ("#{d}#{t}".sort != s) take([d, t]) } } } say "First 25 Vampire Numbers:" with (1) { |i| for (var n = 1; i <= 25; ++n) { var fangs = is_vampire(n) printf("%2d. %6s : %s\n", i++, n, fangs.join(' ')) if fangs } } say "\nIndividual tests:" [16758243290880, 24959017348650, 14593825548650].each { |n| var fangs = is_vampire(n) say "#{n}: #{fangs ? fangs.join(', ') : 'is not a vampire number'}" }