project-euler / project-euler / 32.pl

#!/usr/bin/perl 

use strict;
use warnings;

use List::Util qw(sum);

use Data::Dumper;

sub gen_perms
{
    my ($set) = @_;

    if (@$set < 5)
    {
        return [[]];
    }

    my $elem;
    my @prev_elems;
    my @perms;
    while ($elem = shift(@$set))
    {
        push @perms, (map { [$elem,@{$_}] } @{gen_perms([@prev_elems,@$set])});
        push @prev_elems, $elem;
    }

    return \@perms;
}

my %products;
my $good = join("K", 1..9);
foreach my $p (@{gen_perms([1..9])})
{
    {
        my $result = join("", @$p[0..1]) * join("", @$p[2..4]);
        if (join("K", sort { $a <=> $b } (@$p,split(//, $result))) eq $good)
        {
            $products{$result}++;
        }
    }
    {
        my $result = join("", @$p[0]) * join("", @$p[1..4]);
        if (join("K", sort { $a <=> $b } (@$p,split(//, $result))) eq $good)
        {
            $products{$result}++;
        }
    }
}

print sum(keys(%products)), "\n";
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.