Solve a Rubik's cube: Difference between revisions
Content added Content deleted
m (capitalized a word.) |
m (→{{header|Phix}}: syntax coloured) |
||
Line 1,317: | Line 1,317: | ||
Uses brute-force (width/highscore-first) Fridrich-steps (ie cross,f2l,oll,pll).<br> |
Uses brute-force (width/highscore-first) Fridrich-steps (ie cross,f2l,oll,pll).<br> |
||
Not the fastest (see THRESHOLD) or shortest results (see thistlethwaite) but the code is pretty easy to follow.<br> |
Not the fastest (see THRESHOLD) or shortest results (see thistlethwaite) but the code is pretty easy to follow.<br> |
||
The final stage (pll) would probably benefit the most from being replaced with standard algorithms. |
The final stage (pll) would probably benefit the most from being replaced with standard algorithms.<br> |
||
While technically this works under pwa/p2js, you should expect a blank screen for nearly 3 minutes. |
|||
<lang Phix>-- |
|||
<!--<lang Phix>(phixonline)--> |
|||
-- demo\rosetta\rubik_cfop.exw |
|||
<span style="color: #000080;font-style:italic;">-- |
|||
-- |
|||
-- demo\rosetta\rubik_cfop.exw |
|||
-- Each stage uses a workspace of moves tried so far, ranked by score. |
|||
-- |
|||
-- We repeatedly take the best scoring so far and try more moves, storing |
|||
-- |
-- Each stage uses a workspace of moves tried so far, ranked by score. |
||
-- We repeatedly take the best scoring so far and try more moves, storing |
|||
-- determines the minimum number we should examine before discarding a |
|||
-- those results in a second/new workspace. The THRESHOLD value below |
|||
-- workspace and switching to the new (one move longer) one. We only ever |
|||
-- determines the minimum number we should examine before discarding a |
|||
-- switch on change of score, and obviously the first workspace is empty, |
|||
-- workspace and switching to the new (one move longer) one. We only ever |
|||
-- and the next new workspace has a maximum of 12 entries (+/-90 by 6), |
|||
-- switch on change of score, and obviously the first workspace is empty, |
|||
-- both of which will force earlier switches. |
|||
-- and the next new workspace has a maximum of 12 entries (+/-90 by 6), |
|||
-- |
|||
-- both of which will force earlier switches. |
|||
constant THRESHOLD = 100000 -- 100000 -- very slow (100s), best results |
|||
--</span> |
|||
-- 10000 -- slow (10s), reasonable results |
|||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span> |
|||
-- 1000 -- fast (1s), fairly poor results |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">THRESHOLD</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">100000</span> <span style="color: #000080;font-style:italic;">-- 100000 -- very slow (100s), best results |
|||
-- 100 -- (counter-productive/slower) |
|||
-- 10000 -- 10000 -- slow (10s), reasonable results |
|||
-- 1000 -- fast (1s), fairly poor results |
|||
string init =""" |
|||
-- 100 -- (counter-productive/slower)</span> |
|||
_____________---YYY-------- |
|||
---YYY-------- |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">init</span> <span style="color: #0000FF;">=</span><span style="color: #008000;">""" |
|||
---YYY-------- |
|||
---YYY-------- |
|||
BBBRRRGGGOOO-- |
|||
---YYY-------- |
|||
BBBRRRGGGOOO-- |
|||
---YYY-------- |
|||
BBBRRRGGGOOO-- |
|||
BBBRRRGGGOOO-- |
|||
------WWW----- |
|||
BBBRRRGGGOOO-- |
|||
------WWW----- |
|||
BBBRRRGGGOOO-- |
|||
------WWW----- |
|||
------WWW----- |
|||
------WWW----- |
|||
""" |
|||
------WWW----- |
|||
-- numbering: |
|||
-- 1..15: ---456--------\n |
|||
"""</span> |
|||
-- 16..30: ---901--------\n -- U |
|||
<span style="color: #000080;font-style:italic;">-- numbering: |
|||
-- 31..45: ---456--------\n |
|||
-- |
-- 1..15: ---456--------\n |
||
-- |
-- 16..30: ---901--------\n -- U |
||
-- |
-- 31..45: ---456--------\n |
||
-- |
-- 46..60: 678901234567--\n |
||
-- |
-- 61..75: 123456789012--\n -- LFRB |
||
-- |
-- 76..90: 678901234567--\n |
||
-- 91..105: ------789-----\n |
|||
-- 106..120:------234-----\n -- D |
|||
if length(init)!=136 then ?9/0 end if |
|||
-- 121..136:------789-----\n\n</span> |
|||
-- |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">init</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">136</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
-- TIP: Wrap a cube with blank paper, and write |
|||
-- the numbers on it, to derive these sets. |
|||
<span style="color: #000080;font-style:italic;">-- |
|||
-- |
|||
-- TIP: Wrap a cube with blank paper, and write |
|||
constant centres = {20,62,65,68,71,113} |
|||
-- the numbers on it, to derive these sets. |
|||
--</span> |
|||
constant edges = {{ 4, 5, 6,57,56,55}, -- ie YYY/OOO |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">centres</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">20</span><span style="color: #0000FF;">,</span><span style="color: #000000;">62</span><span style="color: #0000FF;">,</span><span style="color: #000000;">65</span><span style="color: #0000FF;">,</span><span style="color: #000000;">68</span><span style="color: #0000FF;">,</span><span style="color: #000000;">71</span><span style="color: #0000FF;">,</span><span style="color: #000000;">113</span><span style="color: #0000FF;">}</span> |
|||
{ 6, 21, 36,54,53,52}, -- YYY/GGG |
|||
{ 34, 35, 36,49,50,51}, -- YYY/RRR |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">edges</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">57</span><span style="color: #0000FF;">,</span><span style="color: #000000;">56</span><span style="color: #0000FF;">,</span><span style="color: #000000;">55</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- ie YYY/OOO</span> |
|||
{ 4, 19, 34,46,47,48}, -- YYY/BBB |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">21</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">36</span><span style="color: #0000FF;">,</span><span style="color: #000000;">54</span><span style="color: #0000FF;">,</span><span style="color: #000000;">53</span><span style="color: #0000FF;">,</span><span style="color: #000000;">52</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- YYY/GGG</span> |
|||
{ 51, 66, 81,52,67,82}, -- RRR/GGG |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">34</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">35</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">36</span><span style="color: #0000FF;">,</span><span style="color: #000000;">49</span><span style="color: #0000FF;">,</span><span style="color: #000000;">50</span><span style="color: #0000FF;">,</span><span style="color: #000000;">51</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- YYY/RRR</span> |
|||
{ 54, 69, 84,55,70,85}, -- GGG/OOO |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">34</span><span style="color: #0000FF;">,</span><span style="color: #000000;">46</span><span style="color: #0000FF;">,</span><span style="color: #000000;">47</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- YYY/BBB</span> |
|||
{ 57, 72, 87,46,61,76}, -- OOO/BBB |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">51</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">66</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">81</span><span style="color: #0000FF;">,</span><span style="color: #000000;">52</span><span style="color: #0000FF;">,</span><span style="color: #000000;">67</span><span style="color: #0000FF;">,</span><span style="color: #000000;">82</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- RRR/GGG</span> |
|||
{ 48, 63, 78,49,64,79}, -- BBB/RRR |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">54</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">69</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">84</span><span style="color: #0000FF;">,</span><span style="color: #000000;">55</span><span style="color: #0000FF;">,</span><span style="color: #000000;">70</span><span style="color: #0000FF;">,</span><span style="color: #000000;">85</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- GGG/OOO</span> |
|||
{ 97, 98, 99,82,83,84}, -- WWW/GGG |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">57</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">72</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">87</span><span style="color: #0000FF;">,</span><span style="color: #000000;">46</span><span style="color: #0000FF;">,</span><span style="color: #000000;">61</span><span style="color: #0000FF;">,</span><span style="color: #000000;">76</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- OOO/BBB</span> |
|||
{ 99,114,129,85,86,87}, -- WWW/OOO |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">48</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">63</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">78</span><span style="color: #0000FF;">,</span><span style="color: #000000;">49</span><span style="color: #0000FF;">,</span><span style="color: #000000;">64</span><span style="color: #0000FF;">,</span><span style="color: #000000;">79</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- BBB/RRR</span> |
|||
{127,128,129,78,77,76}, -- WWW/BBB |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">97</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">98</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">99</span><span style="color: #0000FF;">,</span><span style="color: #000000;">82</span><span style="color: #0000FF;">,</span><span style="color: #000000;">83</span><span style="color: #0000FF;">,</span><span style="color: #000000;">84</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- WWW/GGG</span> |
|||
{ 97,112,127,81,80,79}} -- WWW/RRR |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">99</span><span style="color: #0000FF;">,</span><span style="color: #000000;">114</span><span style="color: #0000FF;">,</span><span style="color: #000000;">129</span><span style="color: #0000FF;">,</span><span style="color: #000000;">85</span><span style="color: #0000FF;">,</span><span style="color: #000000;">86</span><span style="color: #0000FF;">,</span><span style="color: #000000;">87</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- WWW/OOO</span> |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">127</span><span style="color: #0000FF;">,</span><span style="color: #000000;">128</span><span style="color: #0000FF;">,</span><span style="color: #000000;">129</span><span style="color: #0000FF;">,</span><span style="color: #000000;">78</span><span style="color: #0000FF;">,</span><span style="color: #000000;">77</span><span style="color: #0000FF;">,</span><span style="color: #000000;">76</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- WWW/BBB</span> |
|||
constant corners = {{ 4, 57,46},{34,48, 49},{36,51,52},{ 6,54,55}, |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">97</span><span style="color: #0000FF;">,</span><span style="color: #000000;">112</span><span style="color: #0000FF;">,</span><span style="color: #000000;">127</span><span style="color: #0000FF;">,</span><span style="color: #000000;">81</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">,</span><span style="color: #000000;">79</span><span style="color: #0000FF;">}}</span> <span style="color: #000080;font-style:italic;">-- WWW/RRR</span> |
|||
-- YOB/UBL YBR/UFL YRG/UFR YGO/UBL |
|||
{76,129,87},{78,79,127},{81,82,97},{84,85,99}} |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">corners</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">57</span><span style="color: #0000FF;">,</span><span style="color: #000000;">46</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">34</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">49</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">36</span><span style="color: #0000FF;">,</span><span style="color: #000000;">51</span><span style="color: #0000FF;">,</span><span style="color: #000000;">52</span><span style="color: #0000FF;">},{</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">54</span><span style="color: #0000FF;">,</span><span style="color: #000000;">55</span><span style="color: #0000FF;">},</span> |
|||
-- BWO/DBL BRW/DFL RGW/DFR GOW/DFL |
|||
<span style="color: #000080;font-style:italic;">-- YOB/UBL YBR/UFL YRG/UFR YGO/UBL</span> |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">76</span><span style="color: #0000FF;">,</span><span style="color: #000000;">129</span><span style="color: #0000FF;">,</span><span style="color: #000000;">87</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">78</span><span style="color: #0000FF;">,</span><span style="color: #000000;">79</span><span style="color: #0000FF;">,</span><span style="color: #000000;">127</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">81</span><span style="color: #0000FF;">,</span><span style="color: #000000;">82</span><span style="color: #0000FF;">,</span><span style="color: #000000;">97</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">84</span><span style="color: #0000FF;">,</span><span style="color: #000000;">85</span><span style="color: #0000FF;">,</span><span style="color: #000000;">99</span><span style="color: #0000FF;">}}</span> |
|||
constant facing_corners = {-16,-14,16,14}, -- (nb not 14,16) |
|||
<span style="color: #000080;font-style:italic;">-- BWO/DBL BRW/DFL RGW/DFR GOW/DFL</span> |
|||
facing_edges = {-15, 1,15,-1}, |
|||
fce = facing_corners&facing_edges, |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">facing_corners</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{-</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">14</span><span style="color: #0000FF;">,</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">14</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- (nb not 14,16)</span> |
|||
rotations = { |
|||
<span style="color: #000000;">facing_edges</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{-</span><span style="color: #000000;">15</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">15</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span> |
|||
-- up (clockwise): |
|||
<span style="color: #000000;">fce</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">facing_corners</span><span style="color: #0000FF;">&</span><span style="color: #000000;">facing_edges</span><span style="color: #0000FF;">,</span> |
|||
{{57,54,51,48}, -- clockwise corners |
|||
<span style="color: #000000;">rotations</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> |
|||
{46,55,52,49}, -- anticlockwise corners |
|||
<span style="color: #000080;font-style:italic;">-- up (clockwise):</span> |
|||
<span style="color: #0000FF;">{{</span><span style="color: #000000;">57</span><span style="color: #0000FF;">,</span><span style="color: #000000;">54</span><span style="color: #0000FF;">,</span><span style="color: #000000;">51</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- clockwise corners</span> |
|||
-- left |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">46</span><span style="color: #0000FF;">,</span><span style="color: #000000;">55</span><span style="color: #0000FF;">,</span><span style="color: #000000;">52</span><span style="color: #0000FF;">,</span><span style="color: #000000;">49</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- anticlockwise corners</span> |
|||
{{ 4,49,127, 87}, |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">47</span><span style="color: #0000FF;">,</span><span style="color: #000000;">56</span><span style="color: #0000FF;">,</span><span style="color: #000000;">53</span><span style="color: #0000FF;">,</span><span style="color: #000000;">50</span><span style="color: #0000FF;">}},</span> <span style="color: #000080;font-style:italic;">-- middle edges |
|||
{57,34, 79,129}, |
|||
-- left</span> |
|||
<span style="color: #0000FF;">{{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">49</span><span style="color: #0000FF;">,</span><span style="color: #000000;">127</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">87</span><span style="color: #0000FF;">},</span> |
|||
-- front |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">57</span><span style="color: #0000FF;">,</span><span style="color: #000000;">34</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">79</span><span style="color: #0000FF;">,</span><span style="color: #000000;">129</span><span style="color: #0000FF;">},</span> |
|||
{{34,52, 97, 78}, |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">19</span><span style="color: #0000FF;">,</span><span style="color: #000000;">64</span><span style="color: #0000FF;">,</span><span style="color: #000000;">128</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">72</span><span style="color: #0000FF;">}},</span> |
|||
{48,36, 82,127}, |
|||
<span style="color: #000080;font-style:italic;">-- front</span> |
|||
<span style="color: #0000FF;">{{</span><span style="color: #000000;">34</span><span style="color: #0000FF;">,</span><span style="color: #000000;">52</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">97</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">78</span><span style="color: #0000FF;">},</span> |
|||
-- right |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">48</span><span style="color: #0000FF;">,</span><span style="color: #000000;">36</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">82</span><span style="color: #0000FF;">,</span><span style="color: #000000;">127</span><span style="color: #0000FF;">},</span> |
|||
{{36,55,99,81}, |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">35</span><span style="color: #0000FF;">,</span><span style="color: #000000;">67</span><span style="color: #0000FF;">,</span><span style="color: #000000;">112</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">63</span><span style="color: #0000FF;">}},</span> |
|||
{51, 6,85,97}, |
|||
<span style="color: #000080;font-style:italic;">-- right</span> |
|||
<span style="color: #0000FF;">{{</span><span style="color: #000000;">36</span><span style="color: #0000FF;">,</span><span style="color: #000000;">55</span><span style="color: #0000FF;">,</span><span style="color: #000000;">99</span><span style="color: #0000FF;">,</span><span style="color: #000000;">81</span><span style="color: #0000FF;">},</span> |
|||
-- back |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">51</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">85</span><span style="color: #0000FF;">,</span><span style="color: #000000;">97</span><span style="color: #0000FF;">},</span> |
|||
{{ 6,46,129,84}, |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">21</span><span style="color: #0000FF;">,</span><span style="color: #000000;">70</span><span style="color: #0000FF;">,</span><span style="color: #000000;">98</span><span style="color: #0000FF;">,</span><span style="color: #000000;">66</span><span style="color: #0000FF;">}},</span> |
|||
{54, 4, 76,99}, |
|||
<span style="color: #000080;font-style:italic;">-- back</span> |
|||
<span style="color: #0000FF;">{{</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">46</span><span style="color: #0000FF;">,</span><span style="color: #000000;">129</span><span style="color: #0000FF;">,</span><span style="color: #000000;">84</span><span style="color: #0000FF;">},</span> |
|||
-- down |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">54</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">76</span><span style="color: #0000FF;">,</span><span style="color: #000000;">99</span><span style="color: #0000FF;">},</span> |
|||
{{82,85,76,79}, |
|||
<span style="color: #0000FF;">{</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">61</span><span style="color: #0000FF;">,</span><span style="color: #000000;">114</span><span style="color: #0000FF;">,</span><span style="color: #000000;">69</span><span style="color: #0000FF;">}},</span> |
|||
{81,84,87,78}, |
|||
<span style="color: #000080;font-style:italic;">-- down</span> |
|||
<span style="color: #0000FF;">{{</span><span style="color: #000000;">82</span><span style="color: #0000FF;">,</span><span style="color: #000000;">85</span><span style="color: #0000FF;">,</span><span style="color: #000000;">76</span><span style="color: #0000FF;">,</span><span style="color: #000000;">79</span><span style="color: #0000FF;">},</span> |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">81</span><span style="color: #0000FF;">,</span><span style="color: #000000;">84</span><span style="color: #0000FF;">,</span><span style="color: #000000;">87</span><span style="color: #0000FF;">,</span><span style="color: #000000;">78</span><span style="color: #0000FF;">},</span> |
|||
--Up/Left/Front/Right/Back/Down |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">83</span><span style="color: #0000FF;">,</span><span style="color: #000000;">86</span><span style="color: #0000FF;">,</span><span style="color: #000000;">77</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">}}}</span> |
|||
enum U=1,L=2,F=3,/*R=4,*/B=5,D=6,Dbl=#08,Shift=#10 |
|||
constant U2 = U+Dbl, F2 = F+Dbl, /*R2 = R+Dbl, B2 = B+Dbl,*/ D2 = D+Dbl, |
|||
<span style="color: #000080;font-style:italic;">--Up/Left/Front/Right/Back/Down</span> |
|||
Us = U+Shift, Fs = F+Shift, Bs = B+Shift, Rs = R+Shift, Ds = D+Shift |
|||
<span style="color: #008080;">enum</span> <span style="color: #000000;">U</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">L</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">F</span><span style="color: #0000FF;">=</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">R</span><span style="color: #0000FF;">=</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">B</span><span style="color: #0000FF;">=</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">D</span><span style="color: #0000FF;">=</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">=</span><span style="color: #000000;">#08</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Shift</span><span style="color: #0000FF;">=</span><span style="color: #000000;">#10</span> |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">U2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">U</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">F2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">F</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">/*R2 = R+Dbl, B2 = B+Dbl,*/</span> <span style="color: #000000;">D2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">D</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">,</span> |
|||
enum CROSS,F2L,OLL,PLL |
|||
<span style="color: #000000;">Us</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">U</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Shift</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Fs</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">F</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Shift</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Bs</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">B</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Shift</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Rs</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">R</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Shift</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Ds</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">D</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Shift</span> |
|||
integer f2l = 0 -- (28==done) |
|||
<span style="color: #008080;">enum</span> <span style="color: #000000;">CROSS</span><span style="color: #0000FF;">,</span><span style="color: #000000;">F2L</span><span style="color: #0000FF;">,</span><span style="color: #000000;">OLL</span><span style="color: #0000FF;">,</span><span style="color: #000000;">PLL</span> |
|||
integer edge_score = 0 -- (0..12 for f2l [as U cleared], |
|||
-- 0..24 for oll and pll stages) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">f2l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- (28==done)</span> |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">edge_score</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- (0..12 for f2l [as U cleared], |
|||
function score(string cube, integer stage) |
|||
-- 0..24 for oll and pll stages)</span> |
|||
integer res = 0, c, cc, k |
|||
f2l = 0 |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">score</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">)</span> |
|||
for i=1 to length(centres) do |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cc</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k</span> |
|||
c = centres[i] |
|||
<span style="color: #000000;">f2l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
cc = cube[c] |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">centres</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
for j=1 to length(fce) do -- (the 8 next to c) |
|||
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">centres</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
k = c+fce[j] |
|||
<span style="color: #000000;">cc</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">c</span><span style="color: #0000FF;">]</span> |
|||
if cube[k]=cc then |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fce</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (the 8 next to c)</span> |
|||
res += 1 |
|||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">+</span><span style="color: #000000;">fce</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> |
|||
f2l += (stage>CROSS and k>=61) |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">cc</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
end for |
|||
<span style="color: #000000;">f2l</span> <span style="color: #0000FF;">+=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">stage</span><span style="color: #0000FF;">></span><span style="color: #000000;">CROSS</span> <span style="color: #008080;">and</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">61</span><span style="color: #0000FF;">)</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
-- give extra credit for edges paired with corners |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
edge_score = 0 -- += (0|1|2) for the 12 edges: |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
if stage>CROSS then |
|||
<span style="color: #000080;font-style:italic;">-- give extra credit for edges paired with corners</span> |
|||
for i=1 to length(edges) do |
|||
<span style="color: #000000;">edge_score</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- += (0|1|2) for the 12 edges:</span> |
|||
sequence ei = edges[i] -- as 123 |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">></span><span style="color: #000000;">CROSS</span> <span style="color: #008080;">then</span> |
|||
-- -- 456 |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">edges</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
-- then if {1,4}=={2,5} then edge_score += 1, |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ei</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">edges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- as 123 |
|||
-- plus if {2,5}=={3,6} then edge_score += 1. |
|||
-- -- 456 |
|||
edge_score += (cube[ei[1]]=cube[ei[2]] and |
|||
-- then if {1,4}=={2,5} then edge_score += 1, |
|||
-- plus if {2,5}=={3,6} then edge_score += 1.</span> |
|||
<span style="color: #000000;">edge_score</span> <span style="color: #0000FF;">+=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]]=</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]]</span> <span style="color: #008080;">and</span> |
|||
cube[ei[5]]=cube[ei[6]]) |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]]=</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">[</span><span style="color: #000000;">5</span><span style="color: #0000FF;">]])</span> <span style="color: #0000FF;">+</span> |
|||
end for |
|||
<span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]]=</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]]</span> <span style="color: #008080;">and</span> |
|||
end if |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">[</span><span style="color: #000000;">5</span><span style="color: #0000FF;">]]=</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ei</span><span style="color: #0000FF;">[</span><span style="color: #000000;">6</span><span style="color: #0000FF;">]])</span> |
|||
return res |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span> |
|||
function oll_score(string cube) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
-- (should only be invoked if f2l==28) |
|||
integer res = 0 -- (true if res=8) |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">oll_score</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">)</span> |
|||
integer cu = centres[U] |
|||
<span style="color: #000080;font-style:italic;">-- (should only be invoked if f2l==28)</span> |
|||
if cube[cu]!='Y' then ?9/0 end if |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- (true if res=8)</span> |
|||
for i=1 to length(fce) do |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">cu</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">centres</span><span style="color: #0000FF;">[</span><span style="color: #000000;">U</span><span style="color: #0000FF;">]</span> |
|||
integer fcei = fce[i] |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">cu</span><span style="color: #0000FF;">]!=</span><span style="color: #008000;">'Y'</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
res += (cube[cu+fcei]='Y') |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fce</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">fcei</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">fce</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
return res |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">+=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">cu</span><span style="color: #0000FF;">+</span><span style="color: #000000;">fcei</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'Y'</span><span style="color: #0000FF;">)</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span> |
|||
function rotate_face(string cube, integer face) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
-- |
|||
-- face is 1..6 for clockwise (ULFRBD), |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">rotate_face</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">face</span><span style="color: #0000FF;">)</span> |
|||
-- plus #08(Dbl) for a 180 (clockwise), |
|||
<span style="color: #000080;font-style:italic;">-- |
|||
-- plus #10(Shift) for anti-clockwise. |
|||
-- face is 1..6 for clockwise (ULFRBD), |
|||
-- |
|||
-- plus #08(Dbl) for a 180 (clockwise), |
|||
integer dbl = 1+(and_bits(face,Dbl)=Dbl) |
|||
-- plus #10(Shift) for anti-clockwise. |
|||
bool cw = 1-floor(face/Shift) |
|||
--</span> |
|||
face = remainder(face,Dbl) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">dbl</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">+(</span><span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">face</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">)</span> |
|||
integer cf = centres[face] |
|||
<span style="color: #004080;">bool</span> <span style="color: #000000;">cw</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">-</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">face</span><span style="color: #0000FF;">/</span><span style="color: #000000;">Shift</span><span style="color: #0000FF;">)</span> |
|||
sequence rf = {sq_add(facing_corners,cf), |
|||
<span style="color: #000000;">face</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">face</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">)</span> |
|||
sq_add(facing_edges,cf)} |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">cf</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">centres</span><span style="color: #0000FF;">[</span><span style="color: #000000;">face</span><span style="color: #0000FF;">]</span> |
|||
&rotations[face] |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">rf</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">sq_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">facing_corners</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cf</span><span style="color: #0000FF;">),</span> |
|||
for d=1 to dbl do |
|||
<span style="color: #7060A8;">sq_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">facing_edges</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cf</span><span style="color: #0000FF;">)}</span> |
|||
for i=1 to length(rf) do |
|||
<span style="color: #0000FF;">&</span><span style="color: #000000;">rotations</span><span style="color: #0000FF;">[</span><span style="color: #000000;">face</span><span style="color: #0000FF;">]</span> |
|||
sequence rfi = rf[i] |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">dbl</span> <span style="color: #008080;">do</span> |
|||
if cw then rfi = reverse(rfi) end if |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rf</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
integer rfi1 = cube[rfi[1]] |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">rfi</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rf</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
for j=1 to 3 do |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">cw</span> <span style="color: #008080;">then</span> <span style="color: #000000;">rfi</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">reverse</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rfi</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
cube[rfi[j]] = cube[rfi[j+1]] |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">rfi1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rfi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]]</span> |
|||
end for |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">3</span> <span style="color: #008080;">do</span> |
|||
cube[rfi[4]] = rfi1 |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rfi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rfi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]]</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end for |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rfi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rfi1</span> |
|||
return cube |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">cube</span> |
|||
function apply_moves(string cube, sequence moves) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
for i=1 to length(moves) do |
|||
cube = rotate_face(cube,moves[i]) |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">apply_moves</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> |
|||
end for |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
return cube |
|||
<span style="color: #000000;">cube</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rotate_face</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">cube</span> |
|||
constant ULFRBD = "ULFRBD" |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
function moves_to_string(sequence moves) |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">ULFRBD</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"ULFRBD"</span> |
|||
-- convert eg {1,20,11} to "UR'F2" |
|||
string res = "" |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">moves_to_string</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> |
|||
integer l = length(moves) |
|||
<span style="color: #000080;font-style:italic;">-- convert eg {1,20,11} to "UR'F2"</span> |
|||
for i=1 to l do |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> |
|||
integer face = moves[i] |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> |
|||
integer dbl = and_bits(face,Dbl)=Dbl |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span> <span style="color: #008080;">do</span> |
|||
bool anticw = floor(face/Shift) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">face</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">moves</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
face = remainder(face,Dbl) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">dbl</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">face</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">Dbl</span> |
|||
res &= ULFRBD[face] |
|||
<span style="color: #004080;">bool</span> <span style="color: #000000;">anticw</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">face</span><span style="color: #0000FF;">/</span><span style="color: #000000;">Shift</span><span style="color: #0000FF;">)</span> |
|||
if dbl then |
|||
<span style="color: #000000;">face</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">face</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Dbl</span><span style="color: #0000FF;">)</span> |
|||
res &= '2' |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">ULFRBD</span><span style="color: #0000FF;">[</span><span style="color: #000000;">face</span><span style="color: #0000FF;">]</span> |
|||
elsif anticw then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">dbl</span> <span style="color: #008080;">then</span> |
|||
res &= '\'' |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">'2'</span> |
|||
end if |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">anticw</span> <span style="color: #008080;">then</span> |
|||
end for |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;"><nowiki>'\''</nowiki></span> |
|||
res &=sprintf(" (%d move%s) ",{l,iff(l=1?"":"s")}) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
return res |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end function |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" (%d move%s) "</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">l</span><span style="color: #0000FF;">,</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">l</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">?</span><span style="color: #008000;">""</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"s"</span><span style="color: #0000FF;">)})</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span> |
|||
-- |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
-- The seen dictionary. |
|||
-- Without this, since it uses a breadth/highscore-first |
|||
<span style="color: #000080;font-style:italic;">-- |
|||
-- algorithm, after f2l (for instance) it would probably |
|||
-- The seen dictionary. |
|||
-- just do U and U' as the new high scores, forever. |
|||
-- Without this, since it uses a breadth/highscore-first |
|||
-- (The THRESHOLD constant mitigates that to some extent) |
|||
-- algorithm, after f2l (for instance) it would probably |
|||
-- |
|||
-- just do U and U' as the new high scores, forever. |
|||
integer seen = new_dict() |
|||
-- (The THRESHOLD constant mitigates that to some extent) |
|||
--</span> |
|||
function solve_stage(string cube, integer stage) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">seen</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">new_dict</span><span style="color: #0000FF;">()</span> |
|||
atom t1 = time()+1 |
|||
string moves = "", moves2 |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">solve_stage</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">)</span> |
|||
sequence workspace, w2, |
|||
<span style="color: #004080;">atom</span> <span style="color: #000000;">t1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()+</span><span style="color: #000000;">1</span> |
|||
init |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">moves</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">moves2</span> |
|||
integer wslen, high = 1, |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">workspace</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">w2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">init</span> |
|||
s, c2c = 0, o = 0 |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">wslen</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">high</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
bool done |
|||
<span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">c2c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">o</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
<span style="color: #004080;">bool</span> <span style="color: #000000;">done</span> |
|||
if stage=CROSS then |
|||
-- |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">=</span><span style="color: #000000;">CROSS</span> <span style="color: #008080;">then</span> |
|||
-- first, blank out all corners, and |
|||
<span style="color: #000080;font-style:italic;">-- |
|||
-- all edges without a white on them. |
|||
-- |
-- first, blank out all corners, and |
||
-- all edges without a white on them. |
|||
for i=1 to length(rotations) do |
|||
--</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rotations</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
for k=1 to 4 do |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">2</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (just corners)</span> |
|||
cube[rotations[i][j][k]]='-' |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">4</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rotations</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">j</span><span style="color: #0000FF;">][</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]]=</span><span style="color: #008000;">'-'</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
for i=1 to length(edges) do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
integer {?,m1,?,?,m2,?} = edges[i] |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">edges</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
if cube[m1]!='W' |
|||
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{?,</span><span style="color: #000000;">m1</span><span style="color: #0000FF;">,?,?,</span><span style="color: #000000;">m2</span><span style="color: #0000FF;">,?}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">edges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
and cube[m2]!='W' then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m1</span><span style="color: #0000FF;">]!=</span><span style="color: #008000;">'W'</span> |
|||
cube[m1] = '-' |
|||
<span style="color: #008080;">and</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m2</span><span style="color: #0000FF;">]!=</span><span style="color: #008000;">'W'</span> <span style="color: #008080;">then</span> |
|||
cube[m2] = '-' |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'-'</span> |
|||
end if |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'-'</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
wslen = 8 |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
s = score(cube,CROSS) |
|||
<span style="color: #000000;">wslen</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">8</span> |
|||
done = (s=8) |
|||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">score</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span><span style="color: #000000;">CROSS</span><span style="color: #0000FF;">)</span> |
|||
elsif stage=F2L then |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">=</span><span style="color: #000000;">8</span><span style="color: #0000FF;">)</span> |
|||
-- |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">=</span><span style="color: #000000;">F2L</span> <span style="color: #008080;">then</span> |
|||
-- first, blank out all pieces with a yellow |
|||
<span style="color: #000080;font-style:italic;">-- |
|||
-- |
|||
-- first, blank out all pieces with a yellow |
|||
for i=1 to length(corners) do |
|||
--</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">corners</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
if cube[c1]='Y' |
|||
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">corners</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
or cube[c2]='Y' |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'Y'</span> |
|||
or cube[c3]='Y' then |
|||
<span style="color: #008080;">or</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'Y'</span> |
|||
cube[c1] = '-' |
|||
<span style="color: #008080;">or</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'Y'</span> <span style="color: #008080;">then</span> |
|||
cube[c2] = '-' |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'-'</span> |
|||
cube[c3] = '-' |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'-'</span> |
|||
end if |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'-'</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
for i=1 to length(edges) do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
integer {?,m1,?,?,m2,?} = edges[i] |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">edges</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
if cube[m1]='Y' |
|||
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{?,</span><span style="color: #000000;">m1</span><span style="color: #0000FF;">,?,?,</span><span style="color: #000000;">m2</span><span style="color: #0000FF;">,?}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">edges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
and cube[m2]='Y' then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m1</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'Y'</span> |
|||
cube[m1] = '-' |
|||
<span style="color: #008080;">and</span> <span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m2</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'Y'</span> <span style="color: #008080;">then</span> |
|||
cube[m2] = '-' |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'-'</span> |
|||
end if |
|||
<span style="color: #000000;">cube</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'-'</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
wslen = 57+12 |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
s = score(cube,F2L) |
|||
<span style="color: #000000;">wslen</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">57</span><span style="color: #0000FF;">+</span><span style="color: #000000;">12</span> |
|||
done = (f2l=28) |
|||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">score</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span><span style="color: #000000;">F2L</span><span style="color: #0000FF;">)</span> |
|||
else |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">f2l</span><span style="color: #0000FF;">=</span><span style="color: #000000;">28</span><span style="color: #0000FF;">)</span> |
|||
wslen = 77+24 |
|||
<span style="color: #008080;">else</span> |
|||
s = score(cube,stage) |
|||
<span style="color: #000000;">wslen</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">77</span><span style="color: #0000FF;">+</span><span style="color: #000000;">24</span> |
|||
if f2l!=28 then ?9/0 end if |
|||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">score</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stage</span><span style="color: #0000FF;">)</span> |
|||
if stage=OLL then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">f2l</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">28</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
done = (oll_score(cube)=8) |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">=</span><span style="color: #000000;">OLL</span> <span style="color: #008080;">then</span> |
|||
else -- (stage=PLL) |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">oll_score</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">8</span><span style="color: #0000FF;">)</span> |
|||
done = (s=48) |
|||
<span style="color: #008080;">else</span> <span style="color: #000080;font-style:italic;">-- (stage=PLL)</span> |
|||
end if |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">=</span><span style="color: #000000;">48</span><span style="color: #0000FF;">)</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
if not done then |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
workspace = repeat({},wslen) |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">done</span> <span style="color: #008080;">then</span> |
|||
w2 = workspace |
|||
<span style="color: #000000;">workspace</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">({},</span><span style="color: #000000;">wslen</span><span style="color: #0000FF;">)</span> |
|||
init = cube |
|||
<span style="color: #000000;">w2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">workspace</span><span style="color: #0000FF;">)</span> |
|||
workspace[high] = {""} |
|||
<span style="color: #000000;">init</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cube</span> |
|||
destroy_dict(seen,justclear:=1) |
|||
<span style="color: #000000;">workspace</span><span style="color: #0000FF;">[</span><span style="color: #000000;">high</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">}</span> |
|||
integer move_count = 1 |
|||
<span style="color: #7060A8;">destroy_dict</span><span style="color: #0000FF;">(</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">,</span><span style="color: #000000;">justclear</span><span style="color: #0000FF;">:=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> |
|||
while 1 do |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">move_count</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> |
|||
if workspace[high]={} then |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span> |
|||
while high and workspace[high]={} do high -= 1 end while |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">workspace</span><span style="color: #0000FF;">[</span><span style="color: #000000;">high</span><span style="color: #0000FF;">]={}</span> <span style="color: #008080;">then</span> |
|||
if high=0 or (stage!=CROSS and c2c>THRESHOLD) then |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">high</span> <span style="color: #008080;">and</span> <span style="color: #000000;">workspace</span><span style="color: #0000FF;">[</span><span style="color: #000000;">high</span><span style="color: #0000FF;">]={}</span> <span style="color: #008080;">do</span> <span style="color: #000000;">high</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
move_count += 1 |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">high</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">stage</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">CROSS</span> <span style="color: #008080;">and</span> <span style="color: #000000;">c2c</span><span style="color: #0000FF;">></span><span style="color: #000000;">THRESHOLD</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
workspace = w2 |
|||
<span style="color: #000000;">move_count</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
w2 = repeat({},wslen) |
|||
<span style="color: #000000;">workspace</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">w2</span> |
|||
c2c = 0 |
|||
<span style="color: #000000;">w2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">({},</span><span style="color: #000000;">wslen</span><span style="color: #0000FF;">)</span> |
|||
high = wslen |
|||
<span style="color: #000000;">c2c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
while workspace[high]={} do high -= 1 end while |
|||
<span style="color: #000000;">high</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">wslen</span> |
|||
end if |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">workspace</span><span style="color: #0000FF;">[</span><span style="color: #000000;">high</span><span style="color: #0000FF;">]={}</span> <span style="color: #008080;">do</span> <span style="color: #000000;">high</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
moves = workspace[high][1] |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
workspace[high] = workspace[high][2..$] |
|||
<span style="color: #000000;">moves</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">workspace</span><span style="color: #0000FF;">[</span><span style="color: #000000;">high</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> |
|||
cube = apply_moves(init,moves) |
|||
<span style="color: #000000;">workspace</span><span style="color: #0000FF;">[</span><span style="color: #000000;">high</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">workspace</span><span style="color: #0000FF;">[</span><span style="color: #000000;">high</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]</span> |
|||
for face=U to D do |
|||
<span style="color: #000000;">cube</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">apply_moves</span><span style="color: #0000FF;">(</span><span style="color: #000000;">init</span><span style="color: #0000FF;">,</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> |
|||
-- (originally this loop did 180s as well, but that |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">face</span><span style="color: #0000FF;">=</span><span style="color: #000000;">U</span> <span style="color: #008080;">to</span> <span style="color: #000000;">D</span> <span style="color: #008080;">do</span> |
|||
-- gave them far too much dominance, esp during pll. |
|||
-- |
<span style="color: #000080;font-style:italic;">-- (originally this loop did 180s as well, but that |
||
-- gave them far too much dominance, esp during pll. |
|||
-- instead we now coalese those that survive a 90.)</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">Shift</span> <span style="color: #008080;">by</span> <span style="color: #000000;">Shift</span> <span style="color: #008080;">do</span> |
|||
sequence cube2 = rotate_face(cube,mi) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">mi</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">face</span><span style="color: #0000FF;">+</span><span style="color: #000000;">m</span> |
|||
if getd_index(cube2,seen)=0 then |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cube2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rotate_face</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mi</span><span style="color: #0000FF;">)</span> |
|||
putd(cube2,0,seen) |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">getd_index</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
s = score(cube2,stage) |
|||
<span style="color: #7060A8;">putd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">)</span> |
|||
if stage=CROSS then |
|||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">score</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stage</span><span style="color: #0000FF;">)</span> |
|||
done = (s=8) |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">=</span><span style="color: #000000;">CROSS</span> <span style="color: #008080;">then</span> |
|||
elsif stage=F2L then |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">=</span><span style="color: #000000;">8</span><span style="color: #0000FF;">)</span> |
|||
done = (f2l=28) |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">=</span><span style="color: #000000;">F2L</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">f2l</span><span style="color: #0000FF;">=</span><span style="color: #000000;">28</span><span style="color: #0000FF;">)</span> |
|||
if f2l=28 then |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">f2l</span><span style="color: #0000FF;">=</span><span style="color: #000000;">28</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #000000;">o</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">oll_score</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube2</span><span style="color: #0000FF;">)</span> |
|||
o = 0 |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">o</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">=</span><span style="color: #000000;">OLL</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">o</span><span style="color: #0000FF;">=</span><span style="color: #000000;">8</span><span style="color: #0000FF;">)</span> |
|||
done = (s=48) |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">=</span><span style="color: #000000;">48</span><span style="color: #0000FF;">)</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #000000;">moves2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">moves</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">moves2</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #000000;">moves2</span><span style="color: #0000FF;">[$]=</span><span style="color: #000000;">mi</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #000000;">moves2</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">face</span><span style="color: #0000FF;">+</span><span style="color: #000000;">Dbl</span> |
|||
moves2 &= mi |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">moves2</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">mi</span> |
|||
if done then |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">done</span> <span style="color: #008080;">then</span> |
|||
return moves2 |
|||
<span style="color: #7060A8;">destroy_dict</span><span style="color: #0000FF;">(</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">,</span><span style="color: #000000;">justclear</span><span style="color: #0000FF;">:=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> |
|||
end if |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">moves2</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">+</span><span style="color: #000000;">edge_score</span><span style="color: #0000FF;">*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">+</span><span style="color: #000000;">o</span> |
|||
c2c += 1 |
|||
<span style="color: #000000;">w2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">s</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">s</span><span style="color: #0000FF;">],</span><span style="color: #000000;">moves2</span><span style="color: #0000FF;">)</span> |
|||
end if |
|||
<span style="color: #000000;">c2c</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
if time()>t1 then |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
printf(1,"working... %d moves, %d positions\r",{move_count,dict_size(seen)}) |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()></span><span style="color: #000000;">t1</span> <span style="color: #008080;">and</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span> |
|||
t1 = time()+1 |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"working... %d moves, %d positions\r"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">move_count</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">dict_size</span><span style="color: #0000FF;">(</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">)})</span> |
|||
if get_key()=#1B then exit end if |
|||
<span style="color: #000000;">t1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()+</span><span style="color: #000000;">1</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">get_key</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">#1B</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end while |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
return "" -- (already solved case) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end function |
|||
<span style="color: #008080;">return</span> <span style="color: #008000;">""</span> <span style="color: #000080;font-style:italic;">-- (already solved case)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
constant stage_desc = { "make cross", |
|||
"solve first two layers", |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">stage_desc</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> <span style="color: #008000;">"make cross"</span><span style="color: #0000FF;">,</span> |
|||
"orientate last layer", |
|||
" |
<span style="color: #008000;">"solve first two layers"</span><span style="color: #0000FF;">,</span> |
||
<span style="color: #008000;">"orientate last layer"</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #008000;">"permute last layer"</span> <span style="color: #0000FF;">}</span> |
|||
procedure main() |
|||
string cube |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span> |
|||
sequence moves |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">cube</span> |
|||
integer total_moves = 0 |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">moves</span> |
|||
atom t0 = time() |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">total_moves</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
<span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span> |
|||
-- "hardest case" from http://www.cube20.org |
|||
moves = {F, Us, F2, Ds, B, U, Rs, Fs, L, Ds, |
|||
<span style="color: #000080;font-style:italic;">-- "hardest case" from http://www.cube20.org</span> |
|||
Rs, Us, L, U, Bs, D2, Rs, F, U2, D2} |
|||
<span style="color: #000000;">moves</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">F</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Us</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">F2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Ds</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">B</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">U</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Rs</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Fs</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">L</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Ds</span><span style="color: #0000FF;">,</span> |
|||
cube = apply_moves(init,moves) |
|||
<span style="color: #000000;">Rs</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Us</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">L</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">U</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Bs</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">D2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Rs</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">F</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">U2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">D2</span><span style="color: #0000FF;">}</span> |
|||
if length(moves)<=20 then |
|||
<span style="color: #000000;">cube</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">apply_moves</span><span style="color: #0000FF;">(</span><span style="color: #000000;">init</span><span style="color: #0000FF;">,</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> |
|||
printf(1,"scramble: %s\n",{moves_to_string(moves)}) |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)<=</span><span style="color: #000000;">20</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"scramble: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">moves_to_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
puts(1,substitute(cube,"-"," ")) |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"-"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">))</span> |
|||
for stage=CROSS to PLL do |
|||
moves = solve_stage(cube, stage) |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">=</span><span style="color: #000000;">CROSS</span> <span style="color: #008080;">to</span> <span style="color: #000000;">PLL</span> <span style="color: #008080;">do</span> |
|||
total_moves += length(moves) |
|||
<span style="color: #000000;">moves</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">solve_stage</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">stage</span><span style="color: #0000FF;">)</span> |
|||
cube = apply_moves(cube,moves) |
|||
<span style="color: #000000;">total_moves</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> |
|||
printf(1,"%s: %s\n",{stage_desc[stage],moves_to_string(moves)}) |
|||
<span style="color: #000000;">cube</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">apply_moves</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> |
|||
if length(moves) then |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">stage_desc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">stage</span><span style="color: #0000FF;">],</span><span style="color: #000000;">moves_to_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)})</span> |
|||
puts(1,substitute(cube,"-"," ")) |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cube</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"-"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">))</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
printf(1,"\nsolution of %d total moves found in %3.2fs\n",{total_moves,time()-t0}) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end procedure |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\nsolution of %d total moves found in %3.2fs\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">total_moves</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">})</span> |
|||
main()</lang> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span> |
|||
<!--</lang>--> |
|||
{{Out}} |
{{Out}} |
||
The "hardest case" from http://www.cube20.org with a high threshold. You can try this manually. |
The "hardest case" from http://www.cube20.org with a high threshold. You can try this manually. |
||
Line 1,771: | Line 1,774: | ||
Translation/de-golf(hrumph) of Tomas Sirgedas' winning entry from http://tomas.rokicki.com/cubecontest as held in 2004.<br> |
Translation/de-golf(hrumph) of Tomas Sirgedas' winning entry from http://tomas.rokicki.com/cubecontest as held in 2004.<br> |
||
Faster and shorter solutions (in most cases) than cfop, however probably nigh on impossible to debug/enhance... |
Faster and shorter solutions (in most cases) than cfop, however probably nigh on impossible to debug/enhance... |
||
<lang Phix>-- |
<!--<lang Phix>(phixonline)--> |
||
<span style="color: #000080;font-style:italic;">-- |
|||
-- demo\rosetta\rubik_tomas.exw |
|||
-- demo\rosetta\rubik_tomas.exw |
|||
-- |
|||
--</span> |
|||
function xor_string(string s) |
|||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span> |
|||
return xor_bits(s[1],xor_bits(s[2],iff(length(s)=3?s[3]:'!'))) |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">xor_string</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> |
|||
end function |
|||
<span style="color: #008080;">return</span> <span style="color: #7060A8;">xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #7060A8;">xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">3</span><span style="color: #0000FF;">?</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]:</span><span style="color: #008000;">'!'</span><span style="color: #0000FF;">)))</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
function xor_all(sequence s) |
|||
for i=1 to length(s) do |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">xor_all</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> |
|||
s[i] = xor_string(s[i]) |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">xor_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span> |
|||
return s |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end function |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
constant d1 = xor_all(split("UF DF UB DB UR DR UL DL FR FL BR BL UFR DBR UBL DFL DLB ULF DRF URB")) |
|||
-- This is Mike Reid's notation, 12 sides then 8 corners, which may be rotated - hence we xor the |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">d1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">xor_all</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"UF DF UB DB UR DR UL DL FR FL BR BL UFR DBR UBL DFL DLB ULF DRF URB"</span><span style="color: #0000FF;">))</span> |
|||
-- characters for fast lookup. The above string represents a cube in the solved state. |
|||
<span style="color: #000080;font-style:italic;">-- This is Mike Reid's notation, 12 sides then 8 corners, which may be rotated - hence we xor the |
|||
-- characters for fast lookup. The above string represents a cube in the solved state.</span> |
|||
constant d2 = {18,12,17,15,0, 9,1,8,16,14,19,13,2,10,3,11,12,18,13,19,4,8,5,10, |
|||
14,16,15,17,6,11,7,9,17,12,19,14,6, 0,4, 2,18,15,16,13,1,7,3, 5} |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">d2</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">18</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">17</span><span style="color: #0000FF;">,</span><span style="color: #000000;">15</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">14</span><span style="color: #0000FF;">,</span><span style="color: #000000;">19</span><span style="color: #0000FF;">,</span><span style="color: #000000;">13</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">18</span><span style="color: #0000FF;">,</span><span style="color: #000000;">13</span><span style="color: #0000FF;">,</span><span style="color: #000000;">19</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> |
|||
--?sort(d2): (0..11 appear twice, 12..19 appear thrice - edges/corners is pretty much all I can say) |
|||
<span style="color: #000000;">14</span><span style="color: #0000FF;">,</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">15</span><span style="color: #0000FF;">,</span><span style="color: #000000;">17</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #000000;">17</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">19</span><span style="color: #0000FF;">,</span><span style="color: #000000;">14</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">18</span><span style="color: #0000FF;">,</span><span style="color: #000000;">15</span><span style="color: #0000FF;">,</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">13</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">}</span> |
|||
<span style="color: #000080;font-style:italic;">--?sort(d2): (0..11 appear twice, 12..19 appear thrice - edges/corners is pretty much all I can say)</span> |
|||
constant d3 = {13,16,15,1,3, |
|||
19,18,17,4,6} |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">d3</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">13</span><span style="color: #0000FF;">,</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">15</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> |
|||
-- these apppear to be swapped during initialisation, dunno why... |
|||
<span style="color: #000000;">19</span><span style="color: #0000FF;">,</span><span style="color: #000000;">18</span><span style="color: #0000FF;">,</span><span style="color: #000000;">17</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">}</span> |
|||
<span style="color: #000080;font-style:italic;">-- these apppear to be swapped during initialisation, dunno why...</span> |
|||
integer cur_phase, search_mode, history_idx |
|||
sequence history_mov = repeat(0,48), |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">search_mode</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">history_idx</span> |
|||
history_rpt = repeat(0,48), |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">history_mov</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">),</span> |
|||
depth_to_go, |
|||
<span style="color: #000000;">history_rpt</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">),</span> |
|||
hash_table = repeat(repeat(6,6912),48) |
|||
<span style="color: #000000;">depth_to_go</span><span style="color: #0000FF;">,</span> |
|||
-- (hash_table can/should be preserved for different problems) |
|||
<span style="color: #000000;">hash_table</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6912</span><span style="color: #0000FF;">),</span><span style="color: #000000;">48</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #000080;font-style:italic;">-- (hash_table can/should be preserved for different problems)</span> |
|||
sequence cubelet_pos = repeat(0,48), |
|||
cubelet_twi = repeat(0,48) |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cubelet_pos</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">),</span> |
|||
<span style="color: #000000;">cubelet_twi</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">)</span> |
|||
procedure rot(integer cur_phase) |
|||
if cur_phase<4 then |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">rot</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">)</span> |
|||
for i=0 to 3 do |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">cur_phase</span><span style="color: #0000FF;"><</span><span style="color: #000000;">4</span> <span style="color: #008080;">then</span> |
|||
integer di = cur_phase*8+i+1, |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">3</span> <span style="color: #008080;">do</span> |
|||
j = d2[di]+1, |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">di</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">*</span><span style="color: #000000;">8</span><span style="color: #0000FF;">+</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
k = d2[di+4]+1 |
|||
<span style="color: #000000;">j</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">di</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
cubelet_twi[j] = mod(cubelet_twi[j]+2-mod(i,2),3) |
|||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">di</span><span style="color: #0000FF;">+</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span> |
|||
cubelet_twi[k] = xor_bits(cubelet_twi[k],cur_phase<2) |
|||
<span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">-</span><span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">),</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span> |
|||
end for |
|||
<span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;"><</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
for i=0 to 6 do |
|||
integer di = cur_phase*8+i+1, |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">6</span> <span style="color: #008080;">do</span> |
|||
j = d2[di+(i!=3)]+1, |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">di</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">*</span><span style="color: #000000;">8</span><span style="color: #0000FF;">+</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
k = d2[di]+1 |
|||
<span style="color: #000000;">j</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">di</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
-- swap(cubelet[j]], cubelet[k]); |
|||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">di</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span> |
|||
{cubelet_pos[j],cubelet_pos[k]} = {cubelet_pos[k],cubelet_pos[j]} |
|||
<span style="color: #000080;font-style:italic;">-- swap(cubelet[j]], cubelet[k]);</span> |
|||
{cubelet_twi[j],cubelet_twi[k]} = {cubelet_twi[k],cubelet_twi[j]} |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]}</span> |
|||
end for |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]}</span> |
|||
end procedure |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
function hashf() |
|||
int ret = 0; |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">hashf</span><span style="color: #0000FF;">()</span> |
|||
switch cur_phase do |
|||
<span style="color: #004080;">int</span> <span style="color: #000000;">ret</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">;</span> |
|||
case 0: |
|||
<span style="color: #008080;">switch</span> <span style="color: #000000;">cur_phase</span> <span style="color: #008080;">do</span> |
|||
for i=0 to 10 do |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">:</span> |
|||
ret += ret + cubelet_twi[i+1] |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">10</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #000000;">ret</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">ret</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> |
|||
return ret; |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
case 1: |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">ret</span><span style="color: #0000FF;">;</span> |
|||
for i=0 to 6 do |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">:</span> |
|||
ret = ret*3 + cubelet_twi[i+12+1] |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">6</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #000000;">ret</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ret</span><span style="color: #0000FF;">*</span><span style="color: #000000;">3</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">12</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> |
|||
for i=0 to 10 do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">10</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #000000;">ret</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">ret</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]></span><span style="color: #000000;">7</span><span style="color: #0000FF;">)</span> |
|||
return ret-7; |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
case 2: |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">ret</span><span style="color: #0000FF;">-</span><span style="color: #000000;">7</span><span style="color: #0000FF;">;</span> |
|||
sequence inva = repeat(0,48), |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">:</span> |
|||
b = repeat(0,48) |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">inva</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">),</span> |
|||
for i=0 to 7 do |
|||
<span style="color: #000000;">b</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">48</span><span style="color: #0000FF;">)</span> |
|||
integer ci12p = cubelet_pos[i+12+1], |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">7</span> <span style="color: #008080;">do</span> |
|||
ci12p3 = and_bits(ci12p,3) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">ci12p</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">12</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span> |
|||
if ci12p<16 then |
|||
<span style="color: #000000;">ci12p3</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ci12p</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span> |
|||
inva[ci12p3+1] = ret |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">ci12p</span><span style="color: #0000FF;"><</span><span style="color: #000000;">16</span> <span style="color: #008080;">then</span> |
|||
ret += 1 |
|||
<span style="color: #000000;">inva</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ci12p3</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ret</span> |
|||
else |
|||
<span style="color: #000000;">ret</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">ret</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ci12p3</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">6</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #000000;">ret</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">ret</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]></span><span style="color: #000000;">3</span><span style="color: #0000FF;">);</span> |
|||
for i=0 to 6 do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
ret += ret + (cubelet_pos[i+12+1]>15); |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">6</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #000000;">ret</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">ret</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">12</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]></span><span style="color: #000000;">15</span><span style="color: #0000FF;">);</span> |
|||
integer ib2 = xor_bits(inva[b[1]+1],inva[b[2]+1])*2, |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
ib3 = xor_bits(inva[b[1]+1],inva[b[3]+1]), |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">ib2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">inva</span><span style="color: #0000FF;">[</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #000000;">inva</span><span style="color: #0000FF;">[</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> |
|||
ib4 = xor_bits(inva[b[1]+1],inva[b[4]+1]) |
|||
<span style="color: #000000;">ib3</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">inva</span><span style="color: #0000FF;">[</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #000000;">inva</span><span style="color: #0000FF;">[</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]),</span> |
|||
return ret*54 + ib2 + (ib3 > ib4) - 3587708 |
|||
<span style="color: #000000;">ib4</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">inva</span><span style="color: #0000FF;">[</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #000000;">inva</span><span style="color: #0000FF;">[</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span> |
|||
end switch |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">ret</span><span style="color: #0000FF;">*</span><span style="color: #000000;">54</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">ib2</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">ib3</span> <span style="color: #0000FF;">></span> <span style="color: #000000;">ib4</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">3587708</span> |
|||
for i=0 to 4 do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span> |
|||
ret *= 24; |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">4</span> <span style="color: #008080;">do</span> |
|||
for cp=0 to 3 do |
|||
<span style="color: #000000;">ret</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">24</span><span style="color: #0000FF;">;</span> |
|||
for k=0 to cp-1 do |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">cp</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">3</span> <span style="color: #008080;">do</span> |
|||
if cubelet_pos[i*4+cp+1] < cubelet_pos[i*4+k+1] then |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">cp</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span> |
|||
ret += cp + iff(cp=3?cp:0) |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">*</span><span style="color: #000000;">4</span><span style="color: #0000FF;">+</span><span style="color: #000000;">cp</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;"><</span> <span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">*</span><span style="color: #000000;">4</span><span style="color: #0000FF;">+</span><span style="color: #000000;">k</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #000000;">ret</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">cp</span> <span style="color: #0000FF;">+</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cp</span><span style="color: #0000FF;">=</span><span style="color: #000000;">3</span><span style="color: #0000FF;">?</span><span style="color: #000000;">cp</span><span style="color: #0000FF;">:</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
return floor(ret/2) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end function |
|||
<span style="color: #008080;">return</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ret</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
function do_search(integer dpt) |
|||
integer h = hashf(), |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">do_search</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">dpt</span><span style="color: #0000FF;">)</span> |
|||
q = (floor(cur_phase/2)*19+8)*power(2,7), |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">hashf</span><span style="color: #0000FF;">(),</span> |
|||
hmq = mod(h,q)+1, |
|||
<span style="color: #000000;">q</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">19</span><span style="color: #0000FF;">+</span><span style="color: #000000;">8</span><span style="color: #0000FF;">)*</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">),</span> |
|||
hfq = floor(h/q)+1, |
|||
<span style="color: #000000;">hmq</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">h</span><span style="color: #0000FF;">,</span><span style="color: #000000;">q</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
d = (dpt < hash_table[cur_phase+1][hmq] or |
|||
<span style="color: #000000;">hfq</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">h</span><span style="color: #0000FF;">/</span><span style="color: #000000;">q</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
dpt < hash_table[cur_phase+4+1][hfq]) |
|||
<span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">dpt</span> <span style="color: #0000FF;"><</span> <span style="color: #000000;">hash_table</span><span style="color: #0000FF;">[</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">hmq</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">or</span> |
|||
<span style="color: #000000;">dpt</span> <span style="color: #0000FF;"><</span> <span style="color: #000000;">hash_table</span><span style="color: #0000FF;">[</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">+</span><span style="color: #000000;">4</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">hfq</span><span style="color: #0000FF;">])</span> |
|||
if d xor search_mode then |
|||
if search_mode then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">d</span> <span style="color: #008080;">xor</span> <span style="color: #000000;">search_mode</span> <span style="color: #008080;">then</span> |
|||
if dpt <= depth_to_go[h+1] then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">search_mode</span> <span style="color: #008080;">then</span> |
|||
return not h; |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">dpt</span> <span style="color: #0000FF;"><=</span> <span style="color: #000000;">depth_to_go</span><span style="color: #0000FF;">[</span><span style="color: #000000;">h</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #008080;">return</span> <span style="color: #008080;">not</span> <span style="color: #000000;">h</span><span style="color: #0000FF;">;</span> |
|||
depth_to_go[h+1] = dpt; |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">depth_to_go</span><span style="color: #0000FF;">[</span><span style="color: #000000;">h</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dpt</span><span style="color: #0000FF;">;</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
hash_table[cur_phase+1][hmq] = min(hash_table[cur_phase+1][hmq],dpt); |
|||
hash_table[cur_phase+5][hfq] = min(hash_table[cur_phase+5][hfq],dpt); |
|||
<span style="color: #000000;">hash_table</span><span style="color: #0000FF;">[</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">hmq</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hash_table</span><span style="color: #0000FF;">[</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">hmq</span><span style="color: #0000FF;">],</span><span style="color: #000000;">dpt</span><span style="color: #0000FF;">);</span> |
|||
<span style="color: #000000;">hash_table</span><span style="color: #0000FF;">[</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">+</span><span style="color: #000000;">5</span><span style="color: #0000FF;">][</span><span style="color: #000000;">hfq</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hash_table</span><span style="color: #0000FF;">[</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">+</span><span style="color: #000000;">5</span><span style="color: #0000FF;">][</span><span style="color: #000000;">hfq</span><span style="color: #0000FF;">],</span><span style="color: #000000;">dpt</span><span style="color: #0000FF;">);</span> |
|||
for k=0 to 5 do |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">5</span> <span style="color: #008080;">do</span> |
|||
rot(k) |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">3</span> <span style="color: #008080;">do</span> |
|||
if (k>=cur_phase*2 or i=1) and i<=2 then |
|||
<span style="color: #000000;">rot</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k</span><span style="color: #0000FF;">)</span> |
|||
history_idx += 1 |
|||
<span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">k</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">cur_phase</span><span style="color: #0000FF;">*</span><span style="color: #000000;">2</span> <span style="color: #008080;">or</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #000000;">i</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span> |
|||
history_mov[history_idx] = k |
|||
<span style="color: #000000;">history_idx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
<span style="color: #000000;">history_mov</span><span style="color: #0000FF;">[</span><span style="color: #000000;">history_idx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">k</span> |
|||
if do_search(dpt-search_mode*2+1) then return 1 end if |
|||
<span style="color: #000000;">history_rpt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">history_idx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span> |
|||
history_idx -= 1 |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">do_search</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dpt</span><span style="color: #0000FF;">-</span><span style="color: #000000;">search_mode</span><span style="color: #0000FF;">*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end if |
|||
<span style="color: #000000;">history_idx</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
return 0 |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end function |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">0</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
function pack_moves() |
|||
string moves = "" |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">pack_moves</span><span style="color: #0000FF;">()</span> |
|||
integer n = 0, this, last, last_rpt |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">moves</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> |
|||
if history_idx!=0 then |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">curr</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">last</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">last_rpt</span> |
|||
-- add a dummy move to trigger the last move print: |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">history_idx</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
last = xor_bits(history_mov[history_idx],1) -- F<->B, etc |
|||
<span style="color: #000080;font-style:italic;">-- add a dummy move to trigger the last move print:</span> |
|||
history_idx += 1 |
|||
<span style="color: #000000;">last</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">history_mov</span><span style="color: #0000FF;">[</span><span style="color: #000000;">history_idx</span><span style="color: #0000FF;">],</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- F<->B, etc</span> |
|||
history_mov[history_idx] = last |
|||
<span style="color: #000000;">history_idx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
history_rpt[history_idx] = 0 |
|||
<span style="color: #000000;">history_mov</span><span style="color: #0000FF;">[</span><span style="color: #000000;">history_idx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">last</span> |
|||
last = history_mov[1] |
|||
<span style="color: #000000;">history_rpt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">history_idx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
last_rpt = 0 |
|||
<span style="color: #000000;">last</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">history_mov</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> |
|||
for i=1 to history_idx do |
|||
<span style="color: #000000;">last_rpt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
this = history_mov[i] |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">history_idx</span> <span style="color: #008080;">do</span> |
|||
if this!=last then |
|||
<span style="color: #000000;">curr</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">history_mov</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
-- coalesce eg F1F2 to F' (unless you wanna fix do_search()!) |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">curr</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">last</span> <span style="color: #008080;">then</span> |
|||
if last_rpt then |
|||
<span style="color: #000080;font-style:italic;">-- coalesce eg F1F2 to F' (unless you wanna fix do_search()!)</span> |
|||
moves &= "FBRLUD"[last+1] & {"","2","'"}[last_rpt] |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">last_rpt</span> <span style="color: #008080;">then</span> |
|||
n += 1 |
|||
<span style="color: #000000;">moves</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">"FBRLUD"</span><span style="color: #0000FF;">[</span><span style="color: #000000;">last</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">&</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"2"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"'"</span><span style="color: #0000FF;">}[</span><span style="color: #000000;">last_rpt</span><span style="color: #0000FF;">]</span> |
|||
end if |
|||
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
last = this |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
last_rpt = history_rpt[i]+1 |
|||
<span style="color: #000000;">last</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">curr</span> |
|||
else |
|||
<span style="color: #000000;">last_rpt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">history_rpt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span> |
|||
last_rpt = mod(last_rpt+history_rpt[i]+1,4) |
|||
<span style="color: #008080;">else</span> |
|||
<span style="color: #000000;">last_rpt</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">last_rpt</span><span style="color: #0000FF;">+</span><span style="color: #000000;">history_rpt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
return {moves,n,iff(n=1?"":"s")} |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end function |
|||
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">moves</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">?</span><span style="color: #008000;">""</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"s"</span><span style="color: #0000FF;">)}</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
function tomas(sequence args) |
|||
search_mode = 0 |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">tomas</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">args</span><span style="color: #0000FF;">)</span> |
|||
history_idx = 0 |
|||
<span style="color: #000000;">search_mode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
depth_to_go = repeat(0,5*power(2,20)) |
|||
<span style="color: #000000;">history_idx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
<span style="color: #000000;">depth_to_go</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">*</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">20</span><span style="color: #0000FF;">))</span> |
|||
for i=0 to 19 do |
|||
cubelet_pos[i+1] = i |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">19</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span> |
|||
for i=0 to 3 do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
cur_phase = i |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">3</span> <span style="color: #008080;">do</span> |
|||
{} = do_search(0) |
|||
<span style="color: #000000;">cur_phase</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span> |
|||
end for |
|||
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">do_search</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> |
|||
args = split(args) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
for i=0 to 19 do |
|||
<span style="color: #000000;">args</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">args</span><span style="color: #0000FF;">)</span> |
|||
string s = args[i+1] -- (may be rotated, eg RU or UR) |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">19</span> <span style="color: #008080;">do</span> |
|||
integer p = find(xor_string(s),d1) |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">args</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- (may be rotated, eg RU or UR)</span> |
|||
if p=0 then ?9/0 end if -- sensible message(bad args)? |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xor_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">),</span><span style="color: #000000;">d1</span><span style="color: #0000FF;">)</span> |
|||
cubelet_pos[i+1] = p-1 |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">-- sensible message(bad args)?</span> |
|||
int x = max(find('U',s), find('D',s)); |
|||
<span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> |
|||
cubelet_twi[i+1] = iff(x!=0 ? x-1 : s[1]>'F') |
|||
<span style="color: #004080;">int</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'U'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">),</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'D'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">));</span> |
|||
end for |
|||
<span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #0000FF;">?</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #0000FF;">:</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]></span><span style="color: #008000;">'F'</span><span style="color: #0000FF;">)</span> |
|||
for i=0 to 4 do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
integer j = d3[i+1]+1, |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">4</span> <span style="color: #008080;">do</span> |
|||
k = d3[i+6]+1 |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">j</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d3</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
-- swap(cubelet[j], cubelet[k]); |
|||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d3</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">6</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span> |
|||
{cubelet_pos[j],cubelet_pos[k]} = {cubelet_pos[k],cubelet_pos[j]} |
|||
<span style="color: #000080;font-style:italic;">-- swap(cubelet[j], cubelet[k]); </span> |
|||
{cubelet_twi[j],cubelet_twi[k]} = {cubelet_twi[k],cubelet_twi[j]} |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cubelet_pos</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]}</span> |
|||
end for |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cubelet_twi</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]}</span> |
|||
search_mode = 1; |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
for cp=0 to 3 do |
|||
<span style="color: #000000;">search_mode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">;</span> |
|||
cur_phase = cp |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">cp</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">3</span> <span style="color: #008080;">do</span> |
|||
for i=0 to 19 do |
|||
<span style="color: #000000;">cur_phase</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cp</span> |
|||
if do_search(i) then exit end if |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">19</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">do_search</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
return pack_moves() |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end function |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">pack_moves</span><span style="color: #0000FF;">()</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
printf(1,"%s (%d move%s)\n",tomas("UL DL RF UB FD BR DB UF DR UR BL FL FDR BLU DLB URB RUF FLD BRD FUL"))</lang> |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s (%d move%s)\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tomas</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"UL DL RF UB FD BR DB UF DR UR BL FL FDR BLU DLB URB RUF FLD BRD FUL"</span><span style="color: #0000FF;">))</span> |
|||
<!--</lang>--> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |