#!/perl -w use strict; $|=1; my @cubes = ('pgpygr', 'rprrgy', 'ppryyg', 'rrygpy'); foreach my $c1perm (permuate_colours($cubes[0])) { foreach my $c2perm (permuate_colours($cubes[1])) { foreach my $c3perm (permuate_colours($cubes[2])) { foreach my $c4perm (permuate_colours($cubes[3])) { if ( validate($c1perm, $c2perm, $c3perm, $c4perm) ) { print "Solution: $c1perm, $c2perm, $c3perm, $c4perm\n"; } } } } } sub validate { my (@colours) = @_; my %seen; foreach my $row (0..3) { foreach my $cube (0..3) { my $side_colour = substr($colours[$cube], $row, 1); if (exists $seen{$row}{$side_colour}) { return 0; } $seen{$row}{$side_colour}++; } } return 1; } sub permuate_colours { my ($colours) = @_; my @perms; for (1..4) { for (1..4) { push(@perms, $colours); $colours =~ s/(.)(.)(.)(.)(.)(.)/$2$3$4$1$5$6/; # spin } $colours =~ s/(.)(.)(.)(.)(.)(.)/$1$6$3$5$2$4/; # roll } $colours =~ s/(.)(.)(.)(.)(.)(.)/$2$3$4$1$5$6/; # spin $colours =~ s/(.)(.)(.)(.)(.)(.)/$1$6$3$5$2$4/; # roll for (1..4) { push(@perms, $colours); $colours =~ s/(.)(.)(.)(.)(.)(.)/$2$3$4$1$5$6/; # spin } $colours =~ s/(.)(.)(.)(.)(.)(.)/$1$6$3$5$2$4/; # roll $colours =~ s/(.)(.)(.)(.)(.)(.)/$1$6$3$5$2$4/; # roll for (1..4) { push(@perms, $colours); $colours =~ s/(.)(.)(.)(.)(.)(.)/$2$3$4$1$5$6/; # spin } return @perms; }