#!/usr/bin/perl use warnings; use strict; print ieronim_pure(); sub ieronim_pure { #my @cubes = qw/pgpygr rprrgy ppryyg rrygpy/; my @cubes = qw/rprrgy ppryyg rrygpy/; my %seen; my $str = join("", map {$_, scalar reverse $_} "pgpy","ggry","pygr") ."!".join "!", map { join "", grep {!$seen{$_}++} map {join "", @$_} @$_} map { [ rotate([@{$_}[0,1,2,3]]), rotate([@{$_}[4,1,5,3]]), rotate([@{$_}[0,4,2,5]]) ] } map { [split //] } @cubes; my @result; my $re = qr/^(?:[^!]{4})* (?: ([^!]) ([^!]) ([^!]) ([^!]) ) (?:[^!]{4})*! (?:[^!]{4})* (?: (?!\1)([^!]) (?!\2)([^!]) (?!\3)([^!]) (?!\4)([^!]) ) (?:[^!]{4})*! (?:[^!]{4})* (?: (?!\1|\5)([^!]) (?!\2|\6)([^!]) (?!\3|\7)([^!]) (?!\4|\8)([^!]) ) (?:[^!]{4})*! (?:[^!]{4})* (?: (?!\1|\5|\9)([^!]) (?!\2|\6|\10)([^!]) (?!\3|\7|\11)([^!]) (?!\4|\8|\12)([^!]) )(?{ push @result, [join("", $1,$2,$3,$4), join("", $5,$6,$7,$8), join("", $9,$10,$11,$12), join("", $13,$14,$15,$16)] }) (?!) /x; #print $str; $str =~ /$re/; return map { join "\n", @$_, "", ""} @result; } sub rotate { my @strips; $strips[0] = shift; $strips[1] = [reverse @{$strips[0]}]; my @rotated; foreach (0..$#{$strips[0]}) { foreach my $strip (@strips) { push @$strip, shift @$strip; push @rotated, [@$strip]; } } return @rotated; }