#! /usr/bin/perl -w # sub convert { my ($val, $base, $len) = @_; my @res; for(my $pos = 0; $pos < $len; $pos++){ my $digit = $val % $base; push @res, $digit; $val = ($val - $digit) / $base; } return \@res; } MAIN : { my ($idx2, $idx3, $d2, $d3); my %orbits; for(my $idx2 = 0; $idx2 < 2**6; $idx2++){ $d2 = convert $idx2, 2, 6; for(my $idx3 = 0; $idx3 < 3**6; $idx3++){ $d3 = convert $idx3, 3, 6; my @interl; for(my $pos = 0; $pos < 6; $pos++){ push @interl, $d2->[$pos], $d3->[$pos]; } my (%orbit, $entry, $refent); for(my $rot=0; $rot<12; $rot+=2){ $entry = [@interl[$rot..11], @interl[0..$rot-1]]; $orbit{join('-', @$entry)} = 1; } for(my $refl=0; $refl<12; $refl+=4){ $entry = [@interl[$refl..11], @interl[0..$refl-1]]; $refent = [$entry->[0], reverse(@$entry[1..11])]; $orbit{join('-', @$refent)} = 1; $refent = [$entry->[2], $entry->[1], $entry->[0], reverse(@$entry[3..11])]; $orbit{join('-', @$refent)} = 1; } $orbits{join('|', sort(keys %orbit))} = 1; } } print scalar(keys %orbits); printf " (%d)\n", (6**6 + 2 * 6 + 2 * 6**2 + 6**3 + 3 * 2**4 * 3**3 + 3 * 2**3 * 3**4)/12; 1; }