Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 10.13 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings FATAL => 'all';
  4.  
  5. print "LL Solver\n\n";
  6.  
  7. # UBL & UB
  8. # EP EP EP EP EO EO EO EO CP CP CP CP CO CO CO CO
  9. # orientations applied after permutations  
  10.  
  11. # input, OLLCP
  12. # needs moar algs (ELL?), bruno
  13.  
  14. #my @case = qw(0 1 2 3 0 0 0 0 0 1 2 3 0 0 0 0);
  15. my @case = qw(0 2 3 1 0 1 0 0 0 1 2 3 0 0 0 0);
  16. my @solved1 = qw(0 1 2 3 0 0 0 0 0 1 2 3 0 0 0 0);
  17. my @solved2 = qw(3 0 1 2 0 0 0 0 3 0 1 2 0 0 0 0); # U
  18. my @solved3 = qw(1 2 3 0 0 0 0 0 1 2 3 0 0 0 0 0); # U'
  19. my @solved4 = qw(2 3 0 1 0 0 0 0 2 3 0 1 0 0 0 0); # U2
  20.  
  21. my @basealgs =  (
  22. [qw(0 1 2 3 0 0 0 0 0 1 2 3 0 0 0 0), ''],
  23. [qw(1 3 2 0 0 0 0 0 2 3 0 1 1 0 1 1 Sune)],
  24. [qw(3 0 2 1 0 0 0 0 0 1 2 3 2 1 2 1 DoubleSune)],
  25. [qw(0 1 2 3 0 0 0 0 2 3 0 1 0 1 0 2 TripleSune)],
  26. [qw(0 3 2 1 0 0 0 0 0 2 1 3 0 0 0 0 TPerm)],
  27. [qw(0 3 1 2 0 0 1 1 2 3 0 1 1 0 1 1 FatSune)],
  28. [qw(0 2 3 1 0 1 1 0 0 1 2 3 2 1 2 1 DblFatSune)],
  29. [qw(2 3 0 1 0 0 1 1 2 3 0 1 2 0 2 2 RUR2FRF2UF)], # PureSune
  30. [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
  31. [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
  32. [qw(2 3 0 1 0 0 0 0 0 1 2 3 1 1 0 1 R'U2R2UR2URU'RU'R')], # SuneH
  33. [qw(0 3 1 2 0 0 1 1 0 2 3 1 1 1 0 1 L'U2LU2LF'L'F)], # C2
  34. [qw(0 3 1 2 0 0 1 1 2 1 3 0 1 1 0 1 FR'F'RU2RU2R')], # C3
  35. [qw(1 2 0 3 0 1 1 0 1 0 3 2 0 2 1 0 FRUR'U'F')], # FRURUF
  36. [qw(2 0 1 3 1 0 1 0 0 1 2 3 2 2 1 1 FRUR'U'RUR'U'F')], # DblFRURUF
  37. [qw(0 1 2 3 0 0 0 0 3 1 0 2 2 0 0 1 L'R'D2RU2R'D2RU2L)], #Opp3
  38. [qw(1 2 3 0 0 0 0 0 2 0 3 1 1 1 0 1 RU'L'UR'U'L)], # Niklas
  39. [qw(3 1 0 2 0 0 1 1 1 2 0 3 1 1 1 0 rU'r'U'rUr'F'UF)], #WeirdNiklas
  40. [qw(2 3 0 1 1 0 0 1 1 2 0 3 1 1 1 0 RU'R'U'F'U2'FU2RU2R')], # FatNiklas
  41. [qw(0 1 2 3 0 0 0 0 0 2 3 1 0 0 0 0 RB'RF2R'BRF2R2)], # A Perm
  42. [qw(0 3 1 2 0 0 0 0 0 1 2 3 0 0 0 0 M2U'MU2M'U'M2)], # U Perm
  43. [qw(2 3 0 1 0 0 0 0 0 1 2 3 0 0 0 0 M2UM2U2M2UM2)], # H Perm
  44. [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
  45. [qw(1 2 0 3 0 1 1 0 1 3 2 0 0 2 0 1 RUR'U'R'FRF')], # SexyHammer
  46. [qw(0 1 2 3 0 0 0 0 1 3 2 0 0 2 0 1 rUR'U'r'FRF')], # FatSexyHammer
  47. [qw(3 1 2 0 0 0 1 1 1 0 2 3 2 0 0 1 R'FRUR'U'F'UR)], # HardP
  48. [qw(0 2 3 1 0 0 1 1 1 0 3 2 1 0 0 2 R'U'R'FRF'UR)], # EasyC
  49. [qw(1 0 3 2 1 1 1 1 0 1 2 3 0 0 0 0 r'UM2etc)], # ZFlip
  50. [qw(2 3 0 1 1 1 1 1 0 1 2 3 0 0 0 0 MURUR'U'M2URU'r'U')], # HFlip
  51. [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
  52. [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
  53. [qw(1 2 0 3 0 1 1 0 0 2 3 1 2 0 1 0 FRU'RDR'U2RD'R2'U'F')], # WeirdT
  54. [qw(3 0 1 2 1 0 1 0 2 0 3 1 2 0 0 1 RUR'UF'L'ULFU'RU'R')], # PowerT
  55. [qw(1 3 2 0 1 0 0 1 1 3 2 0 1 0 0 2 L2F2R'FRF2L2U2LF'L')], # CheckU
  56. [qw(0 3 1 2 0 0 1 1 3 0 2 1 1 2 2 1 rUR'URUL'UR'U'LUM)], # RandomH
  57. [qw(0 1 2 3 0 0 0 0 0 1 2 3 0 2 0 1 F'RD2R'FU2F'RD2R'FU2)], # PureL
  58. [qw(0 1 2 3 0 0 0 0 0 3 1 2 0 2 0 1 R2DR'U2RD'R'U2R')], # L3
  59. [qw(1 2 0 3 0 1 1 0 0 3 1 2 2 1 0 0 FR2DR'URD'R2U'F')], # E2
  60. [qw(3 1 0 2 1 0 1 0 0 3 1 2 2 1 0 0 fR2DR'URD'R2U'f')], # FatE2
  61. [qw(2 1 3 0 1 0 1 0 1 2 0 3 0 1 2 0 F'LFL'U'L'UL)], # D5
  62. [qw(2 0 3 1 0 0 0 0 3 1 2 0 1 2 1 2 RU'L'UR'ULUL'UL)], # G5
  63. [qw(0 1 2 3 0 1 0 1 1 0 3 2 1 1 2 2 R'U'RU'R'UF'UFR)], # G6
  64. [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
  65. [qw(1 2 0 3 0 1 1 0 2 0 1 3 2 2 1 1 FRUR'U'RF'rUR'U'r')], # H2Opp
  66. [qw(0 2 1 3 0 0 0 0 0 2 1 3 0 0 0 0 JPerm)]
  67. );
  68.  
  69. my @eplookup =  (
  70. [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)],
  71. [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)],
  72. [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)]
  73. );
  74.  
  75. my @cplookup =  (
  76. [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)],
  77. [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)],
  78. [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)]
  79. );
  80.  
  81. my @colookup =  (
  82. [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)],
  83. [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)],
  84. [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)],
  85. [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)]
  86. );
  87.  
  88. my @ilookup =  (
  89. [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)],
  90. [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)],
  91. [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)]
  92. );
  93.  
  94. sub mirror($) {
  95.     my ($alg) = @_;
  96.     my @stuff = @$alg;
  97.  
  98.     my @buf;
  99.  
  100.     # EP
  101.     for (0 .. 23) {
  102.         if ($eplookup[$_][0] == $stuff[0] && $eplookup[$_][1] == $stuff[1] && $eplookup[$_][2] == $stuff[2] && $eplookup[$_][3] == $stuff[3]) {
  103.             @buf[0 .. 3] = @{$eplookup[$_]}[4 .. 7];
  104.             last;
  105.         }
  106.         if ($_ == 23) {
  107.             die "wrong EP or something\n";
  108.         }
  109.     }
  110.  
  111.     # EO
  112.     @buf[4 .. 7] = @stuff[4,7,6,5];
  113.  
  114.     # CP
  115.     for (0 .. 23) {
  116.         if ($cplookup[$_][0] == $stuff[8] && $cplookup[$_][1] == $stuff[9] && $cplookup[$_][2] == $stuff[10] && $cplookup[$_][3] == $stuff[11]) {
  117.             @buf[8 .. 11] = @{$cplookup[$_]}[4 .. 7];
  118.             last;
  119.         }
  120.         if ($_ == 23) {
  121.             die "wrong CP or something\n";
  122.         }
  123.     }
  124.  
  125.     #CO
  126.     for (0 .. 26) {
  127.         if ($colookup[$_][0] == $stuff[12] && $colookup[$_][1] == $stuff[13] && $colookup[$_][2] == $stuff[14] && $colookup[$_][3] == $stuff[15]) {
  128.             @buf[12 .. 15] = @{$colookup[$_]}[4 .. 7];
  129.             last;
  130.         }
  131.         if ($_ == 26) {
  132.             die "wrong CO or something\n";
  133.         }
  134.     }
  135.  
  136.     $buf[16] = "Mrr($stuff[16])";
  137.  
  138.     return \@buf;
  139. }
  140.  
  141. sub inverse($) {
  142.     my ($alg) = @_;
  143.     my @stuff = @$alg;
  144.  
  145.     my @buf;
  146.  
  147.     # EP
  148.     for (0 .. 23) {
  149.         if ($ilookup[$_][0] == $stuff[0] && $ilookup[$_][1] == $stuff[1] && $ilookup[$_][2] == $stuff[2] && $ilookup[$_][3] == $stuff[3]) {
  150.             @buf[0 .. 3] = @{$ilookup[$_]}[4 .. 7];
  151.             last;
  152.         }
  153.         if ($_ == 23) {
  154.             die "wrong EP or something\n";
  155.         }
  156.     }
  157.    
  158.     #EO
  159.     @buf[4 .. 7] = (0,0,0,0);
  160.    
  161.     for (0 .. 3) {
  162.         if ($stuff[$_ + 4]) {
  163.             $buf[$stuff[$_] + 4] = 1;
  164.         }
  165.     }
  166.     # CP
  167.     for (0 .. 23) {
  168.         if ($ilookup[$_][0] == $stuff[8] && $ilookup[$_][1] == $stuff[9] && $ilookup[$_][2] == $stuff[10] && $ilookup[$_][3] == $stuff[11]) {
  169.             @buf[8 .. 11] = @{$ilookup[$_]}[4 .. 7];
  170.             last;
  171.         }
  172.         if ($_ == 23) {
  173.             die "wrong EP or something\n";
  174.         }
  175.     }
  176.    
  177.     #CO
  178.     @buf[12 .. 15] = (0,0,0,0);
  179.    
  180.     for (0 .. 3) {
  181.         $buf[$stuff[$_+8]+12] = (3 - $stuff[$_+12]) % 3;
  182.     }
  183.    
  184.     $buf[16] = "Inv($stuff[16])";
  185.    
  186.     return \@buf;
  187. }
  188.  
  189. sub do_y($) {
  190.     my ($pos) = @_;
  191.     my @y;
  192.     my @rebase = (3,0,1,2);
  193.     for (0 .. 3) {
  194.         my $base = $_ * 4;
  195.         if ($_ == 0 || $_ == 2) {
  196.             @y[$base .. $base+3] = map $rebase[$_], @{$pos}[$base+3, $base+0, $base+1, $base+2];
  197.         }
  198.         else {
  199.             @y[$base .. $base+3] = @{$pos}[$base+3, $base+0, $base+1, $base+2];
  200.         }
  201.     }
  202.     \@y;
  203. }
  204.  
  205. sub add_alg($$) {
  206.     my ($old, $new) = @_;
  207.     #print "add_alg(@$old, @$new)\n";
  208.     for (0 .. 3) {
  209.         my $old_key = join " ", @{$old}[0 .. 15];
  210.         my $new_key = join " ", @{$new}[0 .. 15];
  211.         #print "$old_key <> $new_key\n";
  212.         if ($old_key eq $new_key) {
  213.             #print "SAEM!\n";
  214.             return;
  215.         }
  216.         $old = do_y($old);
  217.     }
  218.     #print "DIFFURENT\n";
  219.     push @basealgs, $new;
  220. }
  221.  
  222. #Populate database with mirrors and inverses
  223. my $orig_algs = @basealgs;
  224. for (0 .. $orig_algs - 1) {
  225.     add_alg($basealgs[$_], mirror($basealgs[$_]));
  226.     add_alg($basealgs[$_], inverse($basealgs[$_]));
  227.     add_alg($basealgs[$_], inverse(mirror($basealgs[$_])));
  228. }
  229.  
  230. #Show array (debug)
  231. #for $aref ( @basealgs ) {
  232. #print "\t [@$aref],\n";
  233. #}
  234. #print "\n\n";
  235.  
  236. sub solved($) {
  237.     my ($position) = @_;
  238.     for my $solved (\@solved1, \@solved2, \@solved3, \@solved4) {
  239.         my $equal = 1;
  240.         for (0 .. @$position - 1) {
  241.             if ($position->[$_] != $solved->[$_]) {
  242.                 $equal = 0;
  243.                 last;
  244.             }
  245.         }
  246.         if ($equal) {
  247.             return 1;
  248.         }
  249.     }
  250.     return 0;
  251. }
  252.  
  253. sub domove($$) {
  254.     my ($position, $alg) = @_;
  255.     my @buf;
  256.     # EP
  257.     for (0 .. 3) {
  258.         $buf[$_] = $position->[$alg->[$_]];
  259.         $buf[$_+4] = $position->[$alg->[$_]+4]; #EO
  260.     }
  261.     # EO
  262.     for (4 .. 7) {
  263.         if ($alg->[$_]) {
  264.             $buf[$_] = 1 - $buf[$_];
  265.         }
  266.     }
  267.     # CP
  268.     for (8 .. 11) {
  269.         $buf[$_] = $position->[$alg->[$_]+8];
  270.         $buf[$_+4] = $position->[$alg->[$_]+12]; #CO
  271.     }
  272.     # CO
  273.     for (12 .. 15) {
  274.         if ($alg->[$_]) {
  275.             $buf[$_] = ($buf[$_] + $alg->[$_]) % 3;
  276.         }
  277.     }
  278.     return @buf;
  279. }
  280.  
  281. for my $auf1 (0 .. 3) {
  282.     my $str_auf1 = ("", "U ", "U' ", "U2 ")[$auf1];
  283.     my $alg_auf1 = (\@solved1, \@solved2, \@solved3, \@solved4)[$auf1];
  284.     my @case1 = domove(\@case, $alg_auf1);
  285.  
  286.     if (solved(\@case)) {
  287.         print "> \n";
  288.         last;
  289.     }
  290.  
  291.     for my $alg1 (1 .. $#basealgs) {
  292.         my @case2 = domove(\@case1, $basealgs[$alg1]);
  293.         if (solved(\@case2)) {
  294.             print "> $str_auf1$basealgs[$alg1][16]\n";
  295.             next;
  296.         }
  297.         for my $auf2 (0 .. 3) {
  298.             my $str_auf2 = ("", "U ", "U' ", "U2 ")[$auf2];
  299.             my $alg_auf2 = (\@solved1, \@solved2, \@solved3, \@solved4)[$auf2];
  300.             my @case3 = domove(\@case2, $alg_auf2);
  301.  
  302.             for my $alg2 (1 .. $#basealgs) {
  303.                 my @case4 = domove(\@case3, $basealgs[$alg2]);
  304.                 if (solved(\@case4)) {
  305.                     print "> $str_auf1$basealgs[$alg1][16] $str_auf2$basealgs[$alg2][16]\n";
  306.                 }
  307.             }
  308.         }
  309.     }
  310. }
  311.  
  312. print "\nEnd\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement