#!perl # Rubix Values and Routines @GetEdge=( # All 12 Edge Locations "1:37", "5:28", "7:19", "3:10", "14:21", "16:48", "12:41", "23:30", "25:46", "32:39", "34:50", "43:52"); @GetCorner=( # All 9 Corner Locations "0:9:38", "2:36:29", "8:27:20", "6:18:11", "45:17:24", "47:26:33", "53:35:42", "51:44:15"); @colors=( "Red","White","Green","Blue","Yellow","Orange","Cyan","Pink","Magenta"); @table=( "","","","","",""); # Used for Applet $facelets = "102112122101111121100110120220210200221211201222212202000001002010011012020021022322321320312311310302301300502512522501511521500510520422421420412411410402401400"; sub compact { local($_)=@_; while (($i=index($_,'S'))>=$[) { substr($_,$i,1)=""; substr($_,$i)=~tr/D-O/G-OD-F/; } s/[T-Z]/T/g; 1 while (s/AC|BB|CA|DF|EE|FD|GI|HH|IG|JL|KK|LJ|MO|NN|OM|PR|QQ|RP//g || s/ATC|BTB|CTA|DTF|ETE|FTD|GTI|HTH|ITG|JTL|KTK|LTJ|MTO|NTN|OTM|PTR|QTQ|RTP/T/g || s/([A-C])(T*)([P-R])/$3$2$1/g || s/([D-F])(T*)([J-L])/$3$2$1/g || s/([G-I])(T*)([M-O])/$3$2$1/g || s/B(T*)C|C(T*)B/$1$2A/g || s/A(T*)A|C(T*)C/$1$2B/g || s/A(T*)B|B(T*)A/$1$2C/g || s/E(T*)F|F(T*)E/$1$2D/g || s/D(T*)D|F(T*)F/$1$2E/g || s/D(T*)E|E(T*)D/$1$2F/g || s/H(T*)I|I(T*)H/$1$2G/g || s/G(T*)G|I(T*)I/$1$2H/g || s/G(T*)H|H(T*)G/$1$2I/g || s/K(T*)L|L(T*)K/$1$2J/g || s/J(T*)J|L(T*)L/$1$2K/g || s/J(T*)K|K(T*)J/$1$2L/g || s/N(T*)O|O(T*)N/$1$2M/g || s/M(T*)M|O(T*)O/$1$2N/g || s/M(T*)N|N(T*)M/$1$2O/g || s/Q(T*)R|R(T*)Q/$1$2P/g || s/P(T*)P|R(T*)R/$1$2Q/g || s/P(T*)Q|Q(T*)P/$1$2R/g); s/T/t/; s/T/U/; s/T/V/; s/T/W/; s/T/X/; s/T/Y/; s/T/Z/; s/t/T/; $_; } sub Export { $result=""; for ($k=0;$k<6;$k++) {for ($i=0;$i<3;$i++) {for ($j=0;$j<3;$j++) {$result.=$taken{$r{"$i$j$k"}};}}} $result; } sub Import { local($ent,@temp); ($ent)=@_; %r=(); @temp=(0,1,2,3,4,5,6); foreach (keys(%taken)) {$temp[$taken{$_}]=$_;} for ($k=0;$k<6;$k++) {for ($i=0;$i<3;$i++) {for ($j=0;$j<3;$j++) { $r{"$i$j$k"}=$temp[substr($ent,0,1)]; $ent=substr($ent,1); }}} } sub Steps { my ($codes)=@_; my $h; $codes=~s/[S-Z]//g; $h=&Human($codes); "\n"; } sub Human { my $h=""; foreach (unpack("c*",$_[0])) {$h.=substr("To Ti Ta Lo Li La Fo Fi Fa Ro Ri Ra Bo Bi Ba Do Di Da RotTedTcoMidBcpBcoBepBeo",($_-65)*3,3);} $h=~s%Rot%ROTATE! %; $h=~s%Ted%[Step 1 - Top Edges (4) Are Complete!] %; $h=~s%Tco%[Step 2 - Top Corners (4) Are Complete!] %; $h=~s%Mid%[Step 3 - Middle Layer Edges (4) Are Complete!] %; $h=~s%Bcp%[Step 4 - Bottom Corners (4) Are Placed Correctly!] %; $h=~s%Bco%[Step 5 - Bottom Corners (4) Are Oriented Perfectly!] %; $h=~s%Bep%[Step 6 - Bottom Edges (4) Are Placed Correctly!] %; $h=~s%Beo%[Step 7 - Bottom Edges (4) Are Oriented Perfectly!] %; $h; } sub DoToCube { local($codes)=@_; $codes=~s/[T-Z]//g; foreach (unpack("c*",$codes)) {$_ == 83 ? &Rotate() : &OneMove(int(($_-65)/3)+1,($_-65)%3+1);} } sub Rotate { $main=~s/(.)(.)(.)(.)(.)(.)(.)(.)(.)(.........)(.........)(.........)(.........)(.)(.)(.)(.)(.)(.)(.)(.)(.)/$7$4$1$8$5$2$9$6$3$11$12$13$10$16$19$22$15$18$21$14$17$20/; $main=~tr/123456/152346/; } sub OneMove { ($face,$times)=@_; $temp=substr($main,($face-1)*9,9); for ($a=0;$a<$times;$a++) {$temp=~s/(.)(.)(.)(.)(.)(.)(.)(.)(.)/$7$4$1$8$5$2$9$6$3/;} substr($main,($face-1)*9,9)=$temp; for ($a=0;$a<$times;$a++) { $main=~s/(.........)(...)(......)(...)(......)(...)(......)(...)(...............)/$1$4$3$6$5$8$7$2$9/ if ($face == 1); $main=~s/(.)(..)(.)(..)(.)(...........)(.)(..)(.)(..)(.)(.............)(.)(..)(.)(..)(.)(.)(..)(.)(..)(.)(..)/$17$2$15$4$13$6$1$8$3$10$5$12$22$14$20$16$18$7$19$9$21$11$23/ if ($face == 2); $main=~s/(......)(.)(.)(.)(..)(.)(..)(.)(..)(.)(.........)(.)(..)(.)(..)(.)(...........)(.)(.)(.)(......)/$1$10$8$6$5$18$7$19$9$20$11$2$13$3$15$4$17$16$14$12$21/ if ($face == 3); $main=~s/(..)(.)(..)(.)(..)(.)(...........)(.)(..)(.)(..)(.)(.........)(.)(..)(.)(..)(.)(....)(.)(..)(.)(..)(.)/$1$8$3$10$5$12$7$20$9$22$11$24$13$6$15$4$17$2$19$18$21$16$23$14/ if ($face == 4); $main=~s/(.)(.)(.)(......)(.)(..)(.)(..)(.)(.............)(.)(..)(.)(..)(.)(...............)(.)(.)(.)/$11$13$15$4$3$6$2$8$1$10$19$12$18$14$17$16$5$7$9/ if ($face == 5); $main=~s/(...............)(...)(......)(...)(......)(...)(......)(...)(.........)/$1$8$3$2$5$4$7$6$9/ if ($face == 6); } } sub LocateEdge { ($pp,$study)=@_; ($c1,$c2)=split(//,$pp); foreach $edg (@GetEdge) { ($d1,$d2)=split(/\:/,$edg); if (substr($study,$d1,1) eq $c1 && substr($study,$d2,1) eq $c2) {return (int($d1/9)+1).(int($d2/9)+1);} if (substr($study,$d1,1) eq $c2 && substr($study,$d2,1) eq $c1) {return (int($d2/9)+1).(int($d1/9)+1);} } &crash("Stickers have been switched! You NERD! PC #$c1$c2"); } sub LocateCorner { ($pp,$study)=@_; ($c1,$c2,$c3)=split(//,$pp); foreach $cor (@GetCorner) { ($d1,$d2,$d3)=split(/\:/,$cor); if (substr($study,$d1,1) eq $c1 && substr($study,$d2,1) eq $c2 && substr($study,$d3,1) eq $c3) {return (int($d1/9)+1).(int($d2/9)+1).(int($d3/9)+1);} if (substr($study,$d2,1) eq $c1 && substr($study,$d3,1) eq $c2 && substr($study,$d1,1) eq $c3) {return (int($d2/9)+1).(int($d3/9)+1).(int($d1/9)+1);} if (substr($study,$d3,1) eq $c1 && substr($study,$d1,1) eq $c2 && substr($study,$d2,1) eq $c3) {return (int($d3/9)+1).(int($d1/9)+1).(int($d2/9)+1);} } &crash("Stickers have been switched! You NERD! PC #$c1$c2$c3"); } 1;