Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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, OLLCP
- # needs moar algs (ELL?), bruno
- #my @case = qw(0 1 2 3 0 0 0 0 0 1 2 3 0 0 0 0);
- my @case = qw(0 2 3 1 0 1 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 M'U2F'U'F2R'F'R2U'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 RU'L'UR'U'L)], # Niklas
- [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 RB'RF2R'BRF2R2)], # A Perm
- [qw(0 3 1 2 0 0 0 0 0 1 2 3 0 0 0 0 M2U'MU2M'U'M2)], # U Perm
- [qw(2 3 0 1 0 0 0 0 0 1 2 3 0 0 0 0 M2UM2U2M2UM2)], # H Perm
- [qw(1 0 2 3 0 0 0 0 0 2 1 3 0 0 0 0 F2r'F'rF2R'DR'D'R2)], # L Perm
- [qw(1 2 0 3 0 1 1 0 1 3 2 0 0 2 0 1 RUR'U'R'FRF')], # SexyHammer
- [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(1 0 3 2 1 1 1 1 0 1 2 3 0 0 0 0 r'UM2etc)], # ZFlip
- [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(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 (0 .. @$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;
- }
- 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 "> \n";
- last;
- }
- for my $alg1 (1 .. $#basealgs) {
- my @case2 = domove(\@case1, $basealgs[$alg1]);
- if (solved(\@case2)) {
- print "> $str_auf1$basealgs[$alg1][16]\n";
- 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]\n";
- }
- }
- }
- }
- }
- print "\nEnd\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement