素数对集
作者:Andrei Osipov
素数 3、7、109 和 673 非常特别。取任意两个素数,按任意顺序连接它们,结果始终是素数。例如,取 7 和 109,7109 和 1097 都是素数。这四个素数的总和 792 是具有此属性的四个素数集的最小总和。
求出一组五个素数,其中任意两个素数连接起来都能产生另一个素数,求这组素数的最小总和。
use v6;
subset Prime of Int where *.is-prime;
sub infix:«R»($a, $b) {
+( $a ~ $b ) & +( $b ~ $a ) ~~ Prime
}
multi are-remarkable() { True }
multi are-remarkable($a) { True }
multi are-remarkable($a, *@xs) {
$a R @xs.all
}
sub get-remarkable( :@primes is copy
, *@sequence
) {
gather while my $x = @primes.shift {
if are-remarkable $x, @sequence {
take(|@sequence , $x) if @sequence;
take $_
for get-remarkable
:@primes
, @sequence, $x
}
}
}
sub MAIN( Int :$limit = 10_000
, Bool :$verbose = False
, Int :$size = 5
) {
my @primes = grep Prime , 1 .. $limit;
for get-remarkable :@primes -> @r {
say @r.perl if $verbose ;
if @r == $size {
$verbose
?? say "The sequence is @r[], the sum is {[+] @r}"
!! say [+] @r
and last
}
}
say "Done in {now - BEGIN now}." if $verbose;
}
Perl 6 示例