vampire_numbers.sf 851 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Vampire_number
  4. #
  5. func is_vampire (n) {
  6. return [] if n.ilog10.is_even
  7. var l1 = n.isqrt.ilog10.ipow10
  8. var l2 = n.isqrt
  9. var s = n.digits.sort.join
  10. gather {
  11. n.divisors.each { |d|
  12. d < l1 && next
  13. d > l2 && break
  14. var t = n/d
  15. next if (d%%10 && t%%10)
  16. next if ("#{d}#{t}".sort != s)
  17. take([d, t])
  18. }
  19. }
  20. }
  21. say "First 25 Vampire Numbers:"
  22. with (1) { |i|
  23. for (var n = 1; i <= 25; ++n) {
  24. var fangs = is_vampire(n)
  25. printf("%2d. %6s : %s\n", i++, n, fangs.join(' ')) if fangs
  26. }
  27. }
  28. say "\nIndividual tests:"
  29. [16758243290880, 24959017348650, 14593825548650].each { |n|
  30. var fangs = is_vampire(n)
  31. say "#{n}: #{fangs ? fangs.join(', ') : 'is not a vampire number'}"
  32. }