素数对集
作者: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; }