素数对集

作者:Andrei Osipov

素数 3、7、109 和 673 非常特别。取任意两个素数,按任意顺序连接它们,结果始终是素数。例如,取 7 和 109,7109 和 1097 都是素数。这四个素数的总和 792 是具有此属性的四个素数集的最小总和。

求出一组五个素数,其中任意两个素数连接起来都能产生另一个素数,求这组素数的最小总和。

源代码:prob060-andreoss.pl

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;
}