<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Josh Mermelstein</title>
    <description>Please enjoy my musings</description>
    <link>http://www.joshmermelstein.com</link>
    <atom:link href="http://www.joshmermelstein.com/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Axles puzzle</title>
        <description>&lt;p&gt;This is a post about &lt;a href=&quot;https://joshmermelstein.com/axles&quot;&gt;axles&lt;/a&gt;, a game I put
together with help from Gemini. This post might make more sense if you go play a
round before you read it.&lt;/p&gt;

&lt;h1 id=&quot;background&quot;&gt;Background&lt;/h1&gt;

&lt;p&gt;In 2024, I saw a post on the twisty puzzles forum about the &lt;a href=&quot;https://twistypuzzles.com/forum/viewtopic.php?t=39375&quot;&gt;Peterhoff-Smolensk
puzzle&lt;/a&gt;. I thought it was
a really nice idea, and filed it on my mental “I should think more about this”
list.&lt;/p&gt;

&lt;h1 id=&quot;simulator-in-rust&quot;&gt;Simulator in Rust&lt;/h1&gt;

&lt;p&gt;I didn’t know what specifically I wanted to do, just that I wanted to do
&lt;em&gt;something&lt;/em&gt;. My two main ideas were to make 3d printed version of it, and to
make some kind of interactive digital version of it. I decided to start with
something in between - an analysis tool to help me figure out what sort of
puzzles I wanted to make.&lt;/p&gt;

&lt;p&gt;As an experiment, I asked Gemini to write the first version of this simulator in
Rust (but on a square grid instead of a hex grid). The results were better than
I expected! With minimal edits, I was able to input a hardcoded goal
configuration, and then run the code to answer questions like “what start is
furthest from the goal state?”&lt;/p&gt;

&lt;p&gt;I modified the code to try random 3x3 starting configuration and print cases
where the furthest node was especially far away. The results were impressive,
the AI generated code found cases like this one, where these two states were 36
moves apart.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Goal:
|↑ ^&amp;gt;&amp;lt;|  |↑ &amp;gt;v|  |↑ |
|↑ ^&amp;gt;v|  |↑ v|  |↑ ^&amp;gt;|
|↑ &amp;gt;&amp;lt;|  |↑ &amp;gt;|  |↑ ^|

Start:
|↑ ^&amp;gt;&amp;lt;|  |↑ &amp;gt;v|  |→ |
|← ^&amp;gt;&amp;lt;|  |↑ v|  |↑ ^&amp;gt;|
|→ ^v|  |↑ &amp;gt;|  |↑ ^|
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;interactive-simulator&quot;&gt;Interactive Simulator&lt;/h1&gt;

&lt;p&gt;I cut out some scraps of paper to try to play with this puzzle, but found it a
little annoying to keep everything aligned, so I turned to Gemini again, and
asked if it could make the code interactive.&lt;/p&gt;

&lt;p&gt;I was expecting some sort of stdin/stdout interface, where I could give moves to
the rust code one at a time. To my surprise, Gemini rewrote the simulator in
javascript, and opened an interactive gui where I should interact with the js
that it wrote. Parts of it were a little clunky, but it crystallized my goals in
my head. I wanted to polish this javascript version to make it easy for others
to play with these puzzles.&lt;/p&gt;

&lt;h2 id=&quot;gui-stuff&quot;&gt;GUI stuff&lt;/h2&gt;

&lt;p&gt;Polishing the gui wasn’t that hard. The AI had done a lot of the bits that I’m
inexperienced with (css, event handling…), and I just had to edit them to work
the way I wanted. Where possible, I did this using more AI prompting; though
there were a few cases where the AI did quite a bad job and I ended up reverting
its changes and making them manually.&lt;/p&gt;

&lt;p&gt;It got fixated on drawing the dots on each cell using css pseudo-elements, and
I’m not sure that approach is viable at all.&lt;/p&gt;

&lt;h2 id=&quot;puzzle-generation&quot;&gt;Puzzle generation&lt;/h2&gt;

&lt;p&gt;When generating the goal state, it’s undesirable if there’s a loop of blockages,
such that A blocks B blocks C blocks D blocks A. When this happens, none of
those axles can turn, which means that much of the puzzle isn’t intractable.&lt;/p&gt;

&lt;p&gt;To prevent this problem, I came up with the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;assign each axle a random and unique id between 1 and num_axles
(treat out-of-bounds as having some arbitrary id, like num_axles/4)

for every position where it&apos;s possible to place a dot:
    if a lower id would block a higher id - do nothing
    if a higher id would block a lower id, add a dot with X% probability.
    if any axle has all four blockers, that&apos;s boring, remove one blocker.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I’m quite pleased with this approach. It is computationally cheap, and scales
linearly with the number of axles; and it’s easy to convince myself that this
never generates those undesirable loops of blockers.&lt;/p&gt;

&lt;h2 id=&quot;additional-modes&quot;&gt;Additional modes&lt;/h2&gt;

&lt;p&gt;Once I had that working, I decided to add some additional modes. By tweaking the
probability with which blockers are generated, I could make an “easy” mode with
sparser boards. And then I added support for diagonal blockers, and called that
“Hard” mode.&lt;/p&gt;

&lt;h1 id=&quot;closing-thoughts&quot;&gt;Closing thoughts&lt;/h1&gt;

&lt;p&gt;My favorite part of this project is the speed and output of puzzle generation.
The quality of puzzles is good enough that I don’t feel the need to add
human-authored ones.&lt;/p&gt;

&lt;p&gt;I’m also quite happy with the usability. I watched a few friends trying it out,
and they seemed to find the GUI intuitive, in a way that let them engage with
the puzzle’s rules.&lt;/p&gt;

&lt;p&gt;This was my first time using AI in this way and I found the experience
fascinating. It was quite good at some things, but also got hopeless stuck on
others. I think the best part was the speed with which it got me &lt;em&gt;something&lt;/em&gt; I
could interact with. That helped me refine my goal, and saved me a few hours.&lt;/p&gt;

&lt;h1 id=&quot;future-work&quot;&gt;Future work&lt;/h1&gt;

&lt;p&gt;The author of Peterhoff-Smolensk recently published a 3D version of their idea,
which they call the &lt;a href=&quot;https://twistypuzzles.com/forum/viewtopic.php?t=40211&quot;&gt;Bomzh
Cube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think this idea is fascinating as well, and that it would be neat to have a
digital simulator for it. I would need to learn quite a lot (or lean even harder
into AI-assisted programming).&lt;/p&gt;
</description>
        <pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/axles-puzzle/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/axles-puzzle/</guid>
      </item>
    
      <item>
        <title>Bandaged Cube Diameter</title>
        <description>&lt;h1 id=&quot;background&quot;&gt;Background&lt;/h1&gt;

&lt;p&gt;Readers of my blog may recall a tool I released in 2020 called &lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer-post/&quot;&gt;bandaged cube
explorer&lt;/a&gt;. It used
javascript to visualize the state space of bandaged 3x3x3 puzzles.&lt;/p&gt;

&lt;p&gt;I recently got an email from someone who had used it to look at
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x2000402849B5E&quot;&gt;0x2000402849B5E&lt;/a&gt;.
They pointed out that this graph has some vertices that are extremely far away
from the starting configuration, and said “I wonder if there are bandaged
puzzles with configurations that take even more moves to reach.”&lt;/p&gt;

&lt;p&gt;I found this question fascinating and spent some time generating and analyzing
data. I’d like to share some of my findings with you here.&lt;/p&gt;

&lt;h2 id=&quot;why-this-is-interesting&quot;&gt;Why this is interesting&lt;/h2&gt;

&lt;p&gt;In my 2020 blog post, I wrote “When I first tried to get into bandaged puzzles,
I found a few docs online containing collections of named configurations […]
What they both lacked was guidance on what kind of experience to expect when
solving each puzzle”. To this day, I still don’t have a satisfying way to
predict solving experience from bandaged signature.&lt;/p&gt;

&lt;p&gt;Looking at the max distance between vertices has the potential to help with
this. I suspect that puzzle where this metric is large contain long, highly
constrained paths through the shape space, and will be a different solving
experience from puzzles where this metric is small. To be clear, this is not
about the difficulty of the solve, it’s about the experience of the solve, and
the kinds of tools a solver will need to develop.&lt;/p&gt;

&lt;p&gt;Also, I think no one has computed these numbers before, and that appeals to me
as well.&lt;/p&gt;

&lt;h2 id=&quot;definitions&quot;&gt;Definitions&lt;/h2&gt;

&lt;p&gt;There are two common ways to measure how far apart two configurations are. In
&lt;strong&gt;QTM&lt;/strong&gt; (quarter turn metric), every quarter turn counts as one move. In &lt;strong&gt;HTM&lt;/strong&gt;
(half turn metric), a double turn of a single face only counts as one move.
There are a few other interesting distance metrics but we will ignore those for
this blog post.&lt;/p&gt;

&lt;p&gt;In graph theory, we have a few terms to explain how far apart things are. A
vertex’s &lt;strong&gt;eccentricity&lt;/strong&gt; is the maximum distance from it to any other vertex.
The vertex with the smallest eccentricity is called the &lt;strong&gt;center&lt;/strong&gt; and its
eccentricity is called the &lt;strong&gt;radius&lt;/strong&gt;. Note that a graph may have more than one
center. The largest eccentricity in a graph is called the &lt;strong&gt;diameter&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;techniques&quot;&gt;Techniques&lt;/h2&gt;

&lt;p&gt;Bandaged cube graphs are pretty tame by graph theory standards. All edges are
bidirectional and have equal weight. This means we can do a breadth first search
from each vertex in a graph and easily filter for the minimum and maximum
eccentricities. As a bonus, we’ll get a representative example for each of
those.&lt;/p&gt;

&lt;p&gt;One useful optimization I found was to observe that bandaged configurations that
only differ by orientation/mirroring must have the same eccentricity. Checking
whether two cubes are the same modulo orientation is computationally cheap
compared to breadth first search on most graphs so this improved runtime
dramatically.&lt;/p&gt;

&lt;p&gt;I applied this procedure to all 3559 bandaged configurations listed
&lt;a href=&quot;https://github.com/paulnasca/paul_cube_bandaged_graph/blob/master/all_cubes.csv&quot;&gt;here&lt;/a&gt;
and containing &amp;gt;1 vertex. Both the source code and the raw data are available on
&lt;a href=&quot;https://github.com/JoshMermel/bandaged-cube-explorer/blob/main/diameter_analysis/&quot;&gt;my
github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With all that out of the way, I’d like to share a few bandaged 3x3x3
configurations that are special in some way.&lt;/p&gt;

&lt;h1 id=&quot;cubes-with-very-large-diameter-and-radius&quot;&gt;Cubes with very large diameter and radius&lt;/h1&gt;

&lt;h2 id=&quot;largest&quot;&gt;Largest&lt;/h2&gt;

&lt;p&gt;0x1003FE80000423 has by far the largest diameter, in both QTM and HTM.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/0x1003fe80000423_overview.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note that the ‘x’ over the white center means that this face is never allowed to
turn. In QTM, 0x2003FD00041830 and 0x1003F680104444 are a whopping 167 moves
apart (note that these two are mirror images of one another). This cube also has
the largest diameter in HTM, 127.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/0x1003fe80000423_worst.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I was quite surprised to see how small the graph for this configuration is. It
has just 3780 vertices. Some configurations have over 20x as many vertices and
yet have dramatically smaller diameters! (note: it’s still large enough to lag
bandaged-cube-explorer. In this blog post, I’ll only deeplink to graphs that are
small enough to render nicely on mobile).&lt;/p&gt;

&lt;p&gt;At first, I found the bandaged white center on this cube a little unsatisfying,
because my usual tools for playing with bandaged 3x3x3 puzzles (a cubetwist
bandaged kit or the &lt;a href=&quot;https://play.google.com/store/apps/details?id=org.distorted.magic&quot;&gt;Magic Cube
app&lt;/a&gt;) both
can’t handle that. Then I checked the diameter of this configuration with the
white center unlocked and found that it does not change!&lt;/p&gt;

&lt;h2 id=&quot;second-largest&quot;&gt;Second largest&lt;/h2&gt;

&lt;p&gt;The configuration with the second largest diameter in both QTM and HTM is
0x83fe04000c21.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/0x83fe04000c21_overview.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This configuration has a QTM diameter of 120 (example 0x83BE04021182 to
0x188c30c4204441) and an HTM diameter of 96.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/0x83fe04000c21_worst.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This configuration also has a surprisingly small graph. It has a mere 2704
vertices.&lt;/p&gt;

&lt;h2 id=&quot;top-10-qtm&quot;&gt;Top 10 (QTM)&lt;/h2&gt;

&lt;p&gt;After this, QTM and HTM disagree about which configurations are largest. Here
are the remainder of the top 10 in QTM:&lt;/p&gt;

&lt;ol start=&quot;3&quot;&gt;
  &lt;li&gt;0x10000080800C63 (QTM: 117, HTM: 73)&lt;/li&gt;
  &lt;li&gt;0x21109308C00C46 (QTM: 115, HTM: 90)&lt;/li&gt;
  &lt;li&gt;0x108430C40007A3 (QTM: 113, HTM: 92)&lt;/li&gt;
  &lt;li&gt;0x1003DA80000423 (QTM: 110, HTM: 90)&lt;/li&gt;
  &lt;li&gt;0x1084308620063D (QTM: 107, HTM: 79)&lt;/li&gt;
  &lt;li&gt;0x10039E80000403 (QTM: 101, HTM: 83)&lt;/li&gt;
  &lt;li&gt;0x1084308420063D (QTM: 101, HTM: 75)&lt;/li&gt;
  &lt;li&gt;0x21000102000C43 (QTM: 100, HTM: 59)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/top_10_diameter_qtm.svg&quot; style=&quot;max-height: 1600px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;top-10-htm&quot;&gt;Top 10 (HTM)&lt;/h2&gt;

&lt;p&gt;And here is the rest of the top 10 in HTM:&lt;/p&gt;

&lt;ol start=&quot;3&quot;&gt;
  &lt;li&gt;0x108430C40007A3 (#5 above)&lt;/li&gt;
  &lt;li&gt;0x21109308C00C46 (#4 above)&lt;/li&gt;
  &lt;li&gt;0x1003DA80000423 (#6 above)&lt;/li&gt;
  &lt;li&gt;0x10039E80000403 (#8 above)&lt;/li&gt;
  &lt;li&gt;0x1084308620063D (#7 above)&lt;/li&gt;
  &lt;li&gt;0x72920080007F (QTM: 95, HTM: 77)&lt;/li&gt;
  &lt;li&gt;0x1084308420063D (#9 above)&lt;/li&gt;
  &lt;li&gt;0x139200800C1C (QTM: 94, HTM: 75)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/top_10_diameter_htm.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The vertex counts of all these graphs are lower than I expected. The largest one
is 0x1003DA80000423 with 7586 but most are well below 5000. To get a better
sense of the data, I made this scatter plot of diameter (QTM) vs vertex count.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/diameter_vs_vertices.svg&quot; style=&quot;max-height: 600px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For more information on these configurations, such as examples of pairs of
vertices that are the maximum distance apart, see the &lt;a href=&quot;https://github.com/JoshMermel/bandaged-cube-explorer/blob/main/diameter_analysis/analysis.csv&quot;&gt;raw
data&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;comparing-qtm-diameter-to-htm-diameter&quot;&gt;Comparing QTM diameter to HTM diameter&lt;/h1&gt;

&lt;p&gt;Another thing I found surprising, was the different between QTM diameter and HTM
diameter in configurations like 0x21000102000C43 (100 vs 59). Here’s a
scatterplot of the raw data on these two measures:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/diameter_htm_vs_qtm.svg&quot; style=&quot;max-height: 600px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;high-qtmhtm&quot;&gt;High QTM/HTM&lt;/h2&gt;

&lt;p&gt;QTM diameter can never be larger than 2x the HTM diameter since each half turn
can be replaced by two quarter turns. Over 50 configurations achieve the maximum
of HTMx2 = QTM. The two that stand out to me are
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x8000802E3401&quot;&gt;0x8000802E3401&lt;/a&gt;
and
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x8000842FB421&quot;&gt;0x8000842FB421&lt;/a&gt;.
Both have 110 vertices and a QTM diameter of 12. I suspect they’re actually the
same puzzle in disguise as two different configurations.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/max_qtm_over_htm.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;low-qtmhtm&quot;&gt;Low QTM/HTM&lt;/h2&gt;

&lt;p&gt;QTM diameter can never be lower than HTM diameter. Almost 70 configurations have
an equal QTM diameter and HTM diameter. This means that half turns are not
useful when traveling between antipodes.&lt;/p&gt;

&lt;p&gt;The largest of these by diameter (17) is a tie between
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x30138380002D&quot;&gt;0x30138380002D&lt;/a&gt;
and
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x80018620002D&quot;&gt;0x80018620002D&lt;/a&gt;.
The largest of these by vertex count are
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x180200021&quot;&gt;0x180200021&lt;/a&gt;
(402, and a diameter of 15) and then
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x10000000000002&quot;&gt;0x10000000000002&lt;/a&gt;,
(240, and a diameter of 5).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/min_qtm_over_htm.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A few other configurations that stood out to me are:
0x10000084018421 (2540 vertices, QTM diameter 18, HTM diameter 17)
0x108401843DCC21 (1130 vertices, QTM diameter 64, HTM diameter 56)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/low_qtm_over_htm.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;diameterradius&quot;&gt;Diameter/Radius&lt;/h1&gt;

&lt;p&gt;In a normal circle, the diameter is definitionally 2x the radius. In undirected
graphs like ours, the diameter is capped at 2x the radius but can be smaller
than that. Here’s a scatterplot of the overall relationship between the two:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/radius_vs_diameter.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;equal-diameter-and-radius&quot;&gt;Equal diameter and radius&lt;/h2&gt;

&lt;p&gt;There are ~70 puzzles where diameter and radius equal in QTM. By radius, the
three largest ones are
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x30000010048883&quot;&gt;0x30000010048883&lt;/a&gt;,
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x20108000000C03&quot;&gt;0x20108000000C03&lt;/a&gt;,
and
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x30000000040203&quot;&gt;0x30000000040203&lt;/a&gt;.
All three have a QTM radius and diameter of 15. Amazingly, all three of these
are familiar to me. The first one is the subject of a &lt;a href=&quot;https://joshmermelstein.com/solving-cofortress/&quot;&gt;previous blog post of
mine&lt;/a&gt;. The other two are both
mentioned at the end of that blog post as potentially related configurations!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/equal_radius_diameter.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;nearly-equal-diameter-and-radius&quot;&gt;Nearly equal diameter and radius&lt;/h2&gt;

&lt;p&gt;If we expand our search to puzzles where the diameter is only slightly larger
than the radius then we can find some other puzzles whose graph forms one big
loop.&lt;/p&gt;

&lt;p&gt;One that jumped out at me was
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x80408B40DC7A1&quot;&gt;0x80408B40DC7A1&lt;/a&gt;
(diameter 47 QTM, radius 38 QTM). This puzzle turns out to be the &lt;a href=&quot;https://twistypuzzles.com/forum/viewtopic.php?t=35731&quot;&gt;Maze-300
cube&lt;/a&gt; by André Kutepow
(Isaev). It is the bandaged 3x3x3 with the largest known god’s number (301 QTM).&lt;/p&gt;

&lt;p&gt;A few others that seem potentially interesting are
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x1108100440843&quot;&gt;0x1108100440843&lt;/a&gt;
(diameter 48 QTM, radius 39 QTM) which has a beautiful spread out graph with
lots of loops. Also 0x10843086218C21 (diameter 53 QTM, radius 42 QTM) and
0x139E0090002D (diameter 62 QTM, radius 46 QTM).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/nearly_equal_radius_diameter.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;is-vertex-count-a-good-predictor-of-diameter&quot;&gt;Is vertex count a good predictor of diameter?&lt;/h1&gt;

&lt;p&gt;Nope!&lt;/p&gt;

&lt;p&gt;There are many examples of graphs with relatively low vertex count but large
diameter, e.g. 0x21000100008C43 (726 vertices, QTM diameter of 95) and
0x100C00808005AD (482 vertices, 73 QTM diameter).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/low_vertex_high_diameter.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There are also plenty of examples of graphs with a high vertex count but
relatively low diameter, such as 0x8000000804 (a.k.a “3 stripes”) (1296
vertices, QTM diameter of 8), and 0x20008000000806 (7344 vertices, QTM diameter
of 14).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/high_vertex_low_diameter.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;looking-at-diameter--vertex-count&quot;&gt;Looking at diameter / vertex count&lt;/h1&gt;

&lt;p&gt;I was hoping that this ratio might help me find some interesting puzzles but the
results were disappointing. Configurations where this metric was high, such as
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x30080200000603&quot;&gt;0x30080200000603&lt;/a&gt;
and
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x824810800C23&quot;&gt;0x824810800C23&lt;/a&gt;
tended to have extremely constrainted graphs, (click through to see them). Their
graphs have almost no branching and I suspect these puzzles can barely scramble.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/diameter_over_vertex.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Puzzles were this metric was small were ones with the largest vertex counts,
and didn’t have particularly interesting diameters.&lt;/p&gt;

&lt;h1 id=&quot;closing-thoughts&quot;&gt;Closing thoughts&lt;/h1&gt;

&lt;p&gt;The maze 300 cube has a QTM diameter of only 48, many of the puzzles discussed
in the blog post have a dramatically larger diameter. I wonder if one of these
will be able to take the record for the configuration with the largest known
god’s number.&lt;/p&gt;

&lt;p&gt;If you find such a configuration, or you find another intersting feature in the
data, please send me an email and let me know!&lt;/p&gt;

&lt;h1 id=&quot;more-thoughts---cube-orientation&quot;&gt;More thoughts - cube orientation&lt;/h1&gt;

&lt;p&gt;(This update was published on Jan 14, 2023.)&lt;/p&gt;

&lt;p&gt;A user on the twisty puzzles forum &lt;a href=&quot;https://twistypuzzles.com/forum/viewtopic.php?p=420978#p420978&quot;&gt;raised an interesting
point&lt;/a&gt;. The way
my code computes graphs’ properties assumes that the orientation of the puzzle
is fixed. This does not map nicely to how people visualize and solve puzzles. If
two states differ only by oreintation, then a solver can use the same approach
to both by just rotating the cube.&lt;/p&gt;

&lt;p&gt;I re-ran my analysis but modified to consider two configurations the same if
they only differ by orientation (or mirroring). I’ll start by looking at the
results in isolation, and then do some comparison between these results and my
previous results where cube orientation was considered.&lt;/p&gt;

&lt;p&gt;When we ignore orientation, a few graphs shrink down to a single vertex and a
diameter of 0. In case where dividing by 0 would be inconvenient, I’ll be
ignoring these configurations instead.&lt;/p&gt;

&lt;p&gt;If you’d like to play with the raw data, I made it &lt;a href=&quot;https://github.com/JoshMermel/bandaged-cube-explorer/blob/main/diameter_analysis/analysis_ignoring_orientation.csv&quot;&gt;available on my
github&lt;/a&gt;. Putting all of it in one .csv felt unwieldly so I split this data into its own file. If you’d like to merge them, the rows are in the same order in both.&lt;/p&gt;

&lt;h2 id=&quot;largest-vertex-count&quot;&gt;Largest vertex count&lt;/h2&gt;

&lt;p&gt;This has nothing to do with graph diameters but I’ve never seen these results
posted before so I might as well mention them here. These are the four
configurations with the largest vertex counts if we ignore orientation.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;0x10840080800423 (21490 vertices) [3rd most vertices when considering orientation]&lt;/li&gt;
  &lt;li&gt;0x10041080200421 (18551 vertices) [7th most vertices when considering orientation]&lt;/li&gt;
  &lt;li&gt;0x3DA00000C08 (16894 vertices) [10th most vertices when considering orientation]&lt;/li&gt;
  &lt;li&gt;0x39E00000420 (15134 vertices) [13th most vertices when considering orientation]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/high_vertex_count_ignore_orientation.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;largest-diameter-ignoring-cube-orientation&quot;&gt;Largest Diameter (ignoring cube orientation)&lt;/h2&gt;

&lt;p&gt;Unsurprisingly, many of the puzzles with a large diameter are familiar to us
from earlier in this post. The puzzles with the largest diameter in QTM are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;0x108430C40007A3 (113 QTM, 92 HTM) [5th largest QTM diameter with orientation considered]&lt;/li&gt;
  &lt;li&gt;0x1003FE80000423 (103 QTM, 76 HTM) [1st largest QTM diameter with orientation considered]&lt;/li&gt;
  &lt;li&gt;0x1003DA80000423 (99 QTM, 89 HTM) [6th largest QTM diameter with orientation considered]&lt;/li&gt;
  &lt;li&gt;0x500180800C3D (91 QTM, 72 HTM)&lt;/li&gt;
  &lt;li&gt;0x210B9100000863 (91 QTM, 71 HTM)&lt;/li&gt;
  &lt;li&gt;0x10039A800005AD (86 QTM, 69 HTM)&lt;/li&gt;
  &lt;li&gt;0x73920080007F (86 QTM, 68 HTM)&lt;/li&gt;
  &lt;li&gt;0x1084308620063D (84 QTM, 64 HTM) [7th largest QTM diameter with orientation considered]&lt;/li&gt;
  &lt;li&gt;0x18C400C7A00401 (84 QTM, 66 HTM)&lt;/li&gt;
  &lt;li&gt;0x3DA00000C60 (83 QTM, 66 HTM)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/top_10_diameter_ignore_orientation.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Several puzzles on this list (#1, #4, #5, #6, #7, #9) have no self-symmetries,
so their graphs are the same whether or not we consider orientation. The
remaining puzzles all had 2x as many vertices before we stopped considering
orientation.&lt;/p&gt;

&lt;p&gt;0x10039A800005AD (#6) appeals to me for some reason. It’s graph is slightly too
large to link but the shape is pretty fun; one very big loop and then a complex
appendage coming off of it. It has quite a few “normal” edges which makes me
think the solve will have some fun subproblems.&lt;/p&gt;

&lt;p&gt;0x73920080007F (#7), has by far the smallest vertex count (518) of these
puzzles. Its
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x73920080007F&quot;&gt;graph&lt;/a&gt;
seems to contain no non-trivial loops. I suspect that when this puzzle is solved
by shape, it is also solved by color.&lt;/p&gt;

&lt;p&gt;Interestingly, the top 10 by HTM are the same but in a slightly different order.&lt;/p&gt;

&lt;h2 id=&quot;qtm-vs-htm-diameter-ignoring-cube-orientation&quot;&gt;QTM vs HTM diameter (ignoring cube orientation)&lt;/h2&gt;

&lt;h3 id=&quot;high-qtmhtm-diameter&quot;&gt;High QTM/HTM diameter&lt;/h3&gt;

&lt;p&gt;Again, several configurations achieve a the upper bound where QTM diameter is
double HTM diameter. Most of these have a small diameter or seem otherwise
boring. A few configurations get close and seem more interesting to me. Two that
stand out are
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x1084008C238C63&amp;amp;ignore_orientation=true&quot;&gt;0x1084008C238C63&lt;/a&gt;
(19 QTM, 10 HTM) and
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x10818086200C23&amp;amp;ignore_orientation=true&quot;&gt;0x10818086200C23&lt;/a&gt;
(39 QTM, 21 HTM). The former looks a lot like the cube with the largest vertex
count but with a few bandaged centers.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/high_qtm_over_htm_ignore_orientation.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;low-qtmhtm-diameter&quot;&gt;Low QTM/HTM diameter&lt;/h3&gt;

&lt;p&gt;Many configurations achieve the lower bound where QTM and HTM diameters are
equal.
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x80018620002D&amp;amp;highlight=rotations&quot;&gt;0x80018620002D&lt;/a&gt; (discussed above)
does not have any self symmetries so it is still the largest of these by
diameter (17). It is also the largest by vertex count (66).&lt;/p&gt;

&lt;h2 id=&quot;diameterradius-ignoring-cube-orientation&quot;&gt;Diameter/Radius (ignoring cube orientation)&lt;/h2&gt;

&lt;h3 id=&quot;low-diameterradius&quot;&gt;Low Diameter/Radius&lt;/h3&gt;

&lt;p&gt;There are 37 configurations where QTM radius is the same as QTM diameter. The
largest of these by diameter is
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x10F4018C7C0C63&amp;amp;ignore_orientation=true&quot;&gt;0x10F4018C7C0C63&lt;/a&gt;
(QTM diameter = 5), which seems like it can barely scramble. Another one that
jumps out at me is
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x30000080200C11&amp;amp;ignore_orientation=true&quot;&gt;0x30000080200C11&lt;/a&gt;
(39 QTM diameter, 30 QTM radius). Among the puzzles where QTM radius is close to
QTM diameter, it has an unusually high diameter.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/nearly_equal_radius_diameter_ignore_orientation.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;comparing-graphs-with-and-without-considering-orientation&quot;&gt;Comparing graphs with and without considering orientation&lt;/h1&gt;

&lt;h2 id=&quot;change-in-vertex-count&quot;&gt;Change in vertex count&lt;/h2&gt;

&lt;p&gt;When we stop considering orientation, the graphs for most configurations get
smaller. The factor they shrink by roughly represents how many rotated/mirrored
copies of each state we expect to find in the graph.&lt;/p&gt;

&lt;p&gt;This quotient has an lower bound of 1 - if a cube has no self-similar states
then its graph will have the same number of vertices whether or not we consider
orientation. The upper bound is 48, since the cube has 24 orientations and each
of those has a mirror image.&lt;/p&gt;

&lt;h3 id=&quot;large-change&quot;&gt;Large change&lt;/h3&gt;

&lt;p&gt;Exactly one puzzle has 48x as many vertices when orientation is considered -
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x28A00000414&amp;amp;ignore_orientation=true&quot;&gt;0x28A00000414&lt;/a&gt;.
When considering orientation it can reach 2544 configurations, and when ignoring
orientation it can only reach 53 configurations.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/0x28A00000414.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Achieving this bound is quite impressive. It means that for any reachable
configuration of this puzzle, all 48 orientations/mirrors are reachable and
distinct from one another.&lt;/p&gt;

&lt;p&gt;A few other puzzle get quite close to a 48x reduction. The largest of these by
diameter is
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x20088000000C06&amp;amp;ignore_orientation=true&quot;&gt;0x20088000000C06&lt;/a&gt;
(27 QTM when considering orientation, 16 QTM when ignoring it). The largest of
these by vertex count is
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x28000000C14&amp;amp;ignore_orientation=true&quot;&gt;0x28000000C14&lt;/a&gt;
(7344 when considering orientation, 157 when ignoring it). This cube is also
notable for having the largest vertex count if we limit outself to cubes with 0
modified center pieces (9528 when considering orientation, 206 when ignoring
it).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/large_vertex_change.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;no-change&quot;&gt;No change&lt;/h3&gt;

&lt;p&gt;Nearly 1000 puzzles have the same number of vertices whether or not orientation
is considered.&lt;/p&gt;

&lt;p&gt;The largest by diameter are 0x108430C40007A3 (seen above), then 0x500180800C3D
(seen above). The largest by vertex count are 0x10840084018423 (12647) and
0x100400B4200631 (11589).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/high_vertex_low_symmetry.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;large-graphs-despite-large-changes&quot;&gt;Large graphs despite large changes&lt;/h3&gt;

&lt;p&gt;Some configurations still have comparatively large graphs, even after losing a
big portion of their vertices when we ignored orientation.&lt;/p&gt;

&lt;p&gt;0x1003DE80000403 (now 18th largest) lost 3/4th of its vertices. 0x3FE0010002D
(now 60th largest), lost ~7/8th of its vertices.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/large_diameter_despite_shrinking.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;change-in-diameter&quot;&gt;Change in diameter&lt;/h2&gt;

&lt;h3 id=&quot;large-change-1&quot;&gt;Large change&lt;/h3&gt;

&lt;p&gt;Most of the graphs with large percentage drops in diameter end up with ~2
vertices and don’t seem too interesting to me. A few that do seem interesting
are
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x10525A02800C06&amp;amp;ignore_orientation=true&quot;&gt;0x10525A02800C06&lt;/a&gt;
(14 QTM -&amp;gt; 4 QTM) and
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x300000B40D85A3&amp;amp;ignore_orientation=true&quot;&gt;0x300000B40D85A3&lt;/a&gt;
(14 QTM -&amp;gt; 2 QTM), Both drop from 5 HTM to 1 HTM. Another notable drop is from
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x53A40280007F&amp;amp;ignore_orientation=true&quot;&gt;0x53A40280007F&lt;/a&gt;
(84 QTM -&amp;gt; 34 QTM).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/large_diameter_change.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;small-change&quot;&gt;Small change&lt;/h3&gt;

&lt;p&gt;There are some interesting examples of graphs whose vertex count drops
significantly but whose diameter does not change.&lt;/p&gt;

&lt;p&gt;A few standouts are
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x10840000000C03&amp;amp;ignore_orientation=true&quot;&gt;0x10840000000C03&lt;/a&gt;
(904-&amp;gt;127 vertices, 23 diameter QTM), 0x3F6000005AD (2304-&amp;gt;576 vertices, 49 HTM
diameter).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/small_diameter_change.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;bonus---other-stuff-that-seemed-interesting&quot;&gt;Bonus - other stuff that seemed interesting&lt;/h1&gt;

&lt;h2 id=&quot;banning-normal-corners&quot;&gt;Banning “normal” corners&lt;/h2&gt;

&lt;p&gt;If we limit ourselves to puzzles where every corner is bandaged to an edge, we
still have 81 puzzles to look at. If we care about orientation,
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x39e00100414&quot;&gt;0x39e00100414&lt;/a&gt;
has the largest diamter (36 QTM) and
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x2da00000c14&quot;&gt;0x2da00000c14&lt;/a&gt;
has the largest vertex count (384). If we stop caring about orientation then
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x21088300000883&amp;amp;ignore_orientation=true&quot;&gt;0x21088300000883&lt;/a&gt;
has the largest diameter (30 QTM) and the largest vertex count (257).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/no_normal_corners.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;banning-normal-edges&quot;&gt;Banning “normal” edges&lt;/h2&gt;

&lt;p&gt;If we limit ourselves to puzzles where every edge is bandaged to another piece,
we still have 132 puzzles to look at. Of these,
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x21081308440862&quot;&gt;0x21081308440862&lt;/a&gt;
has the largest diameter (28 QTM) whether or not we care about orientation.
0x3fe0000041c has the largest vertex count (1092) when considering orientations
and
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x1003fe8000043d&amp;amp;ignore_orientation=true&quot;&gt;0x1003fe8000043d&lt;/a&gt;
has the largest vertex count (321) when ignoring orientations.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/no_normal_edges.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;banning-normal-corners-and-edges&quot;&gt;Banning “normal” corners and edges&lt;/h2&gt;

&lt;p&gt;If we restrict ourselves to puzzles with no “normal” corners and no “normal”
edges, there are still 12 distinct puzzles to look at. These puzzles are all
extremely constrainted but some seem like they can still meaningfully scramble.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x3FE00000C1C&quot;&gt;0x3FE00000C1C&lt;/a&gt;
has the largest vertex count (156) if we care consider orientation.
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x21189308C00C46&amp;amp;ignore_orientation=true&quot;&gt;0x21189308C00C46&lt;/a&gt;
has the largest vertex count (25) if we do not consider about orientation. It
also has the largest diameter whether or not we care about orientation.
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x83FE04000631&amp;amp;highlight=rotations&quot;&gt;0x83FE04000631&lt;/a&gt;
is in third place for vertex count whether or not we care about orientation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/no_normal_corners_edges.svg&quot; style=&quot;max-height: 800px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;banning-abnormal-centers&quot;&gt;Banning “abnormal” centers&lt;/h2&gt;

&lt;p&gt;If we restrict ourselves to puzzles where all centers are “normal” meaning no
bandaging to the core or to edges, we have 26 puzzles to look at.&lt;/p&gt;

&lt;p&gt;0x20088000000C06 (seen above) has the largest diameter (27 QTM) of these puzzles
if we care about orientation. This was was noted above for have losing a large
fraction of vertices when we start caring about orientation.
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x20088000000C03&amp;amp;ignore_orientation=true&quot;&gt;0x20088000000C03&lt;/a&gt;
has the largest diamter (20 QTM) if we do not care about orientation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/no_abnormal_centers.svg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;fun-graph-shapes&quot;&gt;Fun graph shapes&lt;/h2&gt;

&lt;p&gt;Here are a bunch of puzzles where the shape of their graph seemed interesting to
me:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x210B0118C00C5A&quot;&gt;0x210B0118C00C5A&lt;/a&gt;
has two identical looking subgraphs connected by a forced chain. I wonder if the
solve will require navigating the chain frequently - or even at all.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x1084018C7C0C30&quot;&gt;0x1084018C7C0C30&lt;/a&gt;
is imilar to the above but with a much longer chain connecting the segments.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x1080018FFC0C21&quot;&gt;0x1080018FFC0C21&lt;/a&gt;
has a very unusual graph. It has a few big loops that are
all connected to each other, plus so not-too-useful looking long dead ends.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x104000B5BDB5AD&quot;&gt;0x104000B5BDB5AD&lt;/a&gt;
has very small graph with only a few nontrivial loops. It seems like it can
scramble pretty well though and would make for a challenging and highly
constrained solve.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x30018080002D&quot;&gt;0x30018080002D&lt;/a&gt;
has an intersting graph shape. It is sparse but hard to untangle.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-diameter/bonus.svg&quot; style=&quot;max-height: 1200px&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;closing-thoughts-again&quot;&gt;Closing thoughts (again)&lt;/h1&gt;

&lt;p&gt;I’d like to re-emphasize that diameter is not a good way to predict difficulty.
I’m currently fighting with
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0xC00B40D85A0&quot;&gt;0xC00B40D85A0&lt;/a&gt;
which a QTM diameter of 3 and am finding it pretty difficult. That said, I think
it’s difficulty is quite different from the high-diameter puzzles discussed in
those post.&lt;/p&gt;

&lt;p&gt;I’m probably done looking at the diameter data for now, but I’m certainly not
done analyzing bandaged cubes. One idea I had was a web tool to help find paths
between different configurations. Another idea I’m considering is building a
tool that finds non-trivial loops in a puzzle’s state space; for the purpose of
finding useful algorithms. If I do either of these I’ll be sure to write a blog
post too.&lt;/p&gt;
</description>
        <pubDate>Tue, 20 Dec 2022 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/bandaged-cube-diameter/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/bandaged-cube-diameter/</guid>
      </item>
    
      <item>
        <title>Mix and Match Gear Cubes</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/mix-and-match-gear-cubes/solved.jpg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;background&quot;&gt;Background&lt;/h1&gt;

&lt;h1 id=&quot;oskars-gear-cube&quot;&gt;Oskar’s gear cube&lt;/h1&gt;

&lt;p&gt;There’s a variation on the standard 3x3x3 Rubik’s puzzle called the &lt;a href=&quot;https://en.wikipedia.org/wiki/Gear_Cube&quot;&gt;Gear
Cube&lt;/a&gt;. It has the same centers,
corners, and edges as a regular Rubik’s cube, but it turns differently. When you
make a 180 degree turn on a face, the slice layer below it turns by 90
degrees. You cannot make 90 degree turns on faces because then the middle slice
would be turned 45 degrees and would block subsequent moves.&lt;/p&gt;

&lt;p&gt;Surprisingly, this puzzle is much easier than a Rubik’s cube. The gears
dramatically reduce the number of positions that the puzzle can reach. For
example, all edge on the equator of the cube are permanently stuck on the
equator of the cube. According to &lt;a href=&quot;https://www.jaapsch.net/puzzles/gearcube.htm&quot;&gt;Jaap’s puzzle
page&lt;/a&gt;, the gear cube can reach
only 41,472 different states.&lt;/p&gt;

&lt;h1 id=&quot;variations-on-oksars-gear-cube&quot;&gt;Variations on Oksar’s Gear Cube&lt;/h1&gt;

&lt;p&gt;Oskar van Deventer designed several variations on the Gear Cube which increase
the challenge. One was mass produced under the name &lt;a href=&quot;https://youtu.be/0tm-FNfpIQY&quot;&gt;Gear Cube
Extreme&lt;/a&gt;. This puzzle replaces four of the geared
edges with conventional Rubik’s cube edges, arranged along one of the middle
slices of the cube. When you turn a face, its behavior depends on on the middle
slice next to it. If that middle slice is composed of gear edges then the turn
is like a Gear Cube. If that middle slice is composed of traditional Rubik’s
Cube edges than the turn is like a Rubik’s Cube. The non-geared edges can never
leave their middle layer so the solver never has to react to which turns are
geared turns vs normal turns.&lt;/p&gt;

&lt;p&gt;Another variation that Oskar designed was &lt;a href=&quot;https://www.youtube.com/watch?v=79p9vfqsquE&quot;&gt;Even Less
Gears&lt;/a&gt;. This puzzle replaced 8
geared edges with conventional edges. Like the Gear Cube Extreme, if there are
&lt;em&gt;any&lt;/em&gt; gears in the middle layer, turns will engage those gears. Unlike the Gear
Cube Extreme, the gears can move around relative to one another. This means the
solver’s strategy needs to account for the positions of the gears when executing
sequences.&lt;/p&gt;

&lt;h1 id=&quot;puzzle-modding&quot;&gt;Puzzle Modding&lt;/h1&gt;

&lt;p&gt;I saw a &lt;a href=&quot;https://www.reddit.com/kkkkk5/&quot;&gt;reddit post&lt;/a&gt; where someone had modded a
different style of Gear Cube so it worked like a Gear Cube Extreme. It seemed
relatively straightforward so I decided to copy them, but make an Even Less
Gears instead.&lt;/p&gt;

&lt;p&gt;I used a dremel with a sanding band to remove most of the material, then hand
sanded it to get a smoother finish. My initial attempt didn’t remove quite
enough material which resulted in bumpy turning but I did a second round of
sanding and was able to get the turning to be extremely smooth.&lt;/p&gt;

&lt;h2 id=&quot;more-modding&quot;&gt;More modding&lt;/h2&gt;

&lt;p&gt;Playing with my modified puzzle got me wondering if there are other gear cube
variations that can be made from a mix of geared and un-geared edges. I realized
that if I made a copy of the gear cube extreme, I could mix and match edges
between the two puzzles to make all Gear/Rubik’s cube hybrids. But what hybrids
exist?&lt;/p&gt;

&lt;h1 id=&quot;the-hybrids&quot;&gt;The Hybrids&lt;/h1&gt;

&lt;p&gt;As is often the case, I’m not the first one with this idea. Andreas Nortmann
&lt;a href=&quot;https://twistypuzzles.com/forum/viewtopic.php?p=239636#p239636&quot;&gt;enumatered seven
variations&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;“There are no more than 7 different variants. These are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;[] The cube without gears.&lt;/li&gt;
  &lt;li&gt;[FR] The cube with a single gear.&lt;/li&gt;
  &lt;li&gt;[FL BR]&lt;/li&gt;
  &lt;li&gt;[FL FR BR]&lt;/li&gt;
  &lt;li&gt;[FL FR BR BL] “Even less Gears”&lt;/li&gt;
  &lt;li&gt;[UL UF UR UB DL DF DR DB] Gear Cube Extreme aka Anisotropic Cube&lt;/li&gt;
  &lt;li&gt;[UL UF UR UB FL FR BR BL DL DF DR DB] Gear Cube (I don’t dare to say ‘normal’)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All other variants are identical in behaviour to one of these.”&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twistypuzzles.com/forum/viewtopic.php?t=28325&quot;&gt;Another user&lt;/a&gt; on the
forums actually built all of these.&lt;/p&gt;

&lt;h1 id=&quot;extreme-vs-ultimate&quot;&gt;Extreme vs Ultimate&lt;/h1&gt;

&lt;p&gt;Oskar’s original Gear Cube Extreme had some unstickered parts. Some people chose
to add stickers to those parts and named the results the “Gear Cube Ultimate”.
These stickers represent the orientation of a Rubik’s cube edge piece,
independent of the orientation of the gear, and add an additional challenge.&lt;/p&gt;

&lt;p&gt;The puzzle I’m modifying does not have these parts but I think I can partially
simulate them. For example, I believe I can replace one geared edge on the Gear
Cube Extreme, which will act like the Ultimate stickers without affecting the
behavior of the puzzle. I need to think more about whether the other hybrids can
be modified in the same way.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mix-and-match-gear-cubes/scrambled.jpg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 03 Nov 2022 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/mix-and-match-gear-cubes/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/mix-and-match-gear-cubes/</guid>
      </item>
    
      <item>
        <title>Bermuda Cubes</title>
        <description>&lt;h1 id=&quot;background&quot;&gt;Background&lt;/h1&gt;

&lt;p&gt;I’ve recently been playing with a series of puzzles called the Bermuda cubes.
They look and behave a like a Rubik’s cube but some centers have been replaced
by triangles and others have been rotated 45 degrees. Mechanically, these
new centers don’t add anything new. The pieces around them can be interchanged
with regular corners and edges. From a solving perspective, these centers add a
few challenges.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bermuda/header_photo.jpg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The unusually shaped pieces and centers make it harder for me to visualize
setups.&lt;/li&gt;
  &lt;li&gt;The notation for algorithms is cumbersome which makes it harder for me to
memorize them.&lt;/li&gt;
  &lt;li&gt;The triangle centers block other faces depending on their position so it’s
harder to come up with broadly reusable algorithms.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One nice feature of this collection of puzzles is that they have a suggested
order. Each one is named after a planet and they (mostly) get harder as the
planets get further from the sun.&lt;/p&gt;

&lt;p&gt;Now that I’ve completed the series, I wanted to write a blog post to reflect on
the solving experiences and to record my solving notes for others (and maybe for
my future self).&lt;/p&gt;

&lt;h1 id=&quot;first-approach&quot;&gt;First Approach&lt;/h1&gt;

&lt;p&gt;A pretty standard technique for designing a solution is to solve one kind of
piece at a time. The idea is that you can solve the solve the first piece type
with ignoring the rest of the puzzle. Then you can solve the second piece type
while only paying attention to the first piece type and ignoring the rest, etc.
This sort of solution doesn’t require very many algorithms but does require you
to be good at visualizing setups so you can get the most out of your sequences.&lt;/p&gt;

&lt;p&gt;For this whole series, it felt most natural to me to solve centers then edges,
then corners. Moving centers after anything else is solved seemed like a pain so
I knew I wanted to do those first. Isolating edges without slice turns seemed
like it would be painful so I chose to do those before corners.&lt;/p&gt;

&lt;p&gt;With a bit of planning, I was able to adapt well known 3x3x3 commutators to the
first few puzzles in the Bermuda cubes series. The trick was identifying which
center positions were workable and then finding ways to set up to those
positions. But when I started working on Mars, I found it a lot harder to adapt
ideas I already knew from 3x3x3 Rubik’s cubes. That puzzle has three triangle
centers, two of which are opposite each other. That means the middle one is
always blocking at least one of the other triangles and that made it much
trickier to access certain pieces of the puzzle.&lt;/p&gt;

&lt;p&gt;I decided to search for sequences that depended on as few faces as possible,
that way the state of the puzzle would matter as little as possible when
executing them. In particular, I looked for algorithms that only depended on
neighboring triangle and square faces.&lt;/p&gt;

&lt;p&gt;My big breakthrough centered on the fact that RUR’U’ repeated 3 times has no
effect on edges and is a 2,2 swap of corners. I could execute that with a square
face on top and a triangle face on the right in the correct orientation. From
there, I could turn this into a useful algorithm by swapping some of the pieces
of the U face with the unmodified corner/edge/corner on the hypotenuse of the R
face. There were a few nice ways to do that interchange and all of the ones I
tried resulted in useful 3-cycles!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bermuda/34_algos.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;left: [(R U R’ U’)3, R^-1.5 U’ R^1.5]&lt;/li&gt;
  &lt;li&gt;middle: [(R U R’ U’)3, R^-1.5 U R^1.5]&lt;/li&gt;
  &lt;li&gt;right: [(R U R’ U’)3, R^-1.5 U2 R^1.5]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These cubes are tilted a bit to show the outcomes better. These should be
executed with the orange face on U and the white face on R, starting with the
white triangle orientated as shown.&lt;/p&gt;

&lt;p&gt;I really like this trio of algorithms. The similarity made them easy to
remember. The fact that the cube is in its normal shape most of the time meant I
could use edges as clues if I ever lost my place in the middle. On top of that,
they were able to easily move corners in and out of the tricky-to-reach spots on
the hypotenuse of the triangular face.&lt;/p&gt;

&lt;p&gt;For corner orientation, I also wanted to find a sequence that would work with
only two turnable faces. Starting with a square face on U and a triangle face on
R (orientated the same as my permutation algorithms), I realized I could execute
a &lt;a href=&quot;https://www.speedsolving.com/wiki/index.php/Sune&quot;&gt;Sune&lt;/a&gt;. After a bit of
fiddling, I found that three Sunes in a row had no effect on edges and
swapped the corners of the square face with their diagonals. One pair’s
orientation was unchanged while the other pair was twisted. That meant I could
do a U2 and another triple-Sune to swap the corners back to their original
positions but end up with one diagonal pair orientated differently.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bermuda/34_corner_orientation_algos.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;left: effect after 3 Sunes&lt;/li&gt;
  &lt;li&gt;right: effect after [(R U R’ U R U2 R’)3 , U2]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You might notice that I only wrote about algorithms for corners, not ones for
edges. That’s because I found the edges pretty intuitive. All these algorithms
I’m writing about in this post are for using at the end of a solve when pieces
are mostly where they need to be. Before that, I try to use intuition and
blockbuilding as much as possible.&lt;/p&gt;

&lt;h1 id=&quot;oops-all-triangles&quot;&gt;Oops All Triangles&lt;/h1&gt;

&lt;p&gt;At this point, I thought I’d cracked the whole series and all the was left was
coming up with nice setup sequences. Then I started scrambling Saturn and
realized my mistake. Even though that puzzle has two square-centered faces,
neither of them is able to turn. Hilariously, the edge in between them is
mechanically functional, it’s just impossible to unblock either face and
actually move it. This meant all my nice ideas about triangle/square algorithms
were not applicable.&lt;/p&gt;

&lt;p&gt;I was pretty happy with my centers, edges, corners solve order and I liked the
flexibility that I got from an algorithm that only needed two turnable faces; so
I decided to try to find some new algorithms to use for adjacent triangular
faces.&lt;/p&gt;

&lt;p&gt;I came up with some kinda ugly ideas but I wasn’t looking forward to executing
those long algorithms on an actual puzzle. Eventually I decided to give up and
write a program to find some shorter sequences.&lt;/p&gt;

&lt;h1 id=&quot;writing-a-solver&quot;&gt;Writing a solver&lt;/h1&gt;

&lt;p&gt;In order to model the state of the puzzle, I needed to know orientation of each
center. I used an enum where I named each state after the edge of the triangle
that was shared with the other face:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;enum Orientation : int {
  HYPOT = 0,
  LEFT_LEG = 1,
  RIGHT_LEG = 2,
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;From there, I modeled each state of the puzzle as a vector of edge locations and
a vector of corner locations. This meant each move could be implemented as a
permutation of those vectors.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;struct Node {
  Node(const std::vector&amp;lt;int&amp;gt;&amp;amp; corners,
      const std::vector&amp;lt;int&amp;gt;&amp;amp; edges,
      const Orientation&amp;amp; left_center,
      const Orientation&amp;amp; right_center,
      const std::string&amp;amp; path) :
    corners_(corners),
    edges_(edges),
    left_center_(left_center),
    right_center_(right_center),
    path_(path) {}

  std::vector&amp;lt;int&amp;gt; corners_;
  std::vector&amp;lt;int&amp;gt; edges_;
  Orientation right_center_;
  Orientation left_center_;
  std::string path_;
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;One unintuitive detail is that the corners vector had one entry per sticker, not
one entry per piece. That’s because I wanted to track the orientation of the
corners. This wasn’t needed for edges since edges can’t change orientation with
just two axes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bermuda/two_triangles_labels.jpg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;An example of a transformation function is as follows:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Node LhsClockwise(Node in) {
  if (in.left_center_ == Orientation::HYPOT) {
    PermuteVec(in.corners_, {
        {0,9,3,12,6},
        {1,10,4,13,7},
        {2,11,5,14,8},
      });
    in.left_center_ = Orientation::RIGHT_LEG;
  } else if (in.left_center_ == Orientation::LEFT_LEG) {
    PermuteVec(in.corners_, {
        {0,9,3,12,6},
        {1,10,4,13,7},
        {2,11,5,14,8},
      });
    in.left_center_ = Orientation::HYPOT;
  } else if (in.left_center_ == Orientation::RIGHT_LEG) {
    PermuteVec(in.corners_, {
        {0,12,9,6,3},
        {1,13,10,7,4},
        {2,14,11,8,5},
      });
    in.left_center_ = Orientation::LEFT_LEG;
  }
  PermuteVec(in.edges_, 0);
  in.path_ += &quot;L&quot;;

  return in;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You might notice that I always add “L” to the path even though the number of
degrees being turned isn’t always the same. To simplify notation, for
triangle+triangle algorithms, I used L to mean “rotate the left triangle
clockwise until the right is unblocked” and the same for “R” mutatis mutandis.&lt;/p&gt;

&lt;p&gt;Finally, I wrote some code to breadth first search the graph, and print nodes
which only modified a small number of corners. This approach worked well. By
looking for states with 6 modified corner stickers, I could find pure
orientation algorithms. By looking for states with 9 modified stickers, I could
find permutation algorithms. I’ve included a table of about 400 algorithms that
the solver found at the bottom of this post.&lt;/p&gt;

&lt;h3 id=&quot;aside-c-and-hashing-vectors&quot;&gt;Aside: C++ and hashing vectors&lt;/h3&gt;

&lt;p&gt;One thing that was moderately annoying when I was writing my bfs was that I
wanted to make a set of my Node struct so I could tell whether a node had been
visited or not. Because it contains a vector, C++ didn’t know how to hash it so
I had to write my own custom hash function. I found that a little annoying.&lt;/p&gt;

&lt;h1 id=&quot;second-approach-to-writing-a-solver&quot;&gt;Second approach to writing a solver&lt;/h1&gt;

&lt;p&gt;The results from my first solver were decent but still felt awkward to me. The
2-axes approach generated algorithms that were highly reusable but were kinda
long. I started to wonder if I could generate shorter ones by allowing the use
of a third axis.&lt;/p&gt;

&lt;p&gt;This meant I needed to make a few changes to how I was modeling states. First of
all, I need to start modeling edges in a way that lets me see their orientation.
This isn’t too bad - we can use the same trick as we did with corners and use
one int for each sticker. Next, we need to model center orientation in a way
that lets us see which faces are blocked. After some thought, I came up with a
solution to this that felt really elegant.&lt;/p&gt;

&lt;p&gt;We can treat each face like a regular pentagon (i.e. from a megaminx) but with
some specific edges bandaged to those centers.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bermuda/three_triangles_labels.jpg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I updated my code to BFS using three triangular faces and this new model but the
results were extremely disappointing. All the algorithms it found used just two
out of three available faces! If I didn’t make any mistakes in my
implementation, this means that adding a third triangular face doesn’t help at
all.&lt;/p&gt;

&lt;h1 id=&quot;closing-thoughts&quot;&gt;Closing thoughts&lt;/h1&gt;

&lt;p&gt;If you enjoyed this and want to pick up some Bermuda cubes, you probably don’t
need to get the whole set. Some, like Jupiter and Uranus feel pretty much the
same with my method. I think my favorites were Mars and Neptune. Maybe start
with Venus if you’re looking for something easier and maybe end with one of
Jupiter/Saturn if you’re looking for something harder.&lt;/p&gt;

&lt;p&gt;Numbering the pieces and figuring out the permutation that went with each turn
was kinda tedious. I wonder if there’s a way to automate that. Also, I think
there’s room for a nice library that takes the permutations of each move as
input and has utilities for things like BFS written in a general way. There’s
certainly some low hanging fruit when it comes to optimizing my current solver -
it would be great to do that optimization on a shared library once and then
benefit from it on future projects.&lt;/p&gt;

&lt;p&gt;I think it would be fun to apply this same technique to mixes of 0 and 1 faces
on the circle 3x3x3s. I think there would be lots of fun arrangements to analyze
and I bet some really short algorithms would show up.&lt;/p&gt;

&lt;p&gt;I know there is a series of Bermuda megaminxes that were also mass produced but
are hard to find and expensive these days. Maybe I’ll solve a few of those in a
simulator next time I’m looking for the Bermuda puzzle kind of experience.&lt;/p&gt;

&lt;h1 id=&quot;appendix&quot;&gt;Appendix&lt;/h1&gt;

&lt;h3 id=&quot;triangle-triangle-permutation-algorithms&quot;&gt;triangle-triangle Permutation algorithms:&lt;/h3&gt;

&lt;p&gt;(see data model above for starting position and label meanings)&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Effect&lt;/th&gt;
      &lt;th&gt;Alg&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,21,16)(10,22,17)(11,23,15)&lt;/td&gt;
      &lt;td&gt;LRLRL’RL’R’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,18,23)(10,19,21)(11,20,22)&lt;/td&gt;
      &lt;td&gt;LRLR’LR’L’R’L’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,14,18)(7,12,19)(8,13,20)&lt;/td&gt;
      &lt;td&gt;LR’LRLRL’RL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,11,20)(7,9,18)(8,10,19)&lt;/td&gt;
      &lt;td&gt;LR’LR’L’R’L’RL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,19,14)(10,20,12)(11,18,13)&lt;/td&gt;
      &lt;td&gt;L’RL’RLRLR’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,18,14)(7,19,12)(8,20,13)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’R’LR’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,19,17)(10,20,15)(11,18,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’RLRLR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,16,21)(10,17,22)(11,15,23)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LR’LRLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,14,19)(10,12,20)(11,13,18)&lt;/td&gt;
      &lt;td&gt;RLRL’RL’R’L’R’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,17,19)(10,15,20)(11,16,18)&lt;/td&gt;
      &lt;td&gt;RL’RL’R’L’R’LR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,23,18)(10,21,19)(11,22,20)&lt;/td&gt;
      &lt;td&gt;R’LR’LRLRL’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,20,11)(7,18,9)(8,19,10)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’LRLRL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,23)(1,19,21)(2,20,22)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’RL’R’L’R’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,18,21)(13,19,22)(14,20,23)&lt;/td&gt;
      &lt;td&gt;LRLR’LRLRL’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,19)(4,8,20)(5,6,18)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LRLRL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,21)(4,19,22)(5,20,23)&lt;/td&gt;
      &lt;td&gt;LRL’R’L’RL’RLRLR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,21,18)(13,22,19)(14,23,20)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LR’L’R’L’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,7)(4,20,8)(5,18,6)&lt;/td&gt;
      &lt;td&gt;LR’LR’LR’L’R’L’RL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,18)(1,21,19)(2,22,20)&lt;/td&gt;
      &lt;td&gt;LR’L’RLRLR’LR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,18)(4,22,19)(5,23,20)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’R’L’R’LR’LRLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,19)(1,17,20)(2,15,18)&lt;/td&gt;
      &lt;td&gt;L’RLR’LRLRL’RL’R’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,17,19)(4,15,20)(5,16,18)&lt;/td&gt;
      &lt;td&gt;L’RLR’L’R’L’RL’RLRLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,14)(1,19,12)(2,20,13)&lt;/td&gt;
      &lt;td&gt;L’RL’RL’RLRLR’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,16,19)(7,17,20)(8,15,18)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RL’RLRLR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,16)(1,20,17)(2,18,15)&lt;/td&gt;
      &lt;td&gt;L’R’LRLR’LR’L’R’L’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,18)(1,12,19)(2,13,20)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RL’R’L’R’LR’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,19,16)(7,20,17)(8,18,15)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’R’L’R’LR’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,17)(4,20,15)(5,18,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’L’R’LR’LRLRL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,14)(4,10,12)(5,11,13)&lt;/td&gt;
      &lt;td&gt;RLRLRLR’LR’L’R’L’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,12,22)(10,13,23)(11,14,21)&lt;/td&gt;
      &lt;td&gt;RLRL’RLRLR’LR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,9)(1,17,10)(2,15,11)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’RLRLR’LR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,14)(1,9,12)(2,10,13)&lt;/td&gt;
      &lt;td&gt;RLR’L’R’LR’LRLRL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,22,12)(10,23,13)(11,21,14)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’RL’R’L’R’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,16)(1,10,17)(2,11,15)&lt;/td&gt;
      &lt;td&gt;RL’RL’RL’R’L’R’LR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,9)(4,12,10)(5,13,11)&lt;/td&gt;
      &lt;td&gt;RL’R’LRLRL’RL’R’L’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,11)(1,12,9)(2,13,10)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’L’R’L’RL’RLRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,10)(4,8,11)(5,6,9)&lt;/td&gt;
      &lt;td&gt;R’LRL’RLRLR’LR’L’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,9)(1,8,10)(2,6,11)&lt;/td&gt;
      &lt;td&gt;R’LRL’R’L’R’LR’LRLRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,21)(4,10,22)(5,11,23)&lt;/td&gt;
      &lt;td&gt;R’LR’LR’LRLRL’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,9,15)(7,10,16)(8,11,17)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LR’LRLRL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,7)(4,11,8)(5,9,6)&lt;/td&gt;
      &lt;td&gt;R’L’RLRL’RL’R’L’R’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,9)(4,22,10)(5,23,11)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LR’L’R’L’RL’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,15,9)(7,16,10)(8,17,11)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’L’R’L’RL’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,7)(1,10,8)(2,11,6)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’R’L’RL’RLRLR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,21,16)(1,22,17)(2,23,15)&lt;/td&gt;
      &lt;td&gt;LRLRLRLR’LR’LR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,21,12)(1,22,13)(2,23,14)&lt;/td&gt;
      &lt;td&gt;LRLR’LRLR’L’RL’R’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,12)(4,23,13)(5,21,14)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’RLR’L’R’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,9)(4,23,10)(5,21,11)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’RL’R’LR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,19)(4,11,20)(5,9,18)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’R’LR’L’R’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,12)(4,8,13)(5,6,14)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LR’LR’L’R’L’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,18)(4,10,19)(5,11,20)&lt;/td&gt;
      &lt;td&gt;LR’LRLRL’R’L’RL’R’L’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,12)(1,19,13)(2,20,14)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LRL’RL’R’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,7)(1,19,8)(2,20,6)&lt;/td&gt;
      &lt;td&gt;LR’LR’LR’LRLRLRLR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,9)(1,21,10)(2,22,11)&lt;/td&gt;
      &lt;td&gt;LR’L’RLRLRLRL’RL’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,9)(1,16,10)(2,17,11)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LRL’RLR’L’R’LRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,18)(1,9,19)(2,10,20)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LR’L’RL’RLRL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,6)(1,16,7)(2,17,8)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LR’L’R’L’RLRL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,19)(1,10,20)(2,11,18)&lt;/td&gt;
      &lt;td&gt;L’RLR’LRLR’LRL’R’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,17,9)(4,15,10)(5,16,11)&lt;/td&gt;
      &lt;td&gt;L’RLR’L’R’L’R’L’R’LR’LR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,14)(4,20,12)(5,18,13)&lt;/td&gt;
      &lt;td&gt;L’RL’RL’RL’R’L’R’L’R’L’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,6)(4,20,7)(5,18,8)&lt;/td&gt;
      &lt;td&gt;L’RL’R’LRLR’L’RL’R’LRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,6)(1,12,7)(2,13,8)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RL’RL’RLRLRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,16,6)(4,17,7)(5,15,8)&lt;/td&gt;
      &lt;td&gt;L’R’L’RLR’LRL’R’L’RLR’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,16,21)(4,17,22)(5,15,23)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’L’R’L’RL’RL’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,7)(4,13,8)(5,14,6)&lt;/td&gt;
      &lt;td&gt;RLRLRLRL’RL’RL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,22)(4,13,23)(5,14,21)&lt;/td&gt;
      &lt;td&gt;RLRL’RLRL’R’LR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,21)(1,13,22)(2,14,23)&lt;/td&gt;
      &lt;td&gt;RLR’LRLR’LRL’R’L’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,18)(1,13,19)(2,14,20)&lt;/td&gt;
      &lt;td&gt;RLR’LRLR’LR’L’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,9)(1,20,10)(2,18,11)&lt;/td&gt;
      &lt;td&gt;RLR’LRLR’L’RL’R’L’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,21)(1,17,22)(2,15,23)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’RL’RL’R’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,11)(1,19,9)(2,20,10)&lt;/td&gt;
      &lt;td&gt;RL’RLRLR’L’R’LR’L’R’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,22)(4,10,23)(5,11,21)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’RLR’LR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,17)(4,10,15)(5,11,16)&lt;/td&gt;
      &lt;td&gt;RL’RL’RL’RLRLRLRL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,19)(4,12,20)(5,13,18)&lt;/td&gt;
      &lt;td&gt;RL’R’LRLRLRLR’LR’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,19)(4,7,20)(5,8,18)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RLR’LRL’R’L’RLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,9)(4,19,10)(5,20,11)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RL’R’LR’LRLR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,16)(4,7,17)(5,8,15)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RL’R’L’R’LRLR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,10)(4,20,11)(5,18,9)&lt;/td&gt;
      &lt;td&gt;R’LRL’RLRL’RLR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,18)(1,8,19)(2,6,20)&lt;/td&gt;
      &lt;td&gt;R’LRL’R’L’R’L’R’L’RL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,23)(1,10,21)(2,11,22)&lt;/td&gt;
      &lt;td&gt;R’LR’LR’LR’L’R’L’R’L’R’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,15)(1,10,16)(2,11,17)&lt;/td&gt;
      &lt;td&gt;R’LR’L’RLRL’R’LR’L’RLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,16)(4,22,17)(5,23,15)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LR’LR’LRLRLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,6,15)(1,7,16)(2,8,17)&lt;/td&gt;
      &lt;td&gt;R’L’R’LRL’RLR’L’R’LRL’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,6,14)(1,7,12)(2,8,13)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’R’L’R’LR’LR’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,17)(4,22,15)(5,23,16)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’L’R’LR’LRLRLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,20,10)(4,18,11)(5,19,9)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LRLR’LRL’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,17,21)(4,15,22)(5,16,23)&lt;/td&gt;
      &lt;td&gt;LRL’R’L’R’L’RL’RLRLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,20)(1,9,18)(2,10,19)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’RLR’LRLR’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,20)(4,11,18)(5,9,19)&lt;/td&gt;
      &lt;td&gt;L’RLR’LR’L’RL’R’L’RL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,16)(1,21,17)(2,22,15)&lt;/td&gt;
      &lt;td&gt;L’R’LRLRLR’LR’L’R’L’RLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,11)(1,18,9)(2,19,10)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RL’R’L’RL’R’LR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,23)(1,17,21)(2,15,22)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LRLRL’RL’R’L’R’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,7)(1,12,8)(2,13,6)&lt;/td&gt;
      &lt;td&gt;RLRLR’L’R’L’RL’RLRLRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,19)(1,11,20)(2,9,18)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’RLRL’RLR’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,14)(1,8,12)(2,6,13)&lt;/td&gt;
      &lt;td&gt;RLR’L’R’L’R’LR’LRLRL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,11)(4,19,9)(5,20,10)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’LRL’RLRL’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,10)(1,20,11)(2,18,9)&lt;/td&gt;
      &lt;td&gt;R’LRL’RL’R’LR’L’R’LR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,7)(4,12,8)(5,13,6)&lt;/td&gt;
      &lt;td&gt;R’L’RLRLRL’RL’R’L’R’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,11,18)(4,9,19)(5,10,20)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LR’L’R’LR’L’RL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,14)(4,8,12)(5,6,13)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’RLRLR’LR’L’R’L’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,23)(1,12,21)(2,13,22)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’RLRLRL’R’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,23,13)(4,21,14)(5,22,12)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’R’L’RLRLRLR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,10,22)(7,11,23)(8,9,21)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’LR’LR’L’R’L’RLR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,21)(4,12,22)(5,13,23)&lt;/td&gt;
      &lt;td&gt;LRLR’LRL’R’L’R’L’RL’R’L’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,13)(1,23,14)(2,21,12)&lt;/td&gt;
      &lt;td&gt;LRLR’L’R’L’R’L’RLRL’R’L’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,3,22)(1,4,23)(2,5,21)&lt;/td&gt;
      &lt;td&gt;LRL’RLR’LRLRL’RLR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,5,12)(1,3,13)(2,4,14)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’L’RL’R’L’R’LR’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,10)(1,19,11)(2,20,9)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’L’R’L’R’L’RL’R’L’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,19,15)(13,20,16)(14,18,17)&lt;/td&gt;
      &lt;td&gt;LR’LR’L’RLRLR’LR’LRL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,9)(1,18,10)(2,19,11)&lt;/td&gt;
      &lt;td&gt;LR’L’R’L’R’LR’L’R’L’R’L’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,20,9)(4,18,10)(5,19,11)&lt;/td&gt;
      &lt;td&gt;L’RLRLRL’RLRLRLR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,18,22)(7,19,23)(8,20,21)&lt;/td&gt;
      &lt;td&gt;L’RL’RLR’L’R’L’RL’RL’R’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,11)(4,20,9)(5,18,10)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RLRLRLR’LRLRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,16)(1,8,17)(2,6,15)&lt;/td&gt;
      &lt;td&gt;L’R’LRLR’L’RL’RLR’LRLRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,5)(1,6,3)(2,7,4)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RLR’LRLRL’RLR’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,3)(1,16,4)(2,17,5)&lt;/td&gt;
      &lt;td&gt;L’R’LR’L’RL’R’L’R’LR’L’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,15,8)(4,16,6)(5,17,7)&lt;/td&gt;
      &lt;td&gt;L’R’L’RLRLRLR’L’R’LRLRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,16,13)(10,17,14)(11,15,12)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LRL’RL’RLRLR’L’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,17,8)(1,15,6)(2,16,7)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’L’R’LRLR’L’R’L’R’L’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,17)(4,8,15)(5,6,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’L’R’LR’L’RL’RLR’L’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,14)(4,22,12)(5,23,13)&lt;/td&gt;
      &lt;td&gt;RLRLRLR’LRLRLR’L’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,13,22)(1,14,23)(2,12,21)&lt;/td&gt;
      &lt;td&gt;RLRLRLR’L’R’LRLRLRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,15,19)(13,16,20)(14,17,18)&lt;/td&gt;
      &lt;td&gt;RLRLR’L’RL’RL’R’L’R’LRL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,14)(1,21,12)(2,22,13)&lt;/td&gt;
      &lt;td&gt;RLRL’RLR’L’R’L’R’LR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,13,23)(4,14,21)(5,12,22)&lt;/td&gt;
      &lt;td&gt;RLRL’R’L’R’L’R’LRLR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,5)(1,13,3)(2,14,4)&lt;/td&gt;
      &lt;td&gt;RLR’LRL’RLRLR’LRL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,3)(1,23,4)(2,21,5)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’R’LR’L’R’L’RL’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,20)(4,10,18)(5,11,19)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’R’L’R’L’R’LR’L’R’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,22,10)(7,23,11)(8,21,9)&lt;/td&gt;
      &lt;td&gt;RL’RL’R’LRLRL’RL’RLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,11,19)(4,9,20)(5,10,18)&lt;/td&gt;
      &lt;td&gt;RL’R’L’R’L’RL’R’L’R’L’R’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,18)(1,11,19)(2,9,20)&lt;/td&gt;
      &lt;td&gt;R’LRLRLR’LRLRLRL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,13,16)(10,14,17)(11,12,15)&lt;/td&gt;
      &lt;td&gt;R’LR’LRL’R’L’R’LR’LR’L’RLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,20)(1,10,18)(2,11,19)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LRLRLRL’RLRLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,17,7)(4,15,8)(5,16,6)&lt;/td&gt;
      &lt;td&gt;R’L’RLRL’R’LR’LRL’RLRLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,3,15)(1,4,16)(2,5,17)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LRL’RLRLR’LRL’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,5,8)(1,3,6)(2,4,7)&lt;/td&gt;
      &lt;td&gt;R’L’RL’R’LR’L’R’L’RL’R’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,17)(1,6,15)(2,7,16)&lt;/td&gt;
      &lt;td&gt;R’L’R’LRLRLRL’R’L’RLRLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,22,18)(7,23,19)(8,21,20)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’RLR’LR’LRLRL’R’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,8,15)(4,6,16)(5,7,17)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’R’L’RLRL’R’L’R’L’R’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,7)(1,17,8)(2,15,6)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’R’L’RL’R’LR’LRL’R’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,21,17)(13,22,15)(14,23,16)&lt;/td&gt;
      &lt;td&gt;LRLRL’RL’RLRLR’LR’L’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,12,16)(7,13,17)(8,14,15)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’LR’LRLRL’RL’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,17,21)(13,15,22)(14,16,23)&lt;/td&gt;
      &lt;td&gt;LRLR’LRL’RL’R’L’R’LR’LR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,16,12)(7,17,13)(8,15,14)&lt;/td&gt;
      &lt;td&gt;LRLR’LR’LR’L’R’L’RL’RLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,8)(4,23,6)(5,21,7)&lt;/td&gt;
      &lt;td&gt;LRL’RL’R’LR’LRLRL’RL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,8,22)(4,6,23)(5,7,21)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LR’L’R’L’RL’RLR’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,14,17)(7,12,15)(8,13,16)&lt;/td&gt;
      &lt;td&gt;LR’LRLRLRL’RL’R’L’R’LRL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,11,20)(4,9,18)(5,10,19)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’L’R’L’R’L’RLRL’R’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,14)(7,15,12)(8,16,13)&lt;/td&gt;
      &lt;td&gt;LR’LR’L’RLRLR’LR’L’R’L’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,17,20)(1,15,18)(2,16,19)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’RL’RLRLR’LR’L’RLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,3,20)(1,4,18)(2,5,19)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’R’L’RL’RLRLR’LRLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,17)(1,18,15)(2,19,16)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LRL’RL’R’L’R’LR’LR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,10)(1,18,11)(2,19,9)&lt;/td&gt;
      &lt;td&gt;LR’L’R’L’RLRL’R’L’R’L’R’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,3)(1,18,4)(2,19,5)&lt;/td&gt;
      &lt;td&gt;LR’L’R’L’RL’R’L’R’LR’LRLR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,20,11)(4,18,9)(5,19,10)&lt;/td&gt;
      &lt;td&gt;L’RLRLR’L’R’LRLRLRL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,20,23)(4,18,21)(5,19,22)&lt;/td&gt;
      &lt;td&gt;L’RLRL’R’LR’LRLRL’RL’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,23,20)(4,21,18)(5,22,19)&lt;/td&gt;
      &lt;td&gt;L’RLR’LR’LR’L’R’L’RL’RLR’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,14,22)(7,12,23)(8,13,21)&lt;/td&gt;
      &lt;td&gt;L’RL’RLR’L’R’L’RL’RLRLRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,20)(1,11,18)(2,9,19)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RLRLRLR’L’R’LRLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,22,14)(7,23,12)(8,21,13)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’R’L’R’LR’LRLRL’R’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,13,15)(1,14,16)(2,12,17)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RL’RLRLR’LR’L’RL’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,13)(1,16,14)(2,17,12)&lt;/td&gt;
      &lt;td&gt;L’R’LR’LRL’RL’R’L’R’LR’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,12,21)(7,13,22)(8,14,23)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’RL’RLRLR’LR’L’RLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,23,16)(7,21,17)(8,22,15)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’R’LR’LRLRL’RL’RLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,21,12)(7,22,13)(8,23,14)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LRL’RL’R’L’R’LR’LR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,16,23)(7,17,21)(8,15,22)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LR’LR’L’R’L’RL’RLR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,23,13)(7,21,14)(8,22,12)&lt;/td&gt;
      &lt;td&gt;RLRLR’LR’LRLRL’RL’R’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,15,21)(7,16,22)(8,17,23)&lt;/td&gt;
      &lt;td&gt;RLRLR’L’RL’RLRLR’LR’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,13,23)(7,14,21)(8,12,22)&lt;/td&gt;
      &lt;td&gt;RLRL’RLR’LR’L’R’L’RL’RL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,21,15)(7,22,16)(8,23,17)&lt;/td&gt;
      &lt;td&gt;RLRL’RL’RL’R’L’R’LR’LRL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,17)(1,13,15)(2,14,16)&lt;/td&gt;
      &lt;td&gt;RLR’LR’L’RL’RLRLR’LR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,17,12)(1,15,13)(2,16,14)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’RL’R’L’R’LR’LRL’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,22)(7,15,23)(8,16,21)&lt;/td&gt;
      &lt;td&gt;RL’RLRLRLR’LR’L’R’L’RLR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,22,17)(7,23,15)(8,21,16)&lt;/td&gt;
      &lt;td&gt;RL’RL’R’LRLRL’RL’R’L’R’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,8,11)(4,6,9)(5,7,10)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’LR’LRLRL’RL’R’LRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,5)(1,11,3)(2,9,4)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’L’R’LR’LRLRL’RLRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,11,8)(4,9,6)(5,10,7)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RLR’LR’L’R’L’RL’RL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,5,10)(1,3,11)(2,4,9)&lt;/td&gt;
      &lt;td&gt;RL’R’L’R’LR’L’R’L’RL’RLRL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,13)(1,11,14)(2,9,12)&lt;/td&gt;
      &lt;td&gt;R’LRLR’L’RL’RLRLR’LR’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,13,10)(1,14,11)(2,12,9)&lt;/td&gt;
      &lt;td&gt;R’LRL’RL’RL’R’L’R’LR’LRL’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,15,23)(13,16,21)(14,17,22)&lt;/td&gt;
      &lt;td&gt;R’LR’LRL’R’L’R’LR’LRLRLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,23,15)(13,21,16)(14,22,17)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’L’R’L’RL’RLRLR’L’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,23,6)(4,21,7)(5,22,8)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LR’LRLRL’RL’R’LR’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,23)(4,7,21)(5,8,22)&lt;/td&gt;
      &lt;td&gt;R’L’RL’RLR’LR’L’R’L’RL’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,16,22)(13,17,23)(14,15,21)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’LR’LRLRL’RL’R’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,15,13)(7,16,14)(8,17,12)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’L’RL’RLRLR’LR’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,22,16)(13,23,17)(14,21,15)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’RLR’LR’L’R’L’RL’RL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,13,15)(7,14,16)(8,12,17)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’RL’RL’R’L’R’LR’LRL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,23)(1,9,21)(2,10,22)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’RLR’LRLRLRL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,18)(4,13,19)(5,14,20)&lt;/td&gt;
      &lt;td&gt;LRLR’LRLRLRL’RL’R’L’RL’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,23)(4,10,21)(5,11,22)&lt;/td&gt;
      &lt;td&gt;LRL’RLR’L’R’LRLR’LR’LRLRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,23,9)(4,21,10)(5,22,11)&lt;/td&gt;
      &lt;td&gt;LRL’RL’RLR’L’R’LR’LR’L’RL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,10)(4,19,11)(5,20,9)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’L’RL’RLR’LR’L’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,18)(4,11,19)(5,9,20)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’L’R’L’R’L’R’LRLR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,19)(1,9,20)(2,10,18)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’L’R’LRLRLRLR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(15,20,21)(16,18,22)(17,19,23)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’L’R’LRL’R’L’RL’R’LRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,10,12)(7,11,13)(8,9,14)&lt;/td&gt;
      &lt;td&gt;LR’LRL’R’LR’L’R’LRL’R’L’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,16)(4,11,17)(5,9,15)&lt;/td&gt;
      &lt;td&gt;LR’LR’LR’L’R’LR’LRLRLRL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,13)(1,19,14)(2,20,12)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’RLR’LR’LRLR’L’RL’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,18)(4,12,19)(5,13,20)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’R’L’R’L’R’LR’L’RL’R’L’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,13,18)(1,14,19)(2,12,20)&lt;/td&gt;
      &lt;td&gt;LR’L’R’L’R’LR’LR’L’R’LRLR’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,8,19)(4,6,20)(5,7,18)&lt;/td&gt;
      &lt;td&gt;L’RLRLRLRL’R’L’RLRL’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,19)(1,8,20)(2,6,18)&lt;/td&gt;
      &lt;td&gt;L’RLR’LRLRLRL’RLR’LRLRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,8)(4,20,6)(5,18,7)&lt;/td&gt;
      &lt;td&gt;L’RLR’LR’L’RL’RLR’LRL’R’L’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,21)(1,9,22)(2,10,23)&lt;/td&gt;
      &lt;td&gt;L’RL’RL’RLRL’RL’R’L’R’L’R’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,12,11)(7,13,9)(8,14,10)&lt;/td&gt;
      &lt;td&gt;L’RL’R’LRL’RLRL’R’LRLR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(15,21,19)(16,22,20)(17,23,18)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RLRL’R’LRLR’LRL’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,17,9)(1,15,10)(2,16,11)&lt;/td&gt;
      &lt;td&gt;L’R’LRLRL’R’LR’L’RL’RLR’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,11)(1,20,9)(2,18,10)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RLR’LR’L’RL’RLR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,17)(1,10,15)(2,11,16)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RL’R’L’RLRL’R’L’R’L’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,6,19)(1,7,20)(2,8,18)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’R’L’R’L’R’LR’LRLR’LR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,17)(4,11,15)(5,9,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’L’R’LR’L’RL’R’L’R’L’R’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,14)(4,19,12)(5,20,13)&lt;/td&gt;
      &lt;td&gt;RLRLRLR’LRL’RLRLRLR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,21,11)(1,22,9)(2,23,10)&lt;/td&gt;
      &lt;td&gt;RLRL’RLRLRLR’LR’L’R’LR’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,11,12)(7,9,13)(8,10,14)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’R’L’RLR’L’R’LR’L’RLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(15,19,21)(16,20,22)(17,18,23)&lt;/td&gt;
      &lt;td&gt;RL’RLR’L’RL’R’L’RLR’L’R’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,6)(1,20,7)(2,18,8)&lt;/td&gt;
      &lt;td&gt;RL’RL’RL’R’L’RL’RLRLRLR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,11)(1,21,9)(2,22,10)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’L’R’L’R’L’RL’R’LR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,17,10)(4,15,11)(5,16,9)&lt;/td&gt;
      &lt;td&gt;R’LRL’RLRLRLR’LRL’RLRLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,12)(4,19,13)(5,20,14)&lt;/td&gt;
      &lt;td&gt;R’LR’LR’LRLR’LR’L’R’L’R’L’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(15,21,20)(16,22,18)(17,23,19)&lt;/td&gt;
      &lt;td&gt;R’LR’L’RLR’LRLR’L’RLRL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,12,10)(7,13,11)(8,14,9)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LRLR’L’RLRL’RLR’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,16,10)(4,17,11)(5,15,9)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’L’R’L’R’L’RL’RLRL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,7)(1,20,8)(2,18,6)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’R’L’RL’R’LR’L’R’L’R’L’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,16)(1,6,17)(2,7,15)&lt;/td&gt;
      &lt;td&gt;LRLRLRLRLR’LR’L’R’L’RLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,10)(4,22,11)(5,23,9)&lt;/td&gt;
      &lt;td&gt;LRLRLRLR’L’R’LR’L’R’L’RLRLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,23)(1,8,21)(2,6,22)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’RL’RLR’L’R’L’RL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,11)(4,22,9)(5,23,10)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’R’L’R’L’R’LRLRLR’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,18,17)(13,19,15)(14,20,16)&lt;/td&gt;
      &lt;td&gt;LRLRL’RL’RLRLR’L’RL’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,8)(1,17,6)(2,15,7)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’LRLRL’RL’R’L’R’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,17)(4,19,15)(5,20,16)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’L’R’LR’LR’L’RLRLR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,17)(4,13,15)(5,14,16)&lt;/td&gt;
      &lt;td&gt;LRLR’LRL’RL’RL’RLRLRLRLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,13)(4,22,14)(5,23,12)&lt;/td&gt;
      &lt;td&gt;LRLR’LR’LRL’RLRL’RL’R’LR’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,21,13)(7,22,14)(8,23,12)&lt;/td&gt;
      &lt;td&gt;LRLR’LR’LR’LRLRL’RL’R’LRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,22,14)(10,23,12)(11,21,13)&lt;/td&gt;
      &lt;td&gt;LRLR’LR’L’R’LR’LRLRL’RLRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,22,11)(7,23,9)(8,21,10)&lt;/td&gt;
      &lt;td&gt;LRLR’LR’L’R’L’RLR’LR’LRLRL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,6)(4,13,7)(5,14,8)&lt;/td&gt;
      &lt;td&gt;LRLR’L’RLR’LRL’R’L’RLR’LRLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,13,21)(7,14,22)(8,12,23)&lt;/td&gt;
      &lt;td&gt;LRLR’L’RLR’LR’L’R’L’RL’RL’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,13)(4,23,14)(5,21,12)&lt;/td&gt;
      &lt;td&gt;LRLR’L’RL’R’LR’LRLR’LRL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,14,22)(10,12,23)(11,13,21)&lt;/td&gt;
      &lt;td&gt;LRLR’L’R’LR’L’R’L’RL’RLRL’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,21,14)(7,22,12)(8,23,13)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’RLRLR’LR’L’R’LR’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,20,22)(10,18,23)(11,19,21)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’RL’RL’R’L’R’LR’L’R’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,23,11)(7,21,9)(8,22,10)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’R’L’R’LR’LRLRLR’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,14,21)(7,12,22)(8,13,23)&lt;/td&gt;
      &lt;td&gt;LRL’RL’RLRL’RL’R’L’R’LR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,13,21)(4,14,22)(5,12,23)&lt;/td&gt;
      &lt;td&gt;LRL’RL’RLR’LR’L’R’LR’L’RL’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,21)(4,11,22)(5,9,23)&lt;/td&gt;
      &lt;td&gt;LRL’RL’RLR’L’R’LRL’RLR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,11,23)(7,9,21)(8,10,22)&lt;/td&gt;
      &lt;td&gt;LRL’RL’R’L’R’L’RL’RLRLR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,15,19)(4,16,20)(5,17,18)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LR’L’RLRLR’LR’LRL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,13,22)(4,14,23)(5,12,21)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’L’RL’R’L’RL’RLR’LRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,12)(4,7,13)(5,8,14)&lt;/td&gt;
      &lt;td&gt;LRL’R’L’RL’R’LRLR’L’RL’R’LRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,17,12)(4,15,13)(5,16,14)&lt;/td&gt;
      &lt;td&gt;LRL’R’L’R’L’R’L’R’LR’LR’LR’L’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,12,23)(7,13,21)(8,14,22)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LR’LRLRL’RL’R’LR’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,17,18)(13,15,19)(14,16,20)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LR’LRL’R’L’R’LR’LR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,21)(4,13,22)(5,14,23)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LR’LR’LRLRLRLR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,20)(1,13,18)(2,14,19)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LR’L’R’LR’L’RL’RLRLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,23,12)(7,21,13)(8,22,14)&lt;/td&gt;
      &lt;td&gt;LR’LRL’RLR’LR’L’R’L’RL’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,8)(1,12,6)(2,13,7)&lt;/td&gt;
      &lt;td&gt;LR’LRL’R’L’RL’RLR’LRLR’LR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,7)(1,21,8)(2,22,6)&lt;/td&gt;
      &lt;td&gt;LR’LR’LR’LRLRL’R’LR’LR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,16)(4,23,17)(5,21,15)&lt;/td&gt;
      &lt;td&gt;LR’LR’LR’LR’LRLRL’RL’R’LRL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,15,7)(4,16,8)(5,17,6)&lt;/td&gt;
      &lt;td&gt;LR’LR’LR’L’RL’RLRLR’LR’LRL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,16,22)(4,17,23)(5,15,21)&lt;/td&gt;
      &lt;td&gt;LR’LR’L’RLR’LR’L’R’L’RL’RL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,15)(4,20,16)(5,18,17)&lt;/td&gt;
      &lt;td&gt;LR’LR’L’RL’RL’R’L’R’LRL’RL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,15)(4,8,16)(5,6,17)&lt;/td&gt;
      &lt;td&gt;LR’LR’L’RL’RL’R’L’R’LR’LRL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,11,22)(7,9,23)(8,10,21)&lt;/td&gt;
      &lt;td&gt;LR’LR’L’R’L’RL’RL’R’LRLRL’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,14,16)(10,12,17)(11,13,15)&lt;/td&gt;
      &lt;td&gt;LR’L’RLRL’R’LR’L’RL’R’L’R’L’RL’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,14)(1,6,12)(2,7,13)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’RL’R’L’RL’R’LR’LRLR’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,17,18)(4,15,19)(5,16,20)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’R’L’R’LRL’RL’RLRLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,12)(4,22,13)(5,23,14)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’R’L’R’L’R’L’RL’RL’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,18,15)(13,19,16)(14,20,17)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LRLRLR’LR’L’R’L’RLRLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,16)(1,11,17)(2,9,15)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LRLRLR’L’R’L’R’L’RLRLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,20,15)(10,18,16)(11,19,17)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LR’L’R’LR’LRLRL’RLRLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,14,15)(7,12,16)(8,13,17)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LR’L’R’L’R’L’RL’RLRL’RL’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,15,18)(13,16,19)(14,17,20)&lt;/td&gt;
      &lt;td&gt;LR’L’R’L’R’LRLRL’RL’R’L’R’L’RLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,12)(1,18,13)(2,19,14)&lt;/td&gt;
      &lt;td&gt;LR’L’R’L’R’LR’LRL’RLRL’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,15,20)(10,16,18)(11,17,19)&lt;/td&gt;
      &lt;td&gt;LR’L’R’L’R’LR’L’R’L’RL’RLRL’RLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,22,20)(10,23,18)(11,21,19)&lt;/td&gt;
      &lt;td&gt;L’RLRLRL’RLRLR’LR’LR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,20,6)(4,18,7)(5,19,8)&lt;/td&gt;
      &lt;td&gt;L’RLRLRL’RL’R’LR’L’R’LR’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,22,19)(7,23,20)(8,21,18)&lt;/td&gt;
      &lt;td&gt;L’RLRLRL’R’L’R’LR’LRLRLR’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,11,21)(4,9,22)(5,10,23)&lt;/td&gt;
      &lt;td&gt;L’RLRL’R’L’R’L’RLRLRLR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,19,22)(7,20,23)(8,18,21)&lt;/td&gt;
      &lt;td&gt;L’RLRL’R’L’R’L’RL’RLRLR’L’R’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,6)(1,17,7)(2,15,8)&lt;/td&gt;
      &lt;td&gt;L’RLR’LRLRLRLR’LR’LR’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,19)(1,21,20)(2,22,18)&lt;/td&gt;
      &lt;td&gt;L’RLR’LRLRL’R’LR’LR’L’R’L’RLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,6)(1,13,7)(2,14,8)&lt;/td&gt;
      &lt;td&gt;L’RLR’LRLR’LRLR’L’RL’R’L’RLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,13,7)(4,14,8)(5,12,6)&lt;/td&gt;
      &lt;td&gt;L’RLR’LR’LRLR’LRL’RL’R’L’RLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,17,14)(10,15,12)(11,16,13)&lt;/td&gt;
      &lt;td&gt;L’RL’RLRLR’LR’LRL’R’L’R’LR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,22)(1,12,23)(2,13,21)&lt;/td&gt;
      &lt;td&gt;L’RL’RLR’LR’LRLRL’RL’R’LR’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,22)(1,19,23)(2,20,21)&lt;/td&gt;
      &lt;td&gt;L’RL’RLR’LR’LRLRL’R’LR’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,21,15)(1,22,16)(2,23,17)&lt;/td&gt;
      &lt;td&gt;L’RL’RLR’L’RL’RLRLR’LR’LR’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,14)(1,23,12)(2,21,13)&lt;/td&gt;
      &lt;td&gt;L’RL’RL’RLR’LR’L’R’L’RL’RL’R’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,21)(1,16,22)(2,17,23)&lt;/td&gt;
      &lt;td&gt;L’RL’RL’RL’RL’R’L’R’LR’LRL’R’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,17,14)(4,15,12)(5,16,13)&lt;/td&gt;
      &lt;td&gt;L’RL’RL’RL’R’L’R’LRL’RL’RLRLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,6,12)(1,7,13)(2,8,14)&lt;/td&gt;
      &lt;td&gt;L’RL’R’LRLR’LRL’R’L’RL’R’L’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,13)(4,8,14)(5,6,12)&lt;/td&gt;
      &lt;td&gt;L’RL’R’LRLR’LR’L’RL’R’L’RL’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,12,17)(7,13,15)(8,14,16)&lt;/td&gt;
      &lt;td&gt;L’RL’R’LR’L’RL’RLRLR’LR’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,20)(4,7,18)(5,8,19)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RL’RLRL’RLR’LR’L’R’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,6,16)(1,7,17)(2,8,15)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RL’RL’RL’R’L’R’L’R’L’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,23,19)(7,21,20)(8,22,18)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RL’RL’R’LRLRL’RL’RLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,12)(7,15,13)(8,16,14)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RL’RL’R’L’R’LR’LRL’RLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,6)(1,21,7)(2,22,8)&lt;/td&gt;
      &lt;td&gt;L’R’LRLRLRLRL’RL’RL’RLR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,16)(1,9,17)(2,10,15)&lt;/td&gt;
      &lt;td&gt;L’R’LRLRL’RLRL’R’LR’L’R’LR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,15)(1,6,16)(2,7,17)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RLR’LRLR’LR’L’RL’R’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,18)(1,23,19)(2,21,20)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RL’RLR’L’R’L’RL’RL’R’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,16,14)(10,17,12)(11,15,13)&lt;/td&gt;
      &lt;td&gt;L’R’LR’LRLRLR’LRL’RLR’L’R’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,15,14)(7,16,12)(8,17,13)&lt;/td&gt;
      &lt;td&gt;L’R’LR’LR’L’R’LR’LRLRLRL’RLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,11)(7,15,9)(8,16,10)&lt;/td&gt;
      &lt;td&gt;L’R’L’RLRL’RLRLR’LR’L’R’LR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,8)(1,16,6)(2,17,7)&lt;/td&gt;
      &lt;td&gt;L’R’L’RLR’LRL’RL’R’L’RL’R’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,13)(7,15,14)(8,16,12)&lt;/td&gt;
      &lt;td&gt;L’R’L’RLR’L’RL’RLRLR’LR’LR’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,14,17)(10,12,15)(11,13,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’RLRLR’L’RL’RL’R’L’R’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,11)(1,17,9)(2,15,10)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’RLRL’RLR’L’R’LR’L’R’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,11,17)(7,9,15)(8,10,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’RLRL’RL’R’L’R’LR’L’R’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,13,17)(7,14,15)(8,12,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’RL’RL’R’L’R’LR’LRL’R’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,6,23)(1,7,21)(2,8,22)&lt;/td&gt;
      &lt;td&gt;L’R’L’RL’R’LR’LR’LR’L’R’L’R’L’R’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,23)(1,20,21)(2,18,22)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LRLRL’RL’RLR’L’R’L’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,19,23)(7,20,21)(8,18,22)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LR’LR’L’R’L’RLR’LR’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,10)(1,17,11)(2,15,9)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’L’R’LRLRLRL’R’L’R’L’RLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,17)(4,12,15)(5,13,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’L’R’LR’LR’L’RLRLR’LR’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,19)(1,12,20)(2,13,18)&lt;/td&gt;
      &lt;td&gt;RLRLRLRL’R’L’RL’R’L’R’LRLRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,20)(1,12,18)(2,13,19)&lt;/td&gt;
      &lt;td&gt;RLRLRLR’L’R’L’R’L’RLRLRL’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,23,10)(7,21,11)(8,22,9)&lt;/td&gt;
      &lt;td&gt;RLRLR’LR’LRLRL’R’LR’LR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,7)(1,9,8)(2,10,6)&lt;/td&gt;
      &lt;td&gt;RLRLR’L’R’L’RL’RL’R’LRLRL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,21,7)(1,22,8)(2,23,6)&lt;/td&gt;
      &lt;td&gt;RLRL’RLR’LR’LR’LRLRLRLRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,23,16)(13,21,17)(14,22,15)&lt;/td&gt;
      &lt;td&gt;RLRL’RL’RL’RLRLR’LR’L’RLR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,23,18)(13,21,19)(14,22,20)&lt;/td&gt;
      &lt;td&gt;RLRL’RL’R’L’RL’RLRLR’LRLR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,20,15)(13,18,16)(14,19,17)&lt;/td&gt;
      &lt;td&gt;RLRL’RL’R’L’R’LRL’RL’RLRLR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,16,23)(13,17,21)(14,15,22)&lt;/td&gt;
      &lt;td&gt;RLRL’R’LRL’RL’R’L’R’LR’LR’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,22)(1,13,23)(2,14,21)&lt;/td&gt;
      &lt;td&gt;RLRL’R’LR’L’RL’RLRL’RLR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,18,23)(13,19,21)(14,20,22)&lt;/td&gt;
      &lt;td&gt;RLRL’R’L’RL’R’L’R’LR’LRLR’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,21,16)(13,22,17)(14,23,15)&lt;/td&gt;
      &lt;td&gt;RLR’LRLR’LRLRL’RL’R’L’RL’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,14,20)(10,12,18)(11,13,19)&lt;/td&gt;
      &lt;td&gt;RLR’LRLR’LR’LR’L’R’L’RL’R’L’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,19,17)(13,20,15)(14,18,16)&lt;/td&gt;
      &lt;td&gt;RLR’LRLR’L’R’L’RL’RLRLRL’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,16,21)(13,17,22)(14,15,23)&lt;/td&gt;
      &lt;td&gt;RLR’LR’LRLR’LR’L’R’L’RL’R’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,14)(1,20,12)(2,18,13)&lt;/td&gt;
      &lt;td&gt;RLR’LR’LRL’R’L’RLR’LRL’R’L’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,17,19)(13,15,20)(14,16,18)&lt;/td&gt;
      &lt;td&gt;RLR’LR’L’R’L’R’LR’LRLRL’R’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,9)(1,6,10)(2,7,11)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’RL’R’LRLRL’RL’RLR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,12)(1,23,13)(2,21,14)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’R’LR’L’R’LR’LRL’RLR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,21)(1,8,22)(2,6,23)&lt;/td&gt;
      &lt;td&gt;RLR’L’R’L’R’L’R’L’RL’RL’RL’R’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,17,23)(13,15,21)(14,16,22)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’RL’RLRLR’LR’L’RL’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,10,23)(7,11,21)(8,9,22)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’RL’RLR’L’R’L’RL’RL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,21,14)(1,22,12)(2,23,13)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’RL’RL’RLRLRLRL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,11)(4,23,9)(5,21,10)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’RL’R’L’RL’R’LR’LRLRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,23,17)(13,21,15)(14,22,16)&lt;/td&gt;
      &lt;td&gt;RL’RLR’LRL’RL’R’L’R’LR’LR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,21,15)(4,22,16)(5,23,17)&lt;/td&gt;
      &lt;td&gt;RL’RLR’L’R’LR’LRL’RLRL’RL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,8)(1,10,6)(2,11,7)&lt;/td&gt;
      &lt;td&gt;RL’RL’R’LR’LR’L’R’L’RLR’LR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,15,20)(13,16,18)(14,17,19)&lt;/td&gt;
      &lt;td&gt;RL’RL’R’L’R’LR’LR’L’RLRLR’LR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,18,23)(7,19,21)(8,20,22)&lt;/td&gt;
      &lt;td&gt;RL’R’LRLR’L’RL’R’LR’L’R’L’R’LR’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,15,21)(4,16,22)(5,17,23)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’LR’L’R’LR’L’RL’RLRL’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,11)(1,8,9)(2,6,10)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’L’R’L’RLR’LR’LRLRL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,14,21)(1,12,22)(2,13,23)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’L’R’L’R’L’R’LR’LR’LR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,22,9)(7,23,10)(8,21,11)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RLRLRL’RL’R’L’R’LRLRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,20,7)(4,18,8)(5,19,6)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RLRLRL’R’L’R’L’R’LRLRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,19,11)(7,20,9)(8,18,10)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RL’R’L’RL’RLRLR’LRLRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,16,21)(7,17,22)(8,15,23)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RL’R’L’R’L’R’LR’LRLR’LR’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,9,22)(7,10,23)(8,11,21)&lt;/td&gt;
      &lt;td&gt;RL’R’L’R’L’RLRLR’LR’L’R’L’R’LRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,11,22)(4,9,23)(5,10,21)&lt;/td&gt;
      &lt;td&gt;RL’R’L’R’L’RL’RLR’LRLR’LR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,11,19)(7,9,20)(8,10,18)&lt;/td&gt;
      &lt;td&gt;RL’R’L’R’L’RL’R’L’R’LR’LRLR’LRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,20,14)(10,18,12)(11,19,13)&lt;/td&gt;
      &lt;td&gt;R’LRLRLR’LRLRL’RL’RL’R’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,15)(1,11,16)(2,9,17)&lt;/td&gt;
      &lt;td&gt;R’LRLRLR’LR’L’RL’R’L’RL’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,15,12)(10,16,13)(11,17,14)&lt;/td&gt;
      &lt;td&gt;R’LRLRLR’L’R’L’RL’RLRLRL’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,14)(1,18,12)(2,19,13)&lt;/td&gt;
      &lt;td&gt;R’LRLR’L’R’L’R’LRLRLRL’R’L’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,12,15)(10,13,16)(11,14,17)&lt;/td&gt;
      &lt;td&gt;R’LRLR’L’R’L’R’LR’LRLRL’R’L’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,16)(4,8,17)(5,6,15)&lt;/td&gt;
      &lt;td&gt;R’LRL’RLRLRLRL’RL’RL’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,10)(4,12,11)(5,13,9)&lt;/td&gt;
      &lt;td&gt;R’LRL’RLRLR’L’RL’RL’R’L’R’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,16)(1,23,17)(2,21,15)&lt;/td&gt;
      &lt;td&gt;R’LRL’RL’RLRL’RLR’LR’L’R’LRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,22,20)(7,23,18)(8,21,19)&lt;/td&gt;
      &lt;td&gt;R’LR’LRLRL’RL’RLR’L’R’L’RL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,13)(4,10,14)(5,11,12)&lt;/td&gt;
      &lt;td&gt;R’LR’LRL’RL’RLRLR’L’RL’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,22)(1,17,23)(2,15,21)&lt;/td&gt;
      &lt;td&gt;R’LR’L’RLRL’RL’R’LR’L’R’LR’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,23)(7,15,21)(8,16,22)&lt;/td&gt;
      &lt;td&gt;R’LR’L’RL’R’LR’LRLRL’RL’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,10)(1,16,11)(2,17,9)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LR’LRLR’LRL’RL’R’L’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,16,7)(4,17,8)(5,15,6)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LR’LR’LR’L’R’L’R’L’R’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,15,13)(10,16,14)(11,17,12)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LR’LR’L’RLRLR’LR’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,23,17)(7,21,15)(8,22,16)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LR’LR’L’R’L’RL’RLR’LRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,16)(4,12,17)(5,13,15)&lt;/td&gt;
      &lt;td&gt;R’L’RLRLRLRLR’LR’LR’LRL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,7)(4,19,8)(5,20,6)&lt;/td&gt;
      &lt;td&gt;R’L’RLRLR’LRLR’L’RL’R’L’RL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,15,6)(4,16,7)(5,17,8)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LRL’RLRL’RL’R’LR’L’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,13,9)(4,14,10)(5,12,11)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LR’LRL’R’L’R’LR’LR’L’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,23,18)(7,21,19)(8,22,20)&lt;/td&gt;
      &lt;td&gt;R’L’RL’RLRLRL’RLR’LRL’R’L’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,21,16)(7,22,17)(8,23,15)&lt;/td&gt;
      &lt;td&gt;R’L’RL’RL’R’L’RL’RLRLRLR’LRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,19,17)(7,20,15)(8,18,16)&lt;/td&gt;
      &lt;td&gt;R’L’R’LRLR’LRLRL’RL’R’L’RL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,15)(4,7,16)(5,8,17)&lt;/td&gt;
      &lt;td&gt;R’L’R’LRL’RLR’LR’L’R’LR’L’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,21,17)(7,22,15)(8,23,16)&lt;/td&gt;
      &lt;td&gt;R’L’R’LRL’R’LR’LRLRL’RL’RL’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,20,22)(7,18,23)(8,19,21)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’LRLRL’R’LR’LR’L’R’L’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,18)(4,8,19)(5,6,20)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’LRLR’LRL’R’L’RL’R’L’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,19)(7,15,20)(8,16,18)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’LRLR’LR’L’R’L’RL’R’L’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,21)(7,15,22)(8,16,23)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’LR’LR’L’R’L’RL’RLR’L’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,16,14)(4,17,12)(5,15,13)&lt;/td&gt;
      &lt;td&gt;R’L’R’LR’L’RL’RL’RL’R’L’R’L’R’L’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,14)(4,11,12)(5,9,13)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’RLRLR’LR’LRL’R’L’R’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,13,15)(10,14,16)(11,12,17)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’RL’RL’R’L’R’LRL’RL’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,7,20)(4,8,18)(5,6,19)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’R’L’RLRLRLR’L’R’L’R’LRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,21,8)(1,22,6)(2,23,7)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’LRLRL’RL’RLR’LR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,22)(4,11,23)(5,9,21)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’L’RLRL’R’LR’L’R’LR’LR’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,3,10)(1,4,11)(2,5,9)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’R’LR’LR’LR’L’R’LR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,5,19)(1,3,20)(2,4,18)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LRLR’LR’LR’LRL’R’L’RL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,15,12)(4,16,13)(5,17,14)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LR’L’RL’RL’R’L’R’LRL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,13)(4,11,14)(5,9,12)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LRL’RLRLRL’RL’R’LR’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,12,20)(10,13,18)(11,14,19)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LR’L’R’LR’LR’L’R’L’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,17,20)(10,15,18)(11,16,19)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’L’R’L’RL’RL’R’L’RL’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,19)(1,13,20)(2,14,18)&lt;/td&gt;
      &lt;td&gt;LR’LR’LR’LRLR’LRL’R’L’RLRL’R’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,15,18)(4,16,19)(5,17,20)&lt;/td&gt;
      &lt;td&gt;LR’L’RL’R’LR’LRLRLR’LRL’RLRL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,12)(1,16,13)(2,17,14)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LRLRLR’LRL’RLRLRL’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,3)(1,9,4)(2,10,5)&lt;/td&gt;
      &lt;td&gt;LR’L’R’LR’L’RL’RL’RL’RLRL’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,6)(4,23,7)(5,21,8)&lt;/td&gt;
      &lt;td&gt;L’RLRL’R’L’R’L’RL’R’LR’L’R’L’R’LRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,19)(1,23,20)(2,21,18)&lt;/td&gt;
      &lt;td&gt;L’RLR’LRL’RL’R’L’R’L’RL’R’LR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,18)(4,7,19)(5,8,20)&lt;/td&gt;
      &lt;td&gt;L’RL’RLRLRL’R’L’RL’R’L’R’L’R’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,23,20)(10,21,18)(11,22,19)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RLRLR’LR’LRLR’LR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,20,9)(7,18,10)(8,19,11)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RL’RLRL’RL’RLRLR’L’R’LR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,8)(1,9,6)(2,10,7)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RL’R’LR’L’R’L’R’LR’LRL’RLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,6)(1,23,7)(2,21,8)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RL’RLR’LR’LRLRL’R’LRLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,5)(1,18,3)(2,19,4)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RL’R’L’RL’RLRLR’L’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,11,15)(1,9,16)(2,10,17)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LRLRLRL’RLRL’R’L’R’L’RL’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,16,13)(4,17,14)(5,15,12)&lt;/td&gt;
      &lt;td&gt;L’R’L’R’LRL’R’L’R’LR’LR’L’RL’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,15)(4,13,16)(5,14,17)&lt;/td&gt;
      &lt;td&gt;RLRLR’L’RLRLR’LR’LRL’RL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,12)(1,20,13)(2,18,14)&lt;/td&gt;
      &lt;td&gt;RLRLR’L’R’LRLR’L’RL’R’L’RL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,5)(1,20,3)(2,18,4)&lt;/td&gt;
      &lt;td&gt;RLR’LRLR’L’RL’RL’RL’R’L’RL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,3)(1,11,4)(2,9,5)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’RLRL’RL’RL’RLR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,21)(1,6,22)(2,7,23)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’RL’R’LR’LR’L’R’L’RLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,19,22)(1,20,23)(2,18,21)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’RLR’LRLRLR’LR’L’RL’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,20,23)(10,18,21)(11,19,22)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’RL’R’L’RL’RL’R’L’R’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,9,20)(7,10,18)(8,11,19)&lt;/td&gt;
      &lt;td&gt;RL’RLRL’R’L’R’LR’LR’L’R’LR’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,10)(4,23,11)(5,21,9)&lt;/td&gt;
      &lt;td&gt;RL’RL’RL’RLRL’RLR’L’R’LRLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,11)(1,6,9)(2,7,10)&lt;/td&gt;
      &lt;td&gt;RL’R’LR’L’RL’RLRLRL’RLR’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,22)(4,7,23)(5,8,21)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RLRLRL’RLR’LRLRLR’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,5,20)(1,3,18)(2,4,19)&lt;/td&gt;
      &lt;td&gt;RL’R’L’RL’R’LR’LR’LR’LRLR’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,15)(1,13,16)(2,14,17)&lt;/td&gt;
      &lt;td&gt;R’LRLR’L’R’L’R’LR’L’RL’R’L’R’L’RLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,13,10)(4,14,11)(5,12,9)&lt;/td&gt;
      &lt;td&gt;R’LRL’RLR’LR’L’R’L’R’LR’L’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,11)(1,16,9)(2,17,10)&lt;/td&gt;
      &lt;td&gt;R’LR’LRLRLR’L’R’LR’L’R’L’R’L’RLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,20,12)(10,18,13)(11,19,14)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LRLRL’RL’RLRL’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,20,17)(10,18,15)(11,19,16)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LR’LRLR’LR’LRLRL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,15)(4,19,16)(5,20,17)&lt;/td&gt;
      &lt;td&gt;R’LR’L’R’LR’L’RL’R’L’R’L’RL’RLR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,13,16)(4,14,17)(5,12,15)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LR’LRL’RL’RLRLR’L’RLRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,3,11)(1,4,9)(2,5,10)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LR’L’R’LR’LRLRL’R’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,18,6)(4,19,7)(5,20,8)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’RLRLRLR’LRLR’L’R’L’R’LR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,6,22)(1,7,23)(2,8,21)&lt;/td&gt;
      &lt;td&gt;R’L’R’L’RLR’L’R’L’RL’RL’R’LR’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,12,16)(1,13,17)(2,14,15)&lt;/td&gt;
      &lt;td&gt;LRLRLRLR’LRLRL’R’L’RL’R’L’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,20,15)(1,18,16)(2,19,17)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’RL’RLRLR’LR’L’RL’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,18,9)(1,19,10)(2,20,11)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’RL’RL’RLRLRLRL’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,23,12)(4,21,13)(5,22,14)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’R’L’RLR’LRL’R’L’RLRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,23)(4,12,21)(5,13,22)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’R’L’R’L’R’LR’L’R’L’R’LRLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,15,20)(1,16,18)(2,17,19)&lt;/td&gt;
      &lt;td&gt;LRLRLR’LRL’RL’R’L’R’LR’LR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,16,9)(4,17,10)(5,15,11)&lt;/td&gt;
      &lt;td&gt;LRLRL’RLR’LRL’R’L’RLR’LRL’RL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,9,19)(7,10,20)(8,11,18)&lt;/td&gt;
      &lt;td&gt;LRLRL’RL’RL’RLRLR’LR’L’RLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,17,10)(7,15,11)(8,16,9)&lt;/td&gt;
      &lt;td&gt;LRLRL’RL’R’LR’LRLRL’RL’RLR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,19,9)(7,20,10)(8,18,11)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’LRL’RL’R’L’R’LR’LR’LR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,10,17)(7,11,15)(8,9,16)&lt;/td&gt;
      &lt;td&gt;LRLRL’R’LR’LR’L’R’L’RL’RLR’LR’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,16,12)(1,17,13)(2,15,14)&lt;/td&gt;
      &lt;td&gt;LRLR’LRLR’LRLR’L’R’L’RL’R’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,16)(4,10,17)(5,11,15)&lt;/td&gt;
      &lt;td&gt;LRLR’LRL’R’L’RLRL’RL’R’L’RLRLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,9,18)(1,10,19)(2,11,20)&lt;/td&gt;
      &lt;td&gt;LRLR’LR’L’R’L’R’L’R’LR’LR’LR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,23,8)(1,21,6)(2,22,7)&lt;/td&gt;
      &lt;td&gt;LRLR’L’RLRLRL’RL’R’L’R’LRLRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,23)(4,13,21)(5,14,22)&lt;/td&gt;
      &lt;td&gt;LRLR’L’R’LRLR’L’RL’R’LRLR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,14,22)(4,12,23)(5,13,21)&lt;/td&gt;
      &lt;td&gt;LRLR’L’R’LRLR’L’R’L’R’L’RLRL’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,8,23)(1,6,21)(2,7,22)&lt;/td&gt;
      &lt;td&gt;LRLR’L’R’L’RLRLR’LR’L’R’L’R’LRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,22,10)(1,23,11)(2,21,9)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’R’LR’LRLRL’RL’RL’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,10,8)(4,11,6)(5,9,7)&lt;/td&gt;
      &lt;td&gt;LRL’RLRL’R’L’R’L’R’L’RL’RL’RL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,10,22)(1,11,23)(2,9,21)&lt;/td&gt;
      &lt;td&gt;LRL’RLR’LR’LR’L’R’L’RL’RLR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,21,15)(10,22,16)(11,23,17)&lt;/td&gt;
      &lt;td&gt;LRL’RLR’L’RLRL’R’LR’L’RLRL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,22,14)(4,23,12)(5,21,13)&lt;/td&gt;
      &lt;td&gt;LRL’RLR’L’R’LRLRLRL’R’L’RLRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,14,20)(7,12,18)(8,13,19)&lt;/td&gt;
      &lt;td&gt;LRL’RL’RLRLRL’RL’R’L’R’LRLR’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,9,18)(7,10,19)(8,11,20)&lt;/td&gt;
      &lt;td&gt;LRL’RL’RLR’L’R’L’RL’RLRLRLR’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,20,14)(7,18,12)(8,19,13)&lt;/td&gt;
      &lt;td&gt;LRL’RL’R’L’RLRLR’LR’L’R’L’R’LR’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,18,9)(7,19,10)(8,20,11)&lt;/td&gt;
      &lt;td&gt;LRL’RL’R’L’R’L’R’LR’LRLRL’R’LR’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,23,10)(4,21,11)(5,22,9)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LRLR’L’R’L’R’L’RL’RLR’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,8,10)(4,6,11)(5,7,9)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’LR’LR’LRLRLRLR’L’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,13,19)(4,14,20)(5,12,18)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’L’RL’R’L’R’L’R’LR’L’RL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,15,21)(10,16,22)(11,17,23)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’L’R’LRL’RLR’L’R’LRL’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,23,14)(4,21,12)(5,22,13)&lt;/td&gt;
      &lt;td&gt;LRL’R’L’RLRLRL’RLRLRLR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,7,12)(1,8,13)(2,6,14)&lt;/td&gt;
      &lt;td&gt;LR’LRLRLR’LRLR’L’RL’R’L’RL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,12,19)(4,13,20)(5,14,18)&lt;/td&gt;
      &lt;td&gt;LR’LRLRL’RL’RL’RLRLRLRL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,14)(4,7,12)(5,8,13)&lt;/td&gt;
      &lt;td&gt;LR’LRLRL’R’LR’LRL’RLRLRLR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,9,7)(4,10,8)(5,11,6)&lt;/td&gt;
      &lt;td&gt;LR’LRLRL’R’L’RLR’LRL’R’L’RLRL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,19,13)(4,20,14)(5,18,12)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’LRL’RLRLRLR’LRL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,5,11)(1,3,9)(2,4,10)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’L’RL’R’LR’L’R’L’RL’R’LR’LRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,8,13)(4,6,14)(5,7,12)&lt;/td&gt;
      &lt;td&gt;LR’LRL’RL’R’LR’LRLR’LRL’RL’RL’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,6,21)(4,7,22)(5,8,23)&lt;/td&gt;
      &lt;td&gt;LR’LRL’RL’R’L’RL’RLRLR’LRLR’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;triangle-triangle-pure-corner-orientation-algorithms&quot;&gt;Triangle triangle pure corner orientation algorithms&lt;/h3&gt;

&lt;p&gt;(see data model above for starting position and label meanings)&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Effect&lt;/th&gt;
      &lt;th&gt;Alg&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,14,13)(21,22,23)&lt;/td&gt;
      &lt;td&gt;LRLR’L’R’LRLR’L’R’LRLR’L’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,7,8)(15,17,16)&lt;/td&gt;
      &lt;td&gt;L’R’L’RLRL’R’L’RLRL’R’L’RLR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(12,13,14)(21,23,22)&lt;/td&gt;
      &lt;td&gt;RLRL’R’L’RLRL’R’L’RLRL’R’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(6,8,7)(15,16,17)&lt;/td&gt;
      &lt;td&gt;R’L’R’LRLR’L’R’LRLR’L’R’LRL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,11,10)(18,19,20)&lt;/td&gt;
      &lt;td&gt;LR’LRLR’L’R’LRLR’L’R’LRLR’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(9,10,11)(18,20,19)&lt;/td&gt;
      &lt;td&gt;L’RL’R’L’RLRL’R’L’RLRL’R’L’RL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,4,5)(9,11,10)&lt;/td&gt;
      &lt;td&gt;LRL’R’LR’L’R’L’RLRL’R’L’RLRLR’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,2,1)(18,19,20)&lt;/td&gt;
      &lt;td&gt;LR’L’R’L’RLRL’R’L’RLRLR’LRL’R’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,4,5)(18,20,19)&lt;/td&gt;
      &lt;td&gt;L’RLRLR’L’R’LRLR’L’R’L’RL’R’LR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,2,1)(9,10,11)&lt;/td&gt;
      &lt;td&gt;L’R’LRL’RLRLR’L’R’LRLR’L’R’L’R&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,1,2)(18,20,19)&lt;/td&gt;
      &lt;td&gt;RLR’L’RL’R’L’R’LRLR’L’R’LRLRL’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,5,4)(9,10,11)&lt;/td&gt;
      &lt;td&gt;RL’R’L’R’LRLR’L’R’LRLRL’RLR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(0,1,2)(9,11,10)&lt;/td&gt;
      &lt;td&gt;R’LRLRL’R’L’RLRL’R’L’R’LR’L’RL&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,5,4)(18,19,20)&lt;/td&gt;
      &lt;td&gt;R’L’RLR’LRLRL’R’L’RLRL’R’L’R’L&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,5,4)(21,22,23)&lt;/td&gt;
      &lt;td&gt;LRLRLRL’R’L’RLRL’R’L’RLRL’R’LR’L’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;(3,4,5)(21,23,22)&lt;/td&gt;
      &lt;td&gt;LRL’RLR’L’R’LRLR’L’R’LRLR’L’R’L’R’L’&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
        <pubDate>Sun, 23 May 2021 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/bermuda-cubes/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/bermuda-cubes/</guid>
      </item>
    
      <item>
        <title>Meet in the Middle Graph Search</title>
        <description>&lt;h1 id=&quot;background&quot;&gt;Background&lt;/h1&gt;

&lt;p&gt;I’ve been working on a puzzle game for Android called &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joshmermelstein.loopingdice&quot;&gt;Looping
Dice&lt;/a&gt;.
It’s all about sliding squares around a grid try to match a pattern while using
the fewest number of moves.&lt;/p&gt;

&lt;p&gt;As part of creating levels for the game - I wanted to create a solver. This was
useful for double checking that levels were solvable and also for setting the
threshold where I give the use three stars on each level.&lt;/p&gt;

&lt;h1 id=&quot;breadth-first-search&quot;&gt;Breadth First Search&lt;/h1&gt;

&lt;p&gt;My first idea was to model this problem as a graph search. We treat each state
that the puzzle can be in as a node - and think of each valid move as an edge.
Then, given a start and end state, we can implement breadth first search as
follow:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;create an empty queue of puzzle states for things we need to explore
create an empty set of puzzle states so we know what we&apos;ve explored already
insert the initial state into both the queue and the set
while (the queue is not empty){
   compute neighbors of the state at the front of the queue
   check if any of the neighbors are the goal state
   add each neighbor to the set of seen states
   if any neighbors are new to us, also add them to the queue to explore later
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I think people who read my blog are probably familiar with BFS but let’s take a
second to review why this works. Using the queue to order which nodes get
explored means that this algorithm explores all nodes at distance N from the
start before it visits any nodes of distance N+1. This also means that the first
time we encounter the goal node - we are guaranteed to have done so by a
shortest path.&lt;/p&gt;

&lt;p&gt;The downside here is very similar to the upside - we always visit all nodes
distance N from the state before we visit any at distance N+1. When the distance
from the start to the end is large and when the branching factor from each node
is large - this can be a huge number of nodes to explore before we find the
goal.&lt;/p&gt;

&lt;p&gt;The puzzle that motivated me to consider a better approach had 16 neighbors from
each state and had an optimal solve length of 8 moves. It took my unoptimized
BFS solver around 90 seconds to solve.&lt;/p&gt;

&lt;h1 id=&quot;the-idea-of-meet-in-the-middle-search&quot;&gt;The idea of Meet in the Middle search&lt;/h1&gt;

&lt;p&gt;When humans try to solve puzzles like mine or like a &lt;a href=&quot;https://en.wikipedia.org/wiki/15_puzzle&quot;&gt;15
puzzle&lt;/a&gt;, we use heuristics to get
closer to the goal, even if we don’t have a complete plan for how to finish the
solve. To phrase it differently - we have an idea of what states might be near
the end, and instead of aiming for the end directly, we aim for that cloud of
nearby states.&lt;/p&gt;

&lt;p&gt;I decided implement this using an approach I’d heard of but never seen in use
called “Meet in the Middle” (MITM). I would start exploring from both the start
and the end, and declare victory when either side found a state that the other
one had previously found. Much like the BFS above, the first time these
flood-fill searches encounter each other ought to be a shortest path, since both
are exploring length N paths before starting on length N+1 paths.&lt;/p&gt;

&lt;h1 id=&quot;first-implementation&quot;&gt;First Implementation&lt;/h1&gt;

&lt;p&gt;Skipping over some details again, the main part of my algorithm looked like
this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;create two queues of states to explore
create two a set for states seen by the forward exploration and another for backward
while (either queue is nonempty) {
  explore the state at the front of the forward queue as in BFS
  when you look at new nodes, also check if they are in the set of states seen by the backward exploration

  explore the state at the front of the backward queue as in BFS
  when you look at new nodes, also check if they are in the set of states seen by the forward exploration
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I tried this new approach on the puzzle above and was shocked to see that it
took 0.01 seconds to find an 8 move solution. This was different from the one
found by the BFS implementation but it was also correct. I added some logging to
both implementations to see how many states each one explored before it arrived
at a solution. The BFS approach’s set saw 414764 distinct states before it
arrived at the goal. In contrast the two sets used in the MITM approach had seen
2934 distinct states and 3069 distinct states before they found a shared state.
No wonder it was so much faster!&lt;/p&gt;

&lt;h2 id=&quot;discovering-a-bug&quot;&gt;Discovering a bug&lt;/h2&gt;

&lt;p&gt;While making some levels, I found a case where the solver claimed the shortest
solution was in 6 moves - but I’d already found a 5 move solution on my own.
What was going on?&lt;/p&gt;

&lt;p&gt;Recall that in BFS, we guarantee that the first path we find is the shortest by
showing that “if there was a shorter path, we would have found it earlier”.&lt;/p&gt;

&lt;p&gt;Also note that in MITM, when the forward and backward explorations find their
first shared state, it is necessarily on the “frontier” of the both of their
BFS’s. By the same logic as above - if it wasn’t then we would have found it
earlier.&lt;/p&gt;

&lt;p&gt;Finally, consider this reframing of MITM: each time we discover a new node
(let’s say distance N), and we compare it to a node on the other BFS’s
“frontier” (let’s say distance M), we’re effectively checking if a particular
solution of length N+M is valid. If the two nodes are equal, the solution is
valid, and if they are different, then the solution doesn’t work. (In practice,
this comparison is set-containment so it’s O(1) to compare against the whole
frontier but it’s useful to imagine that we’re comparing new nodes against
existing ones one-by-one.)&lt;/p&gt;

&lt;p&gt;So in this bug, both forward and backward search had finished with all distance 2
nodes and were both starting to discover new nodes at distance 3 from the
start/end. Each time one of these nodes was discovered, it was checked against
the “frontier” of the other BFS.&lt;/p&gt;

&lt;p&gt;Each comparison was checking for the existence of some length 5 solutions
(self-length of 3, other-length of 2) and length 6 solutions (self-length and
other-length both 3). That’s bad because it means we are looking at some length
6 candidate solutions before we’ve considered all length 5 solutions. This
throws away the shortest-path guarantee of BFS!&lt;/p&gt;

&lt;p&gt;This doesn’t happen for all searches but that’s exactly what happened in this
case. Because of the arbitrary order that nodes are discovered, a length 6
solution showed up before we had the chance to see all length 5 candidates and
note that one is correct.&lt;/p&gt;

&lt;h1 id=&quot;second-implementation&quot;&gt;Second Implementation&lt;/h1&gt;

&lt;p&gt;Once I understood the bug, the fix wasn’t conceptually hard. I had to keep the
“frontier” of each BFS at a constant distance while I discovered nodes in the
other one. After the refactor, the code was structured like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;create two queues of states to explore
create two a set for states seen by the forward exploration and another for backward
target_depth = 1
while (either queue is nonempty) {
  explore forward as in BFS until you&apos;ve seen all nodes distance target_depth from the start
  when you look at new nodes, also check if they are in the set of states seen by the backward exploration

  explore backward as in BFS until you&apos;ve seen all nodes distance target_depth from the end
  when you look at new nodes, also check if they are in the set of states seen by the forward exploration

  increment target_length
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;future-work&quot;&gt;Future Work&lt;/h1&gt;

&lt;p&gt;In my last implementation, I always alternate between forward and backward
exploration. I suspect there might be some slight efficiency gains by using some
heuristic (queue-length?) to decide which one to explore on each cycle of the
outer loop. Doing so without benchmarks felt like premature optimization and at
this point, the solver is fast enough that I don’t think I care. Maybe at some
point I’ll need it to be even faster than it is today and look into that among
other optimization ideas.&lt;/p&gt;

&lt;h1 id=&quot;closing-thoughts&quot;&gt;Closing Thoughts&lt;/h1&gt;

&lt;p&gt;I ran my revised solver against all the levels I’d made so far (around 100) and
found only a single case where it did better than the non-optimal solver. It’s quite
lucky that I stumbled into a case where the previous MITM solver had a
non-optimal solution.&lt;/p&gt;
</description>
        <pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/meet-in-the-middle-graph-search/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/meet-in-the-middle-graph-search/</guid>
      </item>
    
      <item>
        <title>Magnetic Hinge Arrangement</title>
        <description>&lt;h1 id=&quot;background&quot;&gt;Background&lt;/h1&gt;

&lt;p&gt;Yesterday, Oskar van Deventer posted a
&lt;a href=&quot;https://www.youtube.com/watch?v=RRocl7F-cnU&quot;&gt;video&lt;/a&gt; of a new puzzle he’d
developed. If you watch the video, you’ll see three cubes where each one has
magnetic protrusions along each edge. The protrusions on each cube are arranged
so that when any pair of cubes are connected edge-to-edge, they form a magnetic
hinge.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/magnet-hinges/123_to_abc.jpg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Oskar’s puzzle has three cubes, but I was curious what arrangements one might
use if designing this puzzle with an arbitrary number of cubes. This boils down
to the question: Arrange the numbers 1-N into a sequence with duplicates allowed
such that every pair of numbers is adjacent somewhere in the sequence.&lt;/p&gt;

&lt;h1 id=&quot;analysis&quot;&gt;Analysis&lt;/h1&gt;

&lt;p&gt;We can put some upper and lower bounds on the length of a minimal sequence as
follows:&lt;/p&gt;

&lt;p&gt;Upper bound: given N objects, there are C(N,2) = N*(N-1)/2 pairs that need to
be accounted for. One sequence that satisfies our question is “all pairs printed
one after another”. For example, when n=4, our sequence might be 121314232434.
This sequence has length N*(N-1).&lt;/p&gt;

&lt;p&gt;Lower bound: Given N objects, there are C(N,2) pairs that need to be accounted
for. Each element we add to the sequence creates one new pair. Therefore, a
sequence containing C(N,2) pairs must be at least 1+C(N,2) elements long.&lt;/p&gt;

&lt;p&gt;When N is even, I believe the lower bound cannot be achieved. This is because
most elements don’t appear at either end of the sequence so they have an even
number of neighbors. But when N is even, an odd number of those are mandatory
and one is extra. I believe the sum of these “extra” neighbors makes it
impossible to get to the lower bound sequence length.&lt;/p&gt;

&lt;h1 id=&quot;embracing-randomness&quot;&gt;Embracing Randomness&lt;/h1&gt;

&lt;p&gt;Rather than try to be clever with constructing these sequences, I decided to do
a whole lot of guess, test, and revise. I wrote a bit of C++ to do so:&lt;/p&gt;

&lt;p&gt;The first one generates sequences made up of |symbols| different values and of
length |len|.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;std::vector&amp;lt;int&amp;gt; make_candidate(int symbols, int len) {
  std::vector&amp;lt;int&amp;gt; ret(len, 0);
  for (int i = 0; i &amp;lt; len; ++i) {
    ret[i] = rand() % symbols;
  }
  return ret;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The next one checks if a sequence satisfies our condition. It stores each pair
in an unordered set by hashing it. Then it checks if enough pairs have been
found by comparing against a global constexpr that was computed based on the
number of symbols being used (also constexpr).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bool check_candidate (const std::vector&amp;lt;int&amp;gt;&amp;amp; v) {
  std::unordered_set&amp;lt;int&amp;gt; seen;
  for (int i = 0; i &amp;lt; v.size() - 1; ++i) {
    if (v[i] != v[i+1]) {
      int low = std::min(v[i], v[i+1]);
      int high = std::max(v[i], v[i+1]);
      seen.insert(100*high + low);
    }
  }
  return seen.size() &amp;gt;= pairs;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;From there, I just ran trials continuously until I got results I liked. By
tweaking the lengths of the sequences I was generating, I could slowly hone in
on the optimal length.&lt;/p&gt;

&lt;p&gt;A nice feature of this approach is that nothing needs to be remembered from
trial to trial. This means the program uses very little memory and can be left
running as long as I am willing to wait.&lt;/p&gt;

&lt;p&gt;For small values of N, this worked quite well. But as N got to 7 or 8, valid
sequences became harder and harder to find. I decided to up the length of
sequence I was checking to increase the chances of finding valid sequences but
add some postprocessing to try to get results that were as good as possible.&lt;/p&gt;

&lt;h1 id=&quot;optimizing-random-output&quot;&gt;Optimizing Random Output&lt;/h1&gt;

&lt;p&gt;I came up with two simple ways to shorten a valid sequence.&lt;/p&gt;

&lt;p&gt;The first was to filter out letters that were adjacent to themselves. This
doesn’t effect correctness so it’s always OK to to do.&lt;/p&gt;

&lt;p&gt;The second was to test the sequences with the first/last elements removed. In a
lot of cases, the first pair would also appear elsewhere in the sequence so
removing the first element was fine. Likewise with the last pair and the last
element.&lt;/p&gt;

&lt;h1 id=&quot;results&quot;&gt;Results&lt;/h1&gt;

&lt;p&gt;By combining these techniques and doing a lot of trials, I came up with the
following results:&lt;/p&gt;

&lt;p&gt;4: 12324314&lt;/p&gt;

&lt;p&gt;5: 12342541531 (hits lower bound)&lt;/p&gt;

&lt;p&gt;6: 123453463142615256&lt;/p&gt;

&lt;p&gt;7: 1234537257182413847851 (hits lower bound)&lt;/p&gt;

&lt;p&gt;8: 12342562754783581641748673158263&lt;/p&gt;

&lt;p&gt;9: 1234354256768419467461829351372586289638715975&lt;/p&gt;

&lt;h1 id=&quot;wrap-up&quot;&gt;Wrap Up&lt;/h1&gt;

&lt;p&gt;Having done all this, I plugged my results into OEIS, and found &lt;a href=&quot;https://oeis.org/A053439&quot;&gt;this
sequence&lt;/a&gt; whose description is the same as my problem
except it cares only about the length of the sequence and not about its
construction. The programs there to calculate it suggest some sort of counting
argument that could maybe be converted into a construction but I’m not sure
there’s enough detail for me to do so.&lt;/p&gt;
</description>
        <pubDate>Sun, 28 Feb 2021 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/magnetic-hinge-arrangement/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/magnetic-hinge-arrangement/</guid>
      </item>
    
      <item>
        <title>Using Bandaged Cube Explorer to solve 0x20108000000C03</title>
        <description>&lt;h1 id=&quot;background&quot;&gt;Background&lt;/h1&gt;

&lt;p&gt;In my &lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer-post/&quot;&gt;previous post&lt;/a&gt;,
I introduced a tool for exploring the shape space of bandaged 3x3x3 Rubik’s
cubes and suggested that it might be useful for solvers. In this post, I’m going
to walk through how I how I used it to solve one bandaged configuration,
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer/?id=0x20108000000C03&quot;&gt;0x20108000000C03&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I decided to name this puzzle “cofortress” since its shape graph has the same
structure as the one for Bandaged Fortress (a.k.a.
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer/?id=0x30000010048883&quot;&gt;0x30000010048883&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/cofortress/photo.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/cofortress/unfolded.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;analyzing-the-cube&quot;&gt;Analyzing the cube&lt;/h1&gt;

&lt;p&gt;For consistent naming, I assume that the cube is always oriented with white on
the U face and green on the F face.&lt;/p&gt;

&lt;p&gt;Cofortress has a small state space, just 42 nodes and 60 edges arranged in one
big loop. As you walk around the loop, there is a repeated pattern - “half turn,
half turn, quarter turn (solver picks direction)”. This suggests that our
sequences will have one of two forms:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Go around the loop&lt;/li&gt;
  &lt;li&gt;Go partially around the loop, until you hit a quarter turn. Do that quarter
turn twice to swap some pieces, then undo the path around the loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are arguably others where we take a more complex back-and-forth path
around the loop but all of these can be written as combinations of the above so
I don’t really consider them.&lt;/p&gt;

&lt;p&gt;If we look closely at the states where a quarter turn is possible, we notice
that they always happen on a face with with two 1x1x3 blocks and two regular
edges. This means our second type of sequence should always swap two edges and
swap the 1x1x3 blocks.&lt;/p&gt;

&lt;p&gt;By the same reasoning, following the whole loop will have the same effect on the
other bandaged blocks and the unbandaged corners no matter which direction we
choose to take our quarter turns. It happens to be the case that this effect is
nothing; so when cofortress is solved by shape, our 1x1x2 blocks and unbandaged
corners are always solved by color.&lt;/p&gt;

&lt;p&gt;What is left for us to solve are the 9 pieces on cofortress that can move around
when the puzzle is solved by shape:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The two 1x1x3 blocks can swap with each other&lt;/li&gt;
  &lt;li&gt;The {UF, UL, BL, FL, FR, DL, DR} edges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But wait - when cofortress is solved by shape, a D2 move swaps the 1x1x3 blocks.
So now we’re down to two remaining challenges; getting to the solved shape, and
finding ways to move unbandaged edges around in the solved shape.&lt;/p&gt;

&lt;h1 id=&quot;solving-the-shape-and-scrambling-the-puzzle&quot;&gt;Solving the shape (and scrambling the puzzle)&lt;/h1&gt;

&lt;p&gt;This might sound surpassing if you’ve never held a bandaged puzzle but
scrambling them can be a challenge in its own right. On cofortress, the turns
out to be almost the same challenge as solving the shape.&lt;/p&gt;

&lt;p&gt;Looking closely at our shape graph, each state has either one or two faces that
can turn. That means that we can walk the loop (without needing to see it) by
always turning a different face than the one we turned previously. Even better,
we use the “half turn, half turn, quarter turn” pattern to guide us. The first
half turn will always effect just one of the 1x1x3 blocks. The second half turn
will effect the other, then the quarter turn will be on the face that now
contains both of them.&lt;/p&gt;

&lt;p&gt;I case you’d like something a big less handwavey, here’s a sequence to follow
for scrambling cofortress:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;B2 U2 F*
L2 B2 R*
D2 R2 D*
B2 D2 B*
R2 F2 L*
U2 R2 D*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Where * means either a clockwise or counterclockwise quarter turn. I’ve found
that even one repeat of this sequence is a decent scramble but feel free to go
through it a few times.&lt;/p&gt;

&lt;p&gt;When it comes to returning cofortress to its solved shape, the procedure is
similar to the scramble. Put both 1x1x3 blocks on the same face, then follow the
“half turn, half turn, quarter turn” sequence until both are solved relative to
the centers.&lt;/p&gt;

&lt;h1 id=&quot;edge-orientation&quot;&gt;Edge Orientation&lt;/h1&gt;

&lt;p&gt;People who haven’t spent much time with a Rubik’s cube sometimes think that it
is a puzzle about manipulating 54 independent stickers. In fact, that puzzle is
made of a core, eight corners and twelve edges. Ignoring the core for a moment,
the corners and edges both have a position and an orientation on the cube. Its
possible to put all pieces in the correct position, but have some 3-sticker
corners twisted or some 2-sticker edges flipped in place.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/cofortress/flipped.jpg&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On cofortress, the constraints imposed by the bandaging mean that when we are in
solved shape, or corners are always oriented correctly. In the first draft of
this solution, that made me overlook the fact cofortress can still have flipped
edges. Rather than walk you through my faulty thinking, let’s discuss what it
means for an edge to be oriented and then skip ahead to when I corrected myself.&lt;/p&gt;

&lt;p&gt;Speedcubing methods provide a nice definition for edge orientation. We consider
an edge oriented if it can be put into place (on an unbandaged Rubik’s cube)
without using the F and B turns (or the slice turns). If you don’t have a lot of
experience solving a Rubik’s cube, the speedcubing definition can be hard to
visualize so here’s a equivalent procedure that spells things out more
explicitly.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  # Assume the cube is oriented with white on top and green in front
  # If using a different color scheme or orientation, relabel colors accordingly
  if edge is on the U or D face:
    let C1 be the color of the sticker on the U/D face
    let C2 be the color of the other sticker on that edge
  else:
    let C1 be the color of the sticker on the F/B face
    let C2 be the color of the other sticker on that edge

  if C1 is white or yellow:
    the edge is oriented correctly
  if C1 is orange or red:
    the edge is flipped
  if (C1 is green or blue) and (C2 is red or orange):
    the edge is oriented correctly
  if (C1 is green or blue) and (C2 is white or yellow):
    the edge is flipped
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Edge orientation is a broadly useful concept for all kinds of solvers.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;a href=&quot;https://www.speedsolving.com/wiki/index.php/ZZ_method&quot;&gt;ZZ method&lt;/a&gt;
starts solve by  orienting all edges - then takes advantage of this invariant
in later steps.&lt;/li&gt;
  &lt;li&gt;Competitors in the &lt;a href=&quot;https://www.speedsolving.com/wiki/index.php/Fewest_Moves_Challenge&quot;&gt;Fewest Moves Challenge&lt;/a&gt;
event in the World Cubing Association have a number of techniques for finding
efficient solutions to a scramble. One popular technique is
&lt;a href=&quot;https://www.speedsolving.com/wiki/index.php/Domino_Reduction&quot;&gt;Domino Reduction&lt;/a&gt;,
which uses edge orientation for a similar reason - this invariant can be taken
advantage of later in the solve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the case of our bandaged puzzle, we care about edge orientation because we
have a lot less flexibility with edge orientation than with edge permutation so
our plan is to orient all edges before permuting them.&lt;/p&gt;

&lt;h1 id=&quot;moving-edge-around&quot;&gt;Moving Edge Around&lt;/h1&gt;

&lt;p&gt;With our analysis out of the way, let’s start to look at some concrete sequences
on cofortress. We’ll begin with those of the second type mentioned above,
conjugates setting up to a half turn. We know that these will swap the two 1x1x3
blocks and two unbandaged edges so let’s apply them to a cube and see which
edges are swapped. To keep these compact, I’m using the twisty puzzles shorthand
for conjugates, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[A : B] = A B A^-1&lt;/code&gt; where A and B are arbitrary sequences.&lt;/p&gt;

&lt;p&gt;Here are 9 sequences that swap the two 1x1x3 blocks and also swap a pair of
edges without modifying their orientation.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;id&lt;/th&gt;
    &lt;th&gt;sequence&lt;/th&gt;
    &lt;th&gt;edges swapped&lt;/th&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 1&lt;/td&gt;
    &lt;td&gt;D2&lt;/td&gt;
    &lt;td&gt;DL, DR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 2&lt;/td&gt;
    &lt;td&gt;[B2 U2 : F2]&lt;/td&gt;
    &lt;td&gt;FL, FR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 3&lt;/td&gt;
    &lt;td&gt;[D R2 U2 : L2]&lt;/td&gt;
    &lt;td&gt;FL, BL&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 4&lt;/td&gt;
    &lt;td&gt;[B2 U2 F L2 B2 : R2]&lt;/td&gt;
    &lt;td&gt;UL, DR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 5&lt;/td&gt;
    &lt;td&gt;[D R2 U2 L F2 R2: B2]&lt;/td&gt;
    &lt;td&gt;UF, DR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 6&lt;/td&gt;
    &lt;td&gt;[D R2 U2 L F2 R2 B D2 B2 : D2]&lt;/td&gt;
    &lt;td&gt;UL, FL&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 7&lt;/td&gt;
    &lt;td&gt;[D R2 U2 L&apos; F2 R2 B D2 B2 : D2]&lt;/td&gt;
    &lt;td&gt;UL, BL&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 8&lt;/td&gt;
    &lt;td&gt;[D R2 U2 L F2 R2 B D2 B2 D R2 D2 R B2 L2: F2]&lt;/td&gt;
    &lt;td&gt;FL, DR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;perm 9&lt;/td&gt;
    &lt;td&gt;[D R2 U2 L F2 R2 B D2 B2 D&apos; R2 D2 R B2 L2: F2]&lt;/td&gt;
    &lt;td&gt;UL, DL&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Next we have 3 sequences that swap the two 1x1x3 blocks and also swap a pair of
edges and also modify the orientation of both swapped edges.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;id&lt;/th&gt;
    &lt;th&gt;sequence&lt;/th&gt;
    &lt;th&gt;edges swapped&lt;/th&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;
    &lt;td&gt;flip 1&lt;/td&gt;
    &lt;td&gt;[B2 U2 F L2 B2 R D2 R2 : D2]&lt;/td&gt;
    &lt;td&gt;UF, FR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;flip 2&lt;/td&gt;
    &lt;td&gt;[B2 U2 F&apos; L2 B2 R D2 R2 : D2]&lt;/td&gt;
    &lt;td&gt;UF, FL&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;flip 3&lt;/td&gt;
    &lt;td&gt;[D R2 U2 L&apos; F2 R2 B D2 B2 D R2 D2 R B2 L2: F2]&lt;/td&gt;
    &lt;td&gt;DL, BL&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;And now let’s talk about sequences of the first type, where we make a circuit
around almost the whole shape space of cofortress. I found these did a lot more
than the type-2 algorithms above so they weren’t as useful for moving just a few
edges. Some of them were nice for flipping more than two edges at a time, but
this is an optional optimization.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;id&lt;/th&gt;
    &lt;th&gt;sequence&lt;/th&gt;
    &lt;th&gt;edge slots flipped&lt;/th&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
  &lt;tr&gt;
    &lt;td&gt;circuit 1&lt;/td&gt;
    &lt;td&gt;D R2 U2 L F2 R2 B D2 B2 D R2 D2 R B2 L2 F U2 B2&lt;/td&gt;
    &lt;td&gt;UF, FL, DL, DR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;circuit 2&lt;/td&gt;
    &lt;td&gt;D R2 U2 L&apos; F2 R2 B&apos; D2 B2 D R2 D2 R B2 L2 F U2 B2&lt;/td&gt;
    &lt;td&gt;UF, BL, DL, DR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;circuit 3&lt;/td&gt;
    &lt;td&gt;D R2 U2 L F2 R2 B D2 B2 D&apos; R2 D2 R B2 L2 F U2 B2&lt;/td&gt;
    &lt;td&gt;UF, UL, DL, DR&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Careful readers might have noticed that some of these sequences differ only by
the direction of a quarter turn (i.e. perm 6 vs perm 7). But there are some
variations of these algorithms that aren’t listed above. The sequences that I
omitted are because they have the same effect as a sequence in the table. For
example, replacing the D in sequence 3 with a D’ doesn’t change which pieces are
swapped so including it would be redundant.&lt;/p&gt;

&lt;h1 id=&quot;using-the-sequences&quot;&gt;Using the Sequences&lt;/h1&gt;

&lt;p&gt;Like with edge flipping, our options for which slots can be swapped are somewhat
limited. Some slots are easier to use than others. In particular, the UF slot is
annoying to insert into but is critical for all flipping sequences. Here is a
visualization of which slots can swap with which others without changing edge
orientation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/cofortress/edge_swaps.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So to bring it all together, we use the visualization and perm sequences above
to set up flipped edges into positions where they are easy to orient correctly.
We use the flip and cycle sequences to orient them. Finally we use the
visualization and tables again to move the edges back to their solved slots.&lt;/p&gt;

&lt;p&gt;It’s worth noting that all our perm algorithms are conjugates so their ends are
the inverse of their beginnings. This means they can cancel quite a few moves
when doing one after another. For example, consider perm 5 followed by perm 3:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[D R2 U2 L F2 R2: B2] [D R2 U2 : L2]
(D R2 U2 L F2 R2 B2 R2 F2 L&apos; U2 R2 D&apos;) (D R2 U2 L2 U2 R D&apos;)
D R2 U2 L F2 R2 B2 R2 F2 (L&apos; U2 R2 D&apos; D R2 U2 L2) U2 R D&apos;
D R2 U2 L F2 R2 B2 R2 F2 L U2 R D&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is exactly the same as perm 5 except with the last L’ replace by an L. So
if you know the next several sequences you are going to do, you can optionally
save moves and time by predicting which moves will cancel and omitting them.&lt;/p&gt;

&lt;h1 id=&quot;final-thoughts-on-cofortress&quot;&gt;Final Thoughts on Cofortress&lt;/h1&gt;

&lt;p&gt;I quite enjoyed solving cofortress. Now that I have my method and notes
organized, it only takes a few minutes to scramble and solve it. I really like
how different the solve feels from an unbandaged 3x3x3.&lt;/p&gt;

&lt;p&gt;I’m also happy with how my bandaged-cube-explorer tool guided my solve. It
certainly would have been possible without the tool but I think it would’ve
added a lot of toil with adding much enjoyment.&lt;/p&gt;

&lt;h1 id=&quot;bandaged-fortress&quot;&gt;Bandaged Fortress&lt;/h1&gt;

&lt;p&gt;A small update - since writing this post I spent an evening analyzing and
solving bandaged fortress. As expected, the solve feels very similar to
cofortress. My solve’s outline looks the same - follow “half turn, half turn,
quarter turn” until the puzzle is solved by shape, orient all edges, then
permute all edges.&lt;/p&gt;

&lt;p&gt;When I feel like coming back to this sort of bandaged puzzle, I think I may try
one of
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x20100000000C03&quot;&gt;0x20100000000C03&lt;/a&gt;
or
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x30000000040203&quot;&gt;0x30000000040203&lt;/a&gt;
next. The first one severs one of the bonds in cofortress resulting in a graph with a
second loop. The latter one takes it a step further and moves a block to allow
for 4x as many states as cofortress, arranged into 4 connected loops.&lt;/p&gt;

&lt;style&gt;
  table {
        display: block;
        width: 100%;
        overflow: auto;
        margin-top: 10px;
        margin-bottom: 20px;
  }

  table th {
        font-weight: bold;
  }

  table th,
  table td {
        padding: 6px 13px;
        border: 1px solid #ddd;
  }

  table tr {
        background-color: #fff;
        border-top: 1px solid #ccc;
  }

  table tr:nth-child(2n) {
        background-color: #f8f8f8;
  }
&lt;/style&gt;

</description>
        <pubDate>Sun, 20 Dec 2020 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/solving-cofortress/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/solving-cofortress/</guid>
      </item>
    
      <item>
        <title>Bandaged Cube Explorer</title>
        <description>&lt;p&gt;tl;dr, I made a program for exploring bandaged configurations of the 3x3x3
Rubik’s cube. You can play with it
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer&quot;&gt;here&lt;/a&gt;. If you are
interested in the source code, it’s available on 
&lt;a href=&quot;https://github.com/JoshMermel/bandaged-cube-explorer/tree/gh-pages&quot;&gt;my github&lt;/a&gt;.
Read on to learn about what it does and how it works or skip to the bottom for
some links to nice examples.&lt;/p&gt;

&lt;h1 id=&quot;bandaged-cubes&quot;&gt;Bandaged Cubes&lt;/h1&gt;

&lt;p&gt;I recently came across &lt;a href=&quot;https://www.youtube.com/watch?v=7ke6momBndU&quot;&gt;this video&lt;/a&gt;
about how to think about bandaged twisty puzzles. The video is not long and does
a good job of introducing the premise of bandaging a puzzle so I’ll skip over
explaining that here.&lt;/p&gt;

&lt;p&gt;Before watching that video, I had been aware of the idea of bandaging and had
even tried solving a few bandaged puzzles, but something hadn’t clicked for me.
My experience was that simplest ones were too easy and didn’t present and new
challenges; but that harder ones were too difficult to even formulate an
approach. That video was exciting because the “loops in a graph” strategy seemed
like it could be applied to many other bandaged configurations.&lt;/p&gt;

&lt;p&gt;I was also delighted about the way the threefold symmetry of the puzzle got
reflected into threefold symmetry in the graph. When I first tried to get into
bandaged puzzles, I found a few docs online containing collections of named
configurations like &lt;a href=&quot;https://docs.google.com/document/d/1Iuk8NSOQ_fd7lXQMFlCw_0YYhef8GEJBn5y2GZCPtRE/edit&quot;&gt;this
doc&lt;/a&gt;,
and &lt;a href=&quot;https://docs.google.com/document/d/15XcIy1BNbSbQ0lZ8vRIP9iYDao2pQD5Kmxhc_lv2H2s/edit&quot;&gt;this other
doc&lt;/a&gt;.
What they both lacked was guidance on what kind of experience to expect when
solving each puzzle. The threefold symmetry of the puzzle and the graph gave me
hope that a bandaged puzzle’s state graph might give a hint to what kind of
solve to expect.&lt;/p&gt;

&lt;h1 id=&quot;playing-with-d3js&quot;&gt;Playing with d3.js&lt;/h1&gt;

&lt;p&gt;Pretty early in my design process, I came across a &lt;a href=&quot;https://github.com/paulnasca/paul_cube_bandaged_graph&quot;&gt;github
project&lt;/a&gt; where someone
had already done exactly what I was imagining. Even better, the author included
a csv of all distinct bandaging schemes and some metadata about each one. There
were a few things I didn’t like about it though.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It required the user to run python - meaning it was inaccessible to many
potential users.&lt;/li&gt;
  &lt;li&gt;I couldn’t get the cube drawings to work for me.&lt;/li&gt;
  &lt;li&gt;Sometimes the graphs it generated were so tangled up that it was impossible
to see what was going on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I decided I would make my own version to address these points. First of all, my
version would be a webapp so it could be used from more platforms. And second,
my version would be interactive so the user could zoom and shift nodes around as
needed.&lt;/p&gt;

&lt;p&gt;The platform I chose was d3.js’s force directed layout. The idea is that each
node is given a slight negative charge and each edge is given a slight spring
force. The charge means that nodes spread out away from each other and the
spring force means that connected nodes stay near each other. For many graphs,
this sort of layout does a good job at both global and local layout. Best of
all, d3.js supports a huge amount of customization and a huge number of
features.&lt;/p&gt;

&lt;p&gt;I decided to avoid labels on nodes or edges because I was worried they would
make the graph unreadable as it grew. Instead I decided to color code my edges
according to which face was was turned and to indicate direction with an
arrowhead and to add mouseover previews for each node’s meaning. To deal with
the varied size of state graphs, I used d3’s standard panning and zooming
features. To deal with awkward graph layouts, I added interactive dragging so
the user could untangle graphs manually.&lt;/p&gt;

&lt;h1 id=&quot;drawing-self-edges&quot;&gt;Drawing self edges&lt;/h1&gt;

&lt;p&gt;One limitation I ran into with d3 was was drawing edges from nodes to
themselves. By default, this drew a line whose start and end points were the
same - a.k.a. nothing. I found a helpful answer on github how to turn these into
arcs from the point to one very nearby. This worked well, and as a side
benefit, I could modify my choice of nearby point to change the orientation of
the loop.&lt;/p&gt;

&lt;p&gt;One nice example of this is &lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0&quot;&gt;the graph for an unbandaged Rubik’s
cube&lt;/a&gt;. On this cube,
all 6 face loop back to the only state. As a solver, this sort of self edge is
quite useful so I was happy to be able to show all 6 so distinctly.&lt;/p&gt;

&lt;p&gt;On the way to finding that answer, I experimented with a different approach
where I added a not-drawn node in the middle of each edge and used it to make
edges curve. This turned out not to solve the self edge problem but I liked it
so it got to stay.&lt;/p&gt;

&lt;h1 id=&quot;reverse-engineering-the-spec&quot;&gt;Reverse Engineering the Spec&lt;/h1&gt;

&lt;p&gt;One problem I needed to solve before getting started was how users would
input bandaged cube IDs. I decided to use the scheme devised by Andreas Nortman
since it seemed to be the standard. The way it works is to define each bandaged
cube by the presence or absence of 54 “bonds”. Each bond is given an offset in a
54-bit integer, usually represented in hexadecimal.&lt;/p&gt;

&lt;p&gt;This representation is nice because it makes some operations very easy. For
example, in order to test if a face can be turned, you only need to check if any
of the 9 blocking bonds are present. Similarly, turning a face means doing a
permutation of bits representing the bonds on that face. There was just one
problem - I couldn’t find any documentation for which bonds corresponded to
which offsets.&lt;/p&gt;

&lt;p&gt;To make a long story short - I managed to reverse engineer the mapping by
looking at the code of the github project mentioned above. I still don’t see the
logic behind the mapping but I’m sure there is one. I made sure to document the
mapping as much as possible in my code and with a helper image in the my
project’s README.&lt;/p&gt;

&lt;p&gt;There are a few things I don’t like about this about scheme. The first is that
it is very unreadable for humans. This is probably unavoidable given that there
are hundreds of thousands of possible signatures but it is still a shame. The
second is that representations can be ambiguous. Imagine a cube where both the U
and F centers are bonded to the UF edge. This makes the U and F faces
permanently blocked - effectively bonding their centers to the core as well. I
user might reasonable choose to write those core bonds or omit them. I think the
csv on paul_cube_bandaged_graph has the right idea - it always always explicitly
write the implied bonds. In the future, it might be nice to have a tool to
“canonicalize” signatures so that it would be easy to tell when two people are
talking about the same bandaged cube.&lt;/p&gt;

&lt;h1 id=&quot;drawing-the-cubes&quot;&gt;Drawing the cubes&lt;/h1&gt;

&lt;p&gt;The first thing I built was a way to preview what a given bandaged configuration
looks like. Initially I wanted to draw this to the same svg as my nodes and
edges but that turns out to be a problem once I added zooming. Rather than learn
more about svg scaling in d3, I took a shortcut and put the preview on a second
svg that is layered behind the main one. The one drawback is that a very busy
graph will now obscure the legend a bit. I didn’t see that as a big problem
since the user can just zoom out to create more whitespace.&lt;/p&gt;

&lt;h1 id=&quot;bit-manipulation-in-javascript&quot;&gt;Bit manipulation in javascript&lt;/h1&gt;

&lt;p&gt;As I mentioned above, the data format makes it pretty easy to check which faces
can be turned and to compute the result of a turn using bit manipulation. The
default number type in javascript aren’t integers so you can’t do bitwise math.
Luckily, js now has a BigInt type which works approximately how I want. It
supports common bitwise operations but it doesn’t guarantee O(1) for all them.
It also doesn’t lend itself well to tools like &lt;a href=&quot;http://programming.sirrida.de/bit_perm.html#calculator&quot;&gt;my favorite tool for optimized
bit swizzling&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I decided to do the responsible thing and ignore performance until it was
problem. Even on the largest graphs, computing all necessary turns only takes a
few seconds so I haven’t gone back to optimize this.&lt;/p&gt;

&lt;h1 id=&quot;building-graphs-from-user-input&quot;&gt;Building graphs from user input&lt;/h1&gt;

&lt;p&gt;Once I had all the groundwork in place, this part turned out quite easy. I do a
breadth first search of the graph and keep track of all the nodes and edges that
exist. When recording edges, I note which turn caused them to exist so I know
which color to draw them.&lt;/p&gt;

&lt;p&gt;In an earlier version, I planned to dedupe nodes that could be turned into each
other by cube rotations or mirroring. My idea was that this could shrink the
size of problematically large graphs. In the end I decided not to do this
because rotations like this usually aren’t useful as a solver.&lt;/p&gt;

&lt;h1 id=&quot;future-work&quot;&gt;Future work&lt;/h1&gt;

&lt;p&gt;I’m relatively happy with this project. It does exactly what I set out to do,
and the graphs are pretty satisfying to play with. If I ever come back to this,
I have a few ideas I might implement to improve it further.&lt;/p&gt;

&lt;p&gt;When zooming out, nodes become quite small and hard to click. It would be fun to
size nodes based on the size of the graph so things continue to look good after
zooming. To do this, I need to make sure my arrowheads don’t sink into the nodes
that point at. My arrowhead code was copied from a stackoverflow answer so I’ll
need to understand it to modify it.&lt;/p&gt;

&lt;p&gt;Many graphs contain states that there’s no reason to visit. For an example,
let’s take a look at the graph for &lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0xE0400B43FC5A1&quot;&gt;the
cube&lt;/a&gt; in
the youtube video from the top of this post. The graph has some chains for
4-cycles that look almost like lace:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-explorer/lace.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The reason for these 4-cycles is that turning a face four times returns it to its
initial position. In the screenshot above, a solver progressing along that arc
can either do one turn of the green face clockwise, or (equivalently) three
turns counterclockwise. The states reached along the three counterclockwise
turns are useless as a solver. There are also some features of the graph that
looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bandaged-cube-explorer/cycle.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This 4-cycle represents a face that can be turned in one position, but such that
turning that face block all other moves until the face is returned to its
starting position. Once the cube has been returned to its original bandaged
signature, there is no reason to visit these states.&lt;/p&gt;

&lt;p&gt;I think it would be interesting to add a mode where extraneous nodes like these
are removed. Doing this efficiently would be nontrivial but it might make some
larger graphs lag less and be easier for a human to understand.&lt;/p&gt;

&lt;h1 id=&quot;nice-examples&quot;&gt;Nice examples&lt;/h1&gt;

&lt;p&gt;In the process of writing this post, I’ve looked at a few hundred graphs to see
what they look like. Here are a few that I thought were especially interesting
or pretty.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer/?id=0x108400f7a00631&quot;&gt;0x108400f7a00631&lt;/a&gt;
starts out a bit tangled and is satisfying to untangle.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x80200084&quot;&gt;0x80200084&lt;/a&gt;
has really interesting layers.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x100400C7AC043D&quot;&gt;0x100400C7AC043D&lt;/a&gt;
is very spread out&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x10000000000002&quot;&gt;0x10000000000002&lt;/a&gt;
is impossibly tangled.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x182800008&quot;&gt;0x182800008&lt;/a&gt;
has nice 4-way symmetry&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0xc63&quot;&gt;0xc63&lt;/a&gt; looks
like a face to me.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer?id=0x30000000040203&quot;&gt;30000000040203&lt;/a&gt;
looks like 4 connected rings.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer/?id=0x8000802005A0&quot;&gt;0x8000802005A0&lt;/a&gt;
takes a bit of prodding but I think it looks like the back of a fancy card.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you come across any nice examples, please send me links. I’m always happy to
look at a cool graph.&lt;/p&gt;

&lt;h1 id=&quot;using-it-to-come-up-with-solutions&quot;&gt;Using it to come up with solutions&lt;/h1&gt;

&lt;p&gt;In my next post, I’ll be writing about how I used this tool to help me come up
with a solution to
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer/?id=0x20108000000C03&quot;&gt;0x20108000000C03&lt;/a&gt;.
It is a puzzle where your options are tremendously limited and being able to
visualize them clearly was key to coming up with a solution.&lt;/p&gt;

&lt;p&gt;By coincidence, this puzzle has a graph-twin -
&lt;a href=&quot;https://joshmermelstein.com/bandaged-cube-explorer/?id=0x30000010048883&quot;&gt;0x30000010048883&lt;/a&gt;
named “Bandaged Fortress” that others have solved. I’m excited to try that one
as well and test my theory that the structure of the graph informs the
experience of the solve.&lt;/p&gt;
</description>
        <pubDate>Sat, 19 Dec 2020 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/bandaged-cube-explorer-post/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/bandaged-cube-explorer-post/</guid>
      </item>
    
      <item>
        <title>Twisty Puzzles Intro</title>
        <description>&lt;h1 id=&quot;personal-history&quot;&gt;Personal History&lt;/h1&gt;

&lt;p&gt;When I was a teenager, one of my older brothers taught me to solve a Rubik’s
cube. He gave me a handwritten sheet of notes on what to do in a bunch of cases
and if I followed the sheet correctly, the cube would always end up solved.
Eventually, I memorized the dozen or so move sequences from the sheet.&lt;/p&gt;

&lt;p&gt;Later, my parents bought me a &lt;a href=&quot;https://wikipedia.org/wiki/Megaminx&quot;&gt;megaminx&lt;/a&gt; -
a puzzle that is a lot like a Rubik’s cube except that it’s based around a
dodecahedron. I was able to apply some of my knowledge from the Rubik’s Cube to
the megaminx but got stuck on the last layer. Even though the puzzles were quite
similar, I didn’t understand the seemingly-magic algorithms from my brother’s
notes so I was lost when it came to adapting them to a new situation. Eventually
I ended up looking up a solution online so I could solve the puzzle and at the
time that felt satisfying.&lt;/p&gt;

&lt;h1 id=&quot;rediscovery&quot;&gt;Rediscovery&lt;/h1&gt;

&lt;p&gt;A few years ago, I saw a Youtube video about a puzzle I’d never seen before. I
think it was a review of a mass produced version of Oskar van Deventer’s &lt;a href=&quot;https://www.youtube.com/watch?v=cjfMzA1u3vM&quot;&gt;Redi
Cube&lt;/a&gt;. I bought a copy and quickly
felt the same frustration I’d felt with the megaminx - I didn’t have a strategy
and I didn’t even know how to come up with a strategy. So again, I went to the
internet and I found a tutorial for how to solve that puzzle.&lt;/p&gt;

&lt;p&gt;Looking back, I regret how quickly I gave up. I feel like I deprived myself of
the experience of building an understanding of a puzzle and the joy of coming up
with a solution.&lt;/p&gt;

&lt;p&gt;Nonetheless, solving a puzzle was still satisfying and I started to do research
on what other puzzles were out there. It turns out that the Rubik’s cube was
only the tip of the iceberg. At the time, I didn’t really have the framework to
understand these puzzles but I still liked seeing videos of how they moved. They
were like interactive sculptures!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=_x0So1SCWD4&quot;&gt;Mandala Cube&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=M6o3fmlJ_6c&quot;&gt;Bloomy Gears&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Yz7dXv5zM-M&quot;&gt;Circle Starminx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;whats-in-a-solution&quot;&gt;What’s in a Solution&lt;/h1&gt;

&lt;p&gt;The sheet my brother gave me was one strategy for solving a Rubik’s cube, but it
certainly wasn’t the only one. In fact, dozens of strategies exist for the
Rubik’s cube! Lets zoom in a bit and compare two of them.&lt;/p&gt;

&lt;h3 id=&quot;cfop&quot;&gt;CFOP&lt;/h3&gt;

&lt;p&gt;Speedsolvers care about solving their puzzles as quickly as possible. This means
their solutions need to optimize for sequences that can be executed with &lt;a href=&quot;https://www.speedsolving.com/wiki/index.php/Category:Finger_tricks&quot;&gt;good
ergonomics&lt;/a&gt;
and preferably for low move count when possible. They also need to focus on
patterns that can be recognized quickly - because looking around the puzzle for
a piece wastes time.&lt;/p&gt;

&lt;p&gt;To get a little more specific, the beginner-friendly version of the CFOP method
has users learn around 15 algorithms for the
&lt;a href=&quot;https://jperm.net/algs/2lookoll&quot;&gt;different&lt;/a&gt;
&lt;a href=&quot;https://jperm.net/algs/2lookpll&quot;&gt;phases&lt;/a&gt; of the solve. At the highest level,
CFOP-users learn sets of algorithms like
&lt;a href=&quot;https://www.speedsolving.com/wiki/index.php/ZBLL&quot;&gt;ZBLL&lt;/a&gt; which consist of
hundreds of move sequences for more optimally handling situations that come up
during a solve.&lt;/p&gt;

&lt;p&gt;Other speedsolving methods exist with different tradeoffs but
most have the same property as CFOP that advanced users typically learn large
numbers of algorithms in order to get faster. This isn’t to say that the only
way to solve faster is to memorize large sets of algorithms, but the methods
that speedsolvers use aren’t opposed to such algorithm sets.&lt;/p&gt;

&lt;h3 id=&quot;low-algorithm-count&quot;&gt;Low Algorithm Count&lt;/h3&gt;

&lt;p&gt;In contrast &lt;a href=&quot;https://www.youtube.com/watch?v=iVYsJK7T7iQ&quot;&gt;here&lt;/a&gt; is a method for
solving the same puzzle using only two algorithms. It is not optimized for
speed, move count, or ergonomics. Instead, it is optimized understandability and
ease of memorization.&lt;/p&gt;

&lt;p&gt;Notably, the two algorithms are lengths 4 and 8. This is in sharp contrast with
cfop which contains 15+ move algorithms in even the &lt;a href=&quot;http://speedcubedb.com/a/3x3/PLL&quot;&gt;intermediate
versions&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;what-i-value-in-a-solution&quot;&gt;What I value in a solution&lt;/h3&gt;

&lt;p&gt;I think both of these methods are succeeding at their goals. CFOP is an
effective speedsolving method that lets users start with a moderate number of
algorithms and gives them the option to learn more in order to get faster. The
two-algorithm method from that video is easy to learn and easy to remember.&lt;/p&gt;

&lt;p&gt;I am not a speedsolver and I am not such a minimalist that I want a solution
with just 2 algorithms. Ideally I would like my solutions to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Be easy to remember&lt;/li&gt;
  &lt;li&gt;Be easy to execute without errors&lt;/li&gt;
  &lt;li&gt;Be flexible&lt;/li&gt;
  &lt;li&gt;Be understandable or even intuitive&lt;/li&gt;
  &lt;li&gt;Avoid long or tedious algorithms&lt;/li&gt;
  &lt;li&gt;Avoid large numbers of algorithms&lt;/li&gt;
  &lt;li&gt;Have some room for creativity to combine or skip steps&lt;/li&gt;
  &lt;li&gt;Be personal in some way&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;techniques-for-designing-solutions&quot;&gt;Techniques for Designing Solutions&lt;/h1&gt;

&lt;p&gt;Getting back to the story of my experiences with twisty puzzles, I wanted to
stop learning solutions from others and start coming up with my own. There are
many ways to do this but one common one is based on the group theory idea of a
commutator. There’s a lot to say here so instead of writing it all, I’ll
link you to &lt;a href=&quot;https://www.youtube.com/watch?v=-NL76uQOpI0&quot;&gt;this video&lt;/a&gt; from
Mathologer who does a pretty good job.&lt;/p&gt;

&lt;p&gt;Assuming you watched that video - you now know how to come up with your own
solutions! So why am I writing a blog post about this? Well Mathologer glosses
over some details that I think are quite interesting.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Finding magic sequences to isolate pieces is not trivial, especially on
complex puzzles&lt;/li&gt;
  &lt;li&gt;The “trick” only applies if the puzzle is doctrinaire - meaning all
moves are always available. Many interesting puzzles do not meet this
definition and need additional strategy.&lt;/li&gt;
  &lt;li&gt;The video only covers “pure” commutators, where only one type of piece is
permuted. When solving puzzles with many piece types, it can be convenient to
ignore some piece types while focusing other others. In this case, deciding
which order to address the pieces becomes an interesting part of finding a
solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;my-journey-of-improvement&quot;&gt;My Journey of Improvement&lt;/h1&gt;

&lt;p&gt;Over the last few years, I’ve been slowly improving my solving skills and
growing my puzzle collection. At the start of 2020, I decided to push myself so
I scrambled every puzzle in my collection (about 75 puzzles at the time), and
attempted to solve all of them by the end of the year without consulting any
outside help. Embarrassingly, this was the first time I’d ever scrambled a few
of them.&lt;/p&gt;

&lt;p&gt;It’s currently September and I’m on good pace toward that goal. My puzzle
collection has also grown to about 100 puzzles (new ones were scrambled and
counted toward my 2020 goal) and I only have three left to solve before the end
of the year. I believe that my work so far has had the desired effect of making
me a stronger puzzle solver.&lt;/p&gt;

&lt;p&gt;That said, some of my solutions were quite ugly. For several puzzles, like the
bagua cube, and the geared mixup, my solutions involved long (40+ moves) pure
commutators. For some of the crazy 3x3x3 plus series, I got stuck on edge
orientation issues and feel like I got out of them by luck.&lt;/p&gt;

&lt;p&gt;In 2020, I thought this was fine, since my goal was to solve all puzzles - not
to solve them &lt;em&gt;well&lt;/em&gt;. But in 2021, I want to step up my game further. I want to
focus on a smaller set of puzzles and find solutions that I am proud of. I want
to solve each one more than once to make sure my solution covers all possible
edge cases. Also, I want to do this with less use of digital puzzle simulators
than in 2020 as a way to improve my puzzle visualization skills.&lt;/p&gt;

&lt;p&gt;I haven’t decided whether I’ll consult other people’s tutorials in 2021. On one
hand, finding the solutions myself feels more meaningful. On the other hand, I
think I’m missing out on ideas that I could be learning from others.&lt;/p&gt;

&lt;p&gt;Many of my solutions were written down on scratch paper and were probably lost.
So moving forward, when I find a solution that I’m happy with, I’m going to try
to document it on this blog for posterity. I may also do some smaller posts on
misc puzzle ideas I had that I think are worth recording. These posts will not
be tutorial and will probably be written for an audience that is already
familiar with puzzles.&lt;/p&gt;
</description>
        <pubDate>Sat, 19 Sep 2020 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/twisty-puzzles-into/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/twisty-puzzles-into/</guid>
      </item>
    
      <item>
        <title>Very Random Siteswaps</title>
        <description>&lt;p&gt;tl;dr &lt;a href=&quot;https://joshmermelstein.com/random-siteswap&quot;&gt;https://joshmermelstein.com/random-siteswap&lt;/a&gt;
generates very random siteswaps. Read on to learn how it works.&lt;/p&gt;

&lt;h1 id=&quot;background&quot;&gt;Background&lt;/h1&gt;

&lt;p&gt;When James Buckland and I were working on
&lt;a href=&quot;https://jbuckland.com/juggling-graph/&quot;&gt;juggling-graph&lt;/a&gt;, I sent him a worksheet
from one of &lt;a href=&quot;http://jugglesensei.net/workshops.html&quot;&gt;Matt Hall’s workshops&lt;/a&gt; to
use for interesting examples. He turned that list into the “Random” button on
that site. That button got me wondering - how would be generate siteswaps at
random?&lt;/p&gt;

&lt;p&gt;I did a bit of research and found 
&lt;a href=&quot;https://groups.google.com/forum/#!topic/rec.juggling/IVuHX_bDsNY&quot;&gt;a post from Jack Boyce&lt;/a&gt;,
 the author of jugglinglab. In it, he references 
&lt;a href=&quot;https://groups.google.com/forum/#!msg/rec.juggling/KdkPFy8qDP0/fFYbpL4XxWsJ&quot;&gt;this post from 1998&lt;/a&gt;
containing the following code:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/* gentest.c       Bijective siteswap generator        */
/*                                                     */
/* Jack Boyce (jbo...@physics.berkeley.edu)            */
/* July, 1998                                          */
/*                                                     */
/* Uses bijection to calculate all (b+1)^n siteswaps   */
/* of period n and no more than than b balls           */
/*                                                     */
/* Basic idea due to Colin Wright, Michael Kleber,     */
/* and many others                                     */

void convertone(int *in, int *out, int n) {
   int i, j, accum;
     
   for (i = 0; i &amp;lt; n; i++) {
      accum = out[i] = in[i];
      j = i;
      while (accum &amp;gt; 0) {
         j = (j+1) % n;
         if (in[j] &amp;lt; accum)
            out[i]++;
         else
            accum--;
      }
   }
}

void printthrow(int th) {
   printf(&quot;%c&quot;, th + ((th&amp;lt;10)?&apos;0&apos;:(&apos;A&apos;-10)));
}

void main(int argc, char **argv) {
   int i, bmax, n, *input, *output;

   if (argc != 3) {
      printf(&quot;Usage: gentest &amp;lt;ball limit&amp;gt; &amp;lt;period&amp;gt;\n&quot;);
      exit(0);
   }

   bmax = atoi(argv[1]);
   n = atoi(argv[2]);
   input = (int *)malloc(n * sizeof(int));
   output = (int *)malloc(n * sizeof(int));
   for (i = 0; i &amp;lt; n; i++)
      input[i] = 0;

   while (1) {
      convertone(input, output, n);
      for (i = 0; i &amp;lt; n; i++)    printthrow(input[i]);
      printf(&quot; -&amp;gt; &quot;);
      for (i = 0; i &amp;lt; n; i++)    printthrow(output[i]);
      printf(&quot;\n&quot;);

      i = n-1;
      while ((input[i] = (input[i]+1) % (bmax+1)) == 0)
         if (i-- == 0)
            return;
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;His code works as expected, but I couldn’t figure out why it worked so I didn’t
know how to extend it to support sync or multiplex patterns. Luckily, I did
recognize the name “Michael Kleber” from the header comment - I know him through
my work! Michael agreed to meet for coffee, and he gave me exactly the
explanation I was looking for.&lt;/p&gt;

&lt;h1 id=&quot;cards-model-of-vanilla-siteswap&quot;&gt;Cards Model of Vanilla Siteswap&lt;/h1&gt;

&lt;p&gt;First, we define a set of cards that look like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/random-siteswap/example-cards.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We’re going to generate our random siteswaps by drawing from a deck of these
cards (with replacement). Here’s an example:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/random-siteswap/ex1.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve colored in various arrow to make things easier to follow. The first thing
to notice is that every beat has one arrow “landing” on the bottom, and other
arrow emerging from the bottom to some height. This is just like the conditions
that make a siteswap valid.&lt;/p&gt;

&lt;p&gt;The other thing to notice is that the cards divide space into evenly sized
chunks. So we can count how many beats each arrow spends in the “air” before it
lands back at the bottom of any card. If we do this for each arrow, we get the
numbers {7, 2, 2, 3, 6}. And in fact, these cards can be viewed as a
representation of the siteswap 72236.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/random-siteswap/72236.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So why is this cards model useful to us? Well every arrangement of cards is a
valid siteswap - and every siteswap has exactly one arrangement of cards. This
simplifies the problem from “generating random siteswaps” to “generating random
sequences of cards”. And we can represent each card with the height its arrow
rises up to; so now we just need to generate a random list of positive integers.&lt;/p&gt;

&lt;h1 id=&quot;extending-to-sync&quot;&gt;Extending to Sync&lt;/h1&gt;

&lt;p&gt;Now that I understood the vanilla case, I wanted to extend this to generating
sync siteswaps. The idea is really similar! Instead of our cards just having one
arrow on them, they need two arrows - one for each hand. We could also use a
pair of vanilla cards to represent each sync beat but we nee to be careful. If
the second card was a 1, that would turn the first throw into a 0x. Here’s an
example of a hand of sync cards.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/random-siteswap/2x8x6x4x.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Can you tell what siteswap this is? Check the name of the image for help.&lt;/p&gt;

&lt;h1 id=&quot;extending-to-multiplexes&quot;&gt;Extending to Multiplexes&lt;/h1&gt;

&lt;p&gt;Extending to multiplex is also not too difficult. Now, we allow more than one
arrow to rise from the bottom of each card, and we also make sure that the same
number of arrow go to the bottom of each card. For example, here are all cards
of height 3 (ignoring the order that balls exit a multiplex).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/random-siteswap/3_height.png&quot; style=&quot;max-height: 400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now that more than one arrow can hit the ground in a card, we need to modify our
constraint on sync card pairs. The new constraint is the “the lowest height on
the first half of a card must be higher than the number of arrows coming out of
the second card. As before, this guarantees that no 0x’s will appear.&lt;/p&gt;

&lt;h2 id=&quot;problems-with-multiplicity&quot;&gt;Problems with multiplicity&lt;/h2&gt;

&lt;p&gt;Of the 8 multiplex cards shown above, there are 4 from the vanilla deck, and 4
new ones - so if we pick randomly then we have a 50/50 shot of introducing a
multiplex. But what happens as the max arrow height goes up?&lt;/p&gt;

&lt;p&gt;Well when there are n heights to choose from, there are 2^n possible cards, and
only n+1 are vanilla. When N is large, that’s a tiny fraction!&lt;/p&gt;

&lt;p&gt;So if we generate cards uniformly at random, we’ll end up with nearly every
throw being a multiplex. There’s nothing wrong with this but I think those
patterns aren’t that interesting. I decided to make high multiplicity throws
much less likely to steer the program toward patterns I found interesting.&lt;/p&gt;
</description>
        <pubDate>Tue, 16 Jun 2020 00:00:00 +0000</pubDate>
        <link>http://www.joshmermelstein.com/random-siteswap-post/</link>
        <guid isPermaLink="true">http://www.joshmermelstein.com/random-siteswap-post/</guid>
      </item>
    
  </channel>
</rss>