#!/usr/bin/perl
use strict;
use warnings;
for (qw/pgpy ggyr gprp ypgp rygg prpg/) {
my @rotate = rotations($_);
for my $cube1 (@rotate) {
for (qw/rprr pgry gryr rrpr yrgp ryrg/) {
my @rotate = rotations($_);
for my $cube2 (@rotate) {
for (qw/ppry pyyg yrgp yrpp gyyp pgry/) {
my @rotate = rotations($_);
for my $cube3 (@rotate) {
for (qw/rryg rpgy pyyr gyrr ygpr ryyp/) {
my @rotate = rotations($_);
for my $cube4 (@rotate) {
my $sol = solution($cube1, $cube2, $cube3, $cube4);
print "$sol\n\n" if $sol;
}
}
}
}
}
}
}
}
sub rotations {
my @rotate = shift @_;
my @color = split //, $rotate[0];
(push @color, shift @color) && (push @rotate, join '', @color) for 1 .. 3;
return @rotate;
}
sub solution {
my ($cube1, $cube2, $cube3, $cube4) = @_;
for my $pos (0 .. 3) {
my %uniq = map { substr($_, $pos, 1) => undef } $cube1, $cube2, $cube3, $cube4;
return 0 if keys %uniq != 4;
}
return join "\n", $cube1, $cube2, $cube3, $cube4;
}
####
#!/usr/bin/perl
use strict;
use warnings;
my @cube = map rotations($_), qw/pgpygr rprrgy ppryyg rrygpy/;
for my $c1 (@{$cube[0]}) {
for my $c2 (@{$cube[1]}) {
for my $c3 (@{$cube[2]}) {
for my $c4 (@{$cube[3]}) {
my $sol = solution($c1, $c2, $c3, $c4);
print "$sol\n\n" if $sol;
}
}
}
}
sub rotations {
my (%seen, @rot);
my @cube = split //, shift @_;
for ([0 .. 3], [1, 4, 3, 5], [4, 0, 5, 2]) {
my @col = @cube[@$_];
push @rot, map {push @col, shift @col; $seen{"@col"}++ ? () : [@col]} 1..4;
@col = reverse @{$rot[-1]};
push @rot, map {push @col, shift @col; $seen{"@col"}++ ? () : [@col]} 1..4;
}
return \@rot;
}
sub solution {
my ($cube1, $cube2, $cube3, $cube4) = @_;
for my $i (0 .. 3) {
my %uniq = map { $_->[$i] => undef } $cube1, $cube2, $cube3, $cube4;
return 0 if keys %uniq != 4;
}
return "@$cube1\n@$cube2\n@$cube3\n@$cube4";
}
##
##
#!/usr/bin/perl
use strict;
use warnings;
my @cube = map rotations($_), qw/pgpygr rprrgy ppryyg rrygpy/;
my @used;
for my $c1 (@{$cube[0]}) {
@used = map {{$_ => 1}} @$c1;
CUBE2:
for my $c2 (@{$cube[1]}) {
$used[$_]{$c2->[$_]} && next CUBE2 for 0 .. 3;
$used[$_]{$c2->[$_]} = 1 for 0 .. 3;
CUBE3:
for my $c3 (@{$cube[2]}) {
$used[$_]{$c3->[$_]} && next CUBE3 for 0 .. 3;
$used[$_]{$c3->[$_]} = 1 for 0 .. 3;
CUBE4:
for my $c4 (@{$cube[3]}) {
$used[$_]{$c4->[$_]} && next CUBE4 for 0 .. 3;
print "@$c1\n@$c2\n@$c3\n@$c4\n\n";
}
$used[$_]{$c3->[$_]} = 0 for 0 .. 3;
}
$used[$_]{$c2->[$_]} = 0 for 0 .. 3;
}
}
sub rotations {
my (%seen, @rot);
my @cube = split //, shift @_;
for ([0 .. 3], [1, 4, 3, 5], [4, 0, 5, 2]) {
my @col = @cube[@$_];
push @rot, map {push @col, shift @col; $seen{"@col"}++ ? () : [@col]} 1..4;
@col = reverse @{$rot[-1]};
push @rot, map {push @col, shift @col; $seen{"@col"}++ ? () : [@col]} 1..4;
}
return \@rot;
}