#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
print "LL Solver\n\n";
# UBL & UB
# EP EP EP EP EO EO EO EO CP CP CP CP CO CO CO CO
# orientations applied after permutations
# input
my $mode = 0; # 0 = everything, 4 = OLLCP, 8 = CLL
my @case = qw(0 1 2 3 0 0 0 0 0 1 2 3 0 0 0 0);
my @solved1 = qw(0 1 2 3 0 0 0 0 0 1 2 3 0 0 0 0);
my @solved2 = qw(3 0 1 2 0 0 0 0 3 0 1 2 0 0 0 0); # U
my @solved3 = qw(1 2 3 0 0 0 0 0 1 2 3 0 0 0 0 0); # U'
my @solved4 = qw(2 3 0 1 0 0 0 0 2 3 0 1 0 0 0 0); # U2
my @basealgs = (
[qw(0 1 2 3 0 0 0 0 0 1 2 3 0 0 0 0), ''],
[qw(1 3 2 0 0 0 0 0 2 3 0 1 1 0 1 1 Sune)],
[qw(3 0 2 1 0 0 0 0 0 1 2 3 2 1 2 1 DoubleSune)],
[qw(0 1 2 3 0 0 0 0 2 3 0 1 0 1 0 2 TripleSune)],
[qw(0 3 2 1 0 0 0 0 0 2 1 3 0 0 0 0 TPerm)],
[qw(0 3 1 2 0 0 1 1 2 3 0 1 1 0 1 1 FatSune)],
[qw(0 2 3 1 0 1 1 0 0 1 2 3 2 1 2 1 DblFatSune)],
[qw(2 3 0 1 0 0 1 1 2 3 0 1 2 0 2 2 RUR2FRF2UF)], # PureSune
[qw(0 1 2 3 0 1 1 0 0 1 2 3 1 1 1 0 LU2L'U'LU'xU2R'U'RU'r')], # PureFat
#[qw(2 3 0 1 1 1 1 1 2 3 0 1 2 0 2 2 FURU'R'F'R'F'U'FUR)], # AllSune
#[qw(2 3 0 1 0 0 0 0 0 1 2 3 1 1 0 1 R'U2R2UR2URU'RU'R')], # SuneH
[qw(0 3 1 2 0 0 1 1 0 2 3 1 1 1 0 1 L'U2LU2LF'L'F)], # C2
[qw(0 3 1 2 0 0 1 1 2 1 3 0 1 1 0 1 FR'F'RU2RU2R')], # C3
[qw(1 2 0 3 0 1 1 0 1 0 3 2 0 2 1 0 FRUR'U'F')], # FRURUF
[qw(2 0 1 3 1 0 1 0 0 1 2 3 2 2 1 1 FRUR'U'RUR'U'F')], # DblFRURUF
[qw(0 1 2 3 0 0 0 0 3 1 0 2 2 0 0 1 L'R'D2RU2R'D2RU2L)], #Opp3
[qw(1 2 3 0 0 0 0 0 2 0 3 1 1 1 0 1 Niklas)], # RU'L'UR'U'L
[qw(3 1 0 2 0 0 1 1 1 2 0 3 1 1 1 0 rU'r'U'rUr'F'UF)], #WeirdNiklas
[qw(2 3 0 1 1 0 0 1 1 2 0 3 1 1 1 0 RU'R'U'F'U2'FU2RU2R')], # FatNiklas
[qw(0 1 2 3 0 0 0 0 0 2 3 1 0 0 0 0 APerm)], # A Perm
[qw(0 3 1 2 0 0 0 0 0 1 2 3 0 0 0 0 UPerm)], # U Perm
[qw(2 3 0 1 0 0 0 0 0 1 2 3 0 0 0 0 HPerm)], # H Perm
[qw(1 2 0 3 0 1 1 0 1 3 2 0 0 2 0 1 SexyHammer)], # RUR'U'R'FRF'
[qw(0 1 2 3 0 0 0 0 1 3 2 0 0 2 0 1 rUR'U'r'FRF')], # FatSexyHammer
[qw(3 1 2 0 0 0 1 1 1 0 2 3 2 0 0 1 R'FRUR'U'F'UR)], # HardP
[qw(0 2 3 1 0 0 1 1 1 0 3 2 1 0 0 2 R'U'R'FRF'UR)], # EasyC
#[qw(2 3 0 1 1 1 1 1 0 1 2 3 0 0 0 0 MURUR'U'M2URU'r'U')], # HFlip
[qw(3 1 2 0 1 0 1 0 0 3 2 1 2 0 0 1 R2'U'RFR'UR2U'R'F'R)], # DiagT
[qw(0 3 2 1 0 0 0 0 2 3 1 0 2 1 0 0 FRUR'U'RU'R'U'RUR'F')], # TastyT
[qw(1 2 0 3 0 1 1 0 0 2 3 1 2 0 1 0 FRU'RDR'U2RD'R2'U'F')], # WeirdT
[qw(3 0 1 2 1 0 1 0 2 0 3 1 2 0 0 1 RUR'UF'L'ULFU'RU'R')], # PowerT
#[qw(1 3 2 0 1 0 0 1 1 3 2 0 1 0 0 2 L2F2R'FRF2L2U2LF'L')], # CheckU
#[qw(0 3 1 2 0 0 1 1 3 0 2 1 1 2 2 1 rUR'URUL'UR'U'LUM)], # RandomH
#[qw(0 1 2 3 0 0 0 0 0 1 2 3 0 2 0 1 F'RD2R'FU2F'RD2R'FU2)], # PureL
[qw(0 1 2 3 0 0 0 0 0 3 1 2 0 2 0 1 R2DR'U2RD'R'U2R')], # L3
[qw(1 2 0 3 0 1 1 0 0 3 1 2 2 1 0 0 FR2DR'URD'R2U'F')], # E2
[qw(3 1 0 2 1 0 1 0 0 3 1 2 2 1 0 0 fR2DR'URD'R2U'f')], # FatE2
[qw(2 1 3 0 1 0 1 0 1 2 0 3 0 1 2 0 F'LFL'U'L'UL)], # D5
[qw(2 0 3 1 0 0 0 0 3 1 2 0 1 2 1 2 RU'L'UR'ULUL'UL)], # G5
[qw(0 1 2 3 0 1 0 1 1 0 3 2 1 1 2 2 R'U'RU'R'UF'UFR)], # G6
[qw(1 2 3 0 0 1 0 1 0 2 1 3 1 0 0 2 FRU'R'U'L'U'LULF'L2UL)], # F4
[qw(1 2 0 3 0 1 1 0 2 0 1 3 2 2 1 1 FRUR'U'RF'rUR'U'r')], # H2Opp
[qw(1 2 0 3 0 1 1 0 0 1 2 3 0 0 0 0 RUR'U'M'URU'r')], # ezell A
[qw(3 0 2 1 1 1 0 0 0 1 2 3 0 0 0 0 M'UMU2M'UM)], # ezell 1
[qw(2 1 3 0 0 0 0 0 2 3 0 1 1 1 2 2 Bruno)], # Bruno
[qw(0 2 3 1 0 0 1 1 1 0 3 2 1 0 0 2 R'U'R'FRF'UR)], # BrestAlg
[qw(0 2 1 3 0 0 0 0 0 2 1 3 0 0 0 0 JPerm)]
);
my @eplookup = (
[qw(0 1 2 3 0 1 2 3)],[qw(0 1 3 2 0 2 1 3)],[qw(0 3 1 2 0 2 3 1)],[qw(3 0 1 2 1 2 3 0)],[qw(0 2 1 3 0 1 3 2)],[qw(0 2 3 1 0 3 1 2)],[qw(0 3 2 1 0 3 2 1)],[qw(3 0 2 1 1 3 2 0)],
[qw(2 0 1 3 2 1 3 0)],[qw(2 0 3 1 2 3 1 0)],[qw(2 3 0 1 2 3 0 1)],[qw(3 2 0 1 1 3 0 2)],[qw(1 0 2 3 3 1 2 0)],[qw(1 0 3 2 3 2 1 0)],[qw(1 3 0 2 3 2 0 1)],[qw(3 1 0 2 1 2 0 3)],
[qw(1 2 0 3 3 1 0 2)],[qw(1 2 3 0 3 0 1 2)],[qw(1 3 2 0 3 0 2 1)],[qw(3 1 2 0 1 0 2 3)],[qw(2 1 0 3 2 1 0 3)],[qw(2 1 3 0 2 0 1 3)],[qw(2 3 1 0 2 0 3 1)],[qw(3 2 1 0 1 0 3 2)]
);
my @cplookup = (
[qw(0 1 2 3 0 1 2 3)],[qw(0 1 3 2 0 1 3 2)],[qw(0 3 1 2 2 1 3 0)],[qw(3 0 1 2 1 2 3 0)],[qw(0 2 1 3 3 1 2 0)],[qw(0 2 3 1 3 1 0 2)],[qw(0 3 2 1 2 1 0 3)],[qw(3 0 2 1 1 2 0 3)],
[qw(2 0 1 3 1 3 2 0)],[qw(2 0 3 1 1 3 0 2)],[qw(2 3 0 1 2 3 0 1)],[qw(3 2 0 1 3 2 0 1)],[qw(1 0 2 3 1 0 2 3)],[qw(1 0 3 2 1 0 3 2)],[qw(1 3 0 2 2 0 3 1)],[qw(3 1 0 2 0 2 3 1)],
[qw(1 2 0 3 3 0 2 1)],[qw(1 2 3 0 3 0 1 2)],[qw(1 3 2 0 2 0 1 3)],[qw(3 1 2 0 0 2 1 3)],[qw(2 1 0 3 0 3 2 1)],[qw(2 1 3 0 0 3 1 2)],[qw(2 3 1 0 2 3 1 0)],[qw(3 2 1 0 3 2 1 0)]
);
my @colookup = (
[qw(0 0 0 0 0 0 0 0)],[qw(0 1 1 1 2 0 2 2)],[qw(1 0 1 1 0 2 2 2)],[qw(1 1 0 1 2 2 2 0)],[qw(1 1 1 0 2 2 0 2)],[qw(2 2 2 0 1 1 0 1)],[qw(0 2 2 2 1 0 1 1)],[qw(2 0 2 2 0 1 1 1)],
[qw(2 2 0 2 1 1 1 0)],[qw(1 0 2 0 0 2 0 1)],[qw(0 1 0 2 2 0 1 0)],[qw(2 0 1 0 0 1 0 2)],[qw(0 2 0 1 1 0 2 0)],[qw(2 1 0 0 2 1 0 0)],[qw(0 2 1 0 1 0 0 2)],[qw(0 0 2 1 0 0 2 1)],
[qw(1 0 0 2 0 2 1 0)],[qw(1 2 0 0 1 2 0 0)],[qw(0 1 2 0 2 0 0 1)],[qw(0 0 1 2 0 0 1 2)],[qw(2 0 0 1 0 1 2 0)],[qw(1 1 2 2 2 2 1 1)],[qw(2 1 1 2 2 1 1 2)],[qw(2 2 1 1 1 1 2 2)],
[qw(1 2 2 1 1 2 2 1)],[qw(1 2 1 2 1 2 1 2)],[qw(2 1 2 1 2 1 2 1)]
);
my @ilookup = (
[qw(0 1 2 3 0 1 2 3)],[qw(0 1 3 2 0 1 3 2)],[qw(0 3 1 2 0 2 3 1)],[qw(3 0 1 2 1 2 3 0)],[qw(0 2 1 3 0 2 1 3)],[qw(0 2 3 1 0 3 1 2)],[qw(0 3 2 1 0 3 2 1)],[qw(3 0 2 1 1 3 2 0)],
[qw(2 0 1 3 1 2 0 3)],[qw(2 0 3 1 1 3 0 2)],[qw(2 3 0 1 2 3 0 1)],[qw(3 2 0 1 2 3 1 0)],[qw(1 0 2 3 1 0 2 3)],[qw(1 0 3 2 1 0 3 2)],[qw(1 3 0 2 2 0 3 1)],[qw(3 1 0 2 2 1 3 0)],
[qw(1 2 0 3 2 0 1 3)],[qw(1 2 3 0 3 0 1 2)],[qw(1 3 2 0 3 0 2 1)],[qw(3 1 2 0 3 1 2 0)],[qw(2 1 0 3 2 1 0 3)],[qw(2 1 3 0 3 1 0 2)],[qw(2 3 1 0 2 3 1 0)],[qw(3 2 1 0 3 2 1 0)]
);
sub mirror($) {
my ($alg) = @_;
my @stuff = @$alg;
my @buf;
# EP
for (0 .. 23) {
if ($eplookup[$_][0] == $stuff[0] && $eplookup[$_][1] == $stuff[1] && $eplookup[$_][2] == $stuff[2] && $eplookup[$_][3] == $stuff[3]) {
@buf[0 .. 3] = @{$eplookup[$_]}[4 .. 7];
last;
}
if ($_ == 23) {
die "wrong EP or something\n";
}
}
# EO
@buf[4 .. 7] = @stuff[4,7,6,5];
# CP
for (0 .. 23) {
if ($cplookup[$_][0] == $stuff[8] && $cplookup[$_][1] == $stuff[9] && $cplookup[$_][2] == $stuff[10] && $cplookup[$_][3] == $stuff[11]) {
@buf[8 .. 11] = @{$cplookup[$_]}[4 .. 7];
last;
}
if ($_ == 23) {
die "wrong CP or something\n";
}
}
#CO
for (0 .. 26) {
if ($colookup[$_][0] == $stuff[12] && $colookup[$_][1] == $stuff[13] && $colookup[$_][2] == $stuff[14] && $colookup[$_][3] == $stuff[15]) {
@buf[12 .. 15] = @{$colookup[$_]}[4 .. 7];
last;
}
if ($_ == 26) {
die "wrong CO or something\n";
}
}
$buf[16] = "Mrr($stuff[16])";
return \@buf;
}
sub inverse($) {
my ($alg) = @_;
my @stuff = @$alg;
my @buf;
# EP
for (0 .. 23) {
if ($ilookup[$_][0] == $stuff[0] && $ilookup[$_][1] == $stuff[1] && $ilookup[$_][2] == $stuff[2] && $ilookup[$_][3] == $stuff[3]) {
@buf[0 .. 3] = @{$ilookup[$_]}[4 .. 7];
last;
}
if ($_ == 23) {
die "wrong EP or something\n";
}
}
#EO
@buf[4 .. 7] = (0,0,0,0);
for (0 .. 3) {
if ($stuff[$_ + 4]) {
$buf[$stuff[$_] + 4] = 1;
}
}
# CP
for (0 .. 23) {
if ($ilookup[$_][0] == $stuff[8] && $ilookup[$_][1] == $stuff[9] && $ilookup[$_][2] == $stuff[10] && $ilookup[$_][3] == $stuff[11]) {
@buf[8 .. 11] = @{$ilookup[$_]}[4 .. 7];
last;
}
if ($_ == 23) {
die "wrong EP or something\n";
}
}
#CO
@buf[12 .. 15] = (0,0,0,0);
for (0 .. 3) {
$buf[$stuff[$_+8]+12] = (3 - $stuff[$_+12]) % 3;
}
$buf[16] = "Inv($stuff[16])";
return \@buf;
}
sub do_y($) {
my ($pos) = @_;
my @y;
my @rebase = (3,0,1,2);
for (0 .. 3) {
my $base = $_ * 4;
if ($_ == 0 || $_ == 2) {
@y[$base .. $base+3] = map $rebase[$_], @{$pos}[$base+3, $base+0, $base+1, $base+2];
}
else {
@y[$base .. $base+3] = @{$pos}[$base+3, $base+0, $base+1, $base+2];
}
}
\@y;
}
sub add_alg($$) {
my ($old, $new) = @_;
#print "add_alg(@$old, @$new)\n";
for (0 .. 3) {
my $old_key = join " ", @{$old}[0 .. 15];
my $new_key = join " ", @{$new}[0 .. 15];
#print "$old_key <> $new_key\n";
if ($old_key eq $new_key) {
#print "SAEM!\n";
return;
}
$old = do_y($old);
}
#print "DIFFURENT\n";
push @basealgs, $new;
}
#Populate database with mirrors and inverses
my $orig_algs = @basealgs;
for (0 .. $orig_algs - 1) {
add_alg($basealgs[$_], mirror($basealgs[$_]));
add_alg($basealgs[$_], inverse($basealgs[$_]));
add_alg($basealgs[$_], inverse(mirror($basealgs[$_])));
}
#Show array (debug)
#for $aref ( @basealgs ) {
#print "\t [@$aref],\n";
#}
#print "\n\n";
sub solved($) {
my ($position) = @_;
for my $solved (\@solved1, \@solved2, \@solved3, \@solved4) {
my $equal = 1;
for ($mode .. @$position - 1) {
if ($position->[$_] != $solved->[$_]) {
$equal = 0;
last;
}
}
if ($equal) {
return 1;
}
}
return 0;
}
sub domove($$) {
my ($position, $alg) = @_;
my @buf;
# EP
for (0 .. 3) {
$buf[$_] = $position->[$alg->[$_]];
$buf[$_+4] = $position->[$alg->[$_]+4]; #EO
}
# EO
for (4 .. 7) {
if ($alg->[$_]) {
$buf[$_] = 1 - $buf[$_];
}
}
# CP
for (8 .. 11) {
$buf[$_] = $position->[$alg->[$_]+8];
$buf[$_+4] = $position->[$alg->[$_]+12]; #CO
}
# CO
for (12 .. 15) {
if ($alg->[$_]) {
$buf[$_] = ($buf[$_] + $alg->[$_]) % 3;
}
}
return @buf;
}
sub solve() {
print "<td><script>ll(\"@case\");</script><br>";
for my $auf1 (0 .. 3) {
my $str_auf1 = ("", "U ", "U' ", "U2 ")[$auf1];
my $alg_auf1 = (\@solved1, \@solved2, \@solved3, \@solved4)[$auf1];
my @case1 = domove(\@case, $alg_auf1);
if (solved(\@case)) {
print "> <br>";
last;
}
for my $alg1 (1 .. $#basealgs) {
my @case2 = domove(\@case1, $basealgs[$alg1]);
if (solved(\@case2)) {
print "> $str_auf1$basealgs[$alg1][16]<br>";
next;
}
for my $auf2 (0 .. 3) {
my $str_auf2 = ("", "U ", "U' ", "U2 ")[$auf2];
my $alg_auf2 = (\@solved1, \@solved2, \@solved3, \@solved4)[$auf2];
my @case3 = domove(\@case2, $alg_auf2);
for my $alg2 (1 .. $#basealgs) {
my @case4 = domove(\@case3, $basealgs[$alg2]);
if (solved(\@case4)) {
print "> $str_auf1$basealgs[$alg1][16] $str_auf2$basealgs[$alg2][16]<br>";
}
}
}
}
}
print "</td>\n";
}
my @ellp = qw(0 1 2 3 2 3 0 1 3 2 1 0 1 0 3 2 0 2 3 1 2 1 3 0 1 3 2 0 1 2 0 3 0 3 1 2 3 1 0 2 3 0 2 1 2 0 1 3);
my @ello = qw(0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1);
my @cllo = qw(0 2 2 2 1 0 1 1 0 1 0 2 2 1 0 0 1 2 0 0 1 1 2 2 1 2 1 2);
my @cllp = qw(0 1 2 3 2 0 1 3 2 1 3 0 3 1 0 2 3 0 2 1 3 2 1 0);
for (my $co=0;$co<7;$co++){
$case[12] = $cllo[($co*4)];
$case[13] = $cllo[($co*4)+1];
$case[14] = $cllo[($co*4)+2];
$case[15] = $cllo[($co*4)+3];
for (my $cp=0;$cp<6;$cp++){
$case[8] = $cllp[($cp*4)];
$case[9] = $cllp[($cp*4)+1];
$case[10] = $cllp[($cp*4)+2];
$case[11] = $cllp[($cp*4)+3];
print "<tr>\n";
for (my $eo=0;$eo<8;$eo++){
$case[4] = $ello[($eo*4)];
$case[5] = $ello[($eo*4)+1];
$case[6] = $ello[($eo*4)+2];
$case[7] = $ello[($eo*4)+3];
for (my $ep=0;$ep<12;$ep++){
$case[0] = $ellp[($ep*4)];
$case[1] = $ellp[($ep*4)+1];
$case[2] = $ellp[($ep*4)+2];
$case[3] = $ellp[($ep*4)+3];
solve();
#print "<td><script>ll(\"@case\");</script></td>\n";
#print @case;print "\n";
}
}
print "</tr>\n";
}
}
print "\nEnd\n";