全数字积

作者:Andrei Osipov

https://projecteuler.net/problem=32

我们将一个 n 位数称为全数字,如果它正好使用了一次从 1 到 n 的所有数字;例如,5 位数 15234 是 1 到 5 的全数字。

积 7254 是不寻常的,因为等式 39 × 186 = 7254,包含被乘数、乘数和积,是 1 到 9 的全数字。

求出所有被乘数/乘数/积等式可以写成 1 到 9 的全数字的积的和。提示:有些积可以用多种方式获得,所以请确保在您的总和中只包含一次。

源代码:prob032-andreoss.pl

use v6;

sub is-pandigital($n is copy) {
    # #`«17x slower» return so all $n.comb.one == all 1..9;
    return unless 123456789 <= $n <= 987654321;
    my $x = 0;
    loop ( ; $n != 0 ; $n div=10) {
        my $d = $n mod 10;
        $x += $d * 10 ** (9 - $d);
    }
    $x == 123456789;
}

sub is-unusual($a, $b) {
    my $p = $a * $b;
    my $la = chars $a;
    my $lb = chars $b;
    my $lp = chars $p;

    return unless $la +$lb + $lp == 9;

    my $x = $a * 10 ** (9 - $la) + $b * (10 ** $lp) + $p;

    is-pandigital $x;
}


say [+] unique gather for 1 ... 2000 -> $x {
    for 1 ... 50 -> $y {
        take $x * $y if is-unusual $x, $y
    }
}