#!/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; }