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