12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- #!/usr/bin/ruby
- #
- ## https://rosettacode.org/wiki/Vampire_number
- #
- 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'}"
- }
|