Vampire number: Difference between revisions

→‎{{header|Perl}}: added a faster Perl version, using the "ntheory" library
(Added Sidef)
(→‎{{header|Perl}}: added a faster Perl version, using the "ntheory" library)
Line 2,258:
 
say join ' ', $_, map "[@$_]", fangs($_) for 16758243290880, 24959017348650, 14593825548650;</lang>
 
A faster version, using the `divisors()` function from the ntheory library.
{{trans|Sidef}}
<lang perl>use ntheory qw(sqrtint logint divisors);
 
sub is_vampire {
my ($n) = @_;
 
return if (length($n) % 2 or $n < 0);
 
my $l1 = 10**logint(sqrtint($n), 10);
my $l2 = sqrtint($n);
 
my $s = join('', sort split(//, $n));
 
my @fangs;
 
foreach my $d (divisors($n)) {
 
$d < $l1 and next;
$d > $l2 and last;
 
my $t = $n / $d;
 
next if ($d % 10 == 0 and $t % 10 == 0);
next if (join('', sort split(//, "$d$t")) ne $s);
 
push @fangs, [$d, $t];
}
 
return @fangs;
}
 
print "First 25 Vampire Numbers:\n";
 
for (my ($n, $i) = (1, 1) ; $i <= 25 ; ++$n) {
if (my @fangs = is_vampire($n)) {
printf("%2d. %6s : %s\n", $i++, $n, join(' ', map { "[@$_]" } @fangs));
}
}
 
print "\nIndividual tests:\n";
 
foreach my $n (16758243290880, 24959017348650, 14593825548650) {
my @fangs = is_vampire($n);
print("$n: ", (@fangs ? join(' ', map { "[@$_]" } @fangs)
: "is not a vampire number"), "\n");
}</lang>
{{out}}
<pre>
First 25 Vampire Numbers:
1. 1260 : [21 60]
2. 1395 : [15 93]
3. 1435 : [35 41]
4. 1530 : [30 51]
5. 1827 : [21 87]
6. 2187 : [27 81]
7. 6880 : [80 86]
8. 102510 : [201 510]
9. 104260 : [260 401]
10. 105210 : [210 501]
11. 105264 : [204 516]
12. 105750 : [150 705]
13. 108135 : [135 801]
14. 110758 : [158 701]
15. 115672 : [152 761]
16. 116725 : [161 725]
17. 117067 : [167 701]
18. 118440 : [141 840]
19. 120600 : [201 600]
20. 123354 : [231 534]
21. 124483 : [281 443]
22. 125248 : [152 824]
23. 125433 : [231 543]
24. 125460 : [204 615] [246 510]
25. 125500 : [251 500]
 
Individual tests:
16758243290880: [1982736 8452080] [2123856 7890480] [2751840 6089832] [2817360 5948208]
24959017348650: [2947050 8469153] [2949705 8461530] [4125870 6049395] [4129587 6043950] [4230765 5899410]
14593825548650: is not a vampire number
</pre>
 
=={{header|Perl 6}}==
2,747

edits