Low-tech universal computing

A forum where anything goes. Introduce yourselves to other members of the forums, discuss how your name evolves when written out in the Game of Life, or just tell us how you found it. This is the forum for "non-academic" content.
User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Low-tech universal computing

Post by pcallahan » December 21st, 2019, 4:09 pm

I'm putting this in sandbox since I don't think there is a great deal of interest other than me (but I may add similar ideas over time, since it's kind of an obsession). I have posted before about computing with tiles. I realized that an even simpler model that can be done as a kids' craft project uses stencils. It's less automatic than tiles, because you aren't forced to apply the transitions correctly, but I think it illustrates that the "thinking" is happening on the paper and not in your brain. Here is a pair of stencils for running rule 110.
Screen Shot 2019-12-21 at 11.48.15 AM.png
Screen Shot 2019-12-21 at 11.48.15 AM.png (20.05 KiB) Viewed 8952 times
The idea is to hold one of them at the orientation shown, and if you find a filled-in square matching the top square but do not see anything filled under the slash, you fill in the square(s) at the bottom.

For an isolated square, either stencil could be used to fill in the square below a filled-in square. For any other row of squares with spaces on either side, the left stencil determines how to fill in the cells below on the left, and the right stencil determines how to fill in the cells below on the right.

This shows the stenciling starting with a single square at the top and continuing a few rows.
Screen Shot 2019-12-21 at 11.48.33 AM.png
Screen Shot 2019-12-21 at 11.48.33 AM.png (19.09 KiB) Viewed 8952 times
People do use stencils in home decorating, typically for periodic wall patterns, but you could fill a wall with rule 110 or other CA patterns this way given appropriate stencils.

Stencils aren't as good as tiles for non-deterministic models, though, because you can't retract a mark easily. I still like the idea of using this for generative wall art.

Update 12/25/19:
Note that you can build a general-purpose stencil for any elementary CA. It's a little harder to use, but it has the same basic idea. Paint squares only where the window of 3 squares matches above. By using a De Bruijn sequence, you can pack all possible windows into a sequence. This one is for rule 110 (and more complex than the above) but you can use it for other CAs.
Screen Shot 2019-12-25 at 1.20.49 PM.png
Screen Shot 2019-12-25 at 1.20.49 PM.png (34.51 KiB) Viewed 8850 times
Another thought: since De Bruijn sequences are cyclic, something could be designed decoder-ring style, but the squares would not line up perfectly.
Last edited by pcallahan on December 26th, 2019, 3:43 pm, edited 2 times in total.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » December 24th, 2019, 3:14 pm

Another option for rule 110 is to use tiles to represent the predictable regions that result from a line of on cells. This has the advantage of requiring fewer tile placements, but it does require an infinite tile set. The geometry is not really enforced by the tiles. The rule for placement is:
  • The upper left corner of any tile must be to the right of an empty cell.
Note that the converse is not required. While it is forced for the concave corners, the uppermost right empty cell may or may not be followed by the corner of a tile.
Screen Shot 2019-12-24 at 10.57.39 AM.png
Screen Shot 2019-12-24 at 10.57.39 AM.png (126.44 KiB) Viewed 8882 times
These could be made into refrigerator magnets pretty easily.

The competing ideas I've posted before (also suitable for refrigerator magnets) are:
Long skinny tiles beside on regular expression (🁣+🁤🁫+(🁤🁫(🁪)*🁫))* and also an infinite set.
Screen Shot 2019-12-18 at 6.19.25 PM.png
Screen Shot 2019-12-18 at 6.19.25 PM.png (35.93 KiB) Viewed 8882 times
Square Wang tiles (only 6 required)
wang tiles.png
wang tiles.png (108.9 KiB) Viewed 8882 times
Both of the above require doing placement for very predictable rule applications.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 5th, 2020, 11:17 pm

This is not universal computing, but it is a low-tech solution to constructing random instances of a class of still life patterns that tile the plane with 3x3 neighborhoods containing exactly 4 live cells.
Screen Shot 2020-01-05 at 9.06.54 PM.png
Screen Shot 2020-01-05 at 9.06.54 PM.png (139.97 KiB) Viewed 8791 times
The idea illustrated above is to use paper strips. The blue horizontal strip has a live cell every three spaces. The pink vertical strip has live cells except every three spaces.

Arrange them as shown above with vertical strips overlaid on the horizontal ones. The horizontal strips can slide back and forth, snapping to grid lines within the outer (black) rectangle. The vertical strips can slide up and down, also snapping to grid lines within the outer rectangle. Every cell within the inner (red) rectangle satisfies still life conditions. If it is live, it has three live neighbors. Otherwise it has four live neighbors.

It would be possible to build a cardboard device with guides in place to restrict the sliding and generate still life patches this way (boundaries not stabilized though).

Note that the rules are simple enough to draw these kinds of still life patterns by hand directly on graph paper just by filling in every third square at the appropriate places. Here's one:
20200105_192451.jpg
20200105_192451.jpg (14.09 KiB) Viewed 8798 times

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 15th, 2020, 12:03 pm

A set of six interlocking tiles that can be rotated and assembled into a grid of black and white squares. When assembled, each cell (separated by red grid lines) contains a number of dots equal to the number of black squares in its Moore neighborhood.
Screen Shot 2020-01-15 at 7.53.24 AM.png
Screen Shot 2020-01-15 at 7.53.24 AM.png (107.98 KiB) Viewed 8740 times
For those unable to see Life patterns in their head, this gives a quick visual indication of the next Life step. Above, you can pick out which glider cells survive, die, or are born. At least, I think anyone who can read dice or dominoes should be able to do this with ease.

It's not fully automatic, but I think this would have been popular in an alternate universe where CGOL was invented before digital computers.

User avatar
dvgrn
Moderator
Posts: 10669
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI
Contact:

Re: Low-tech universal computing

Post by dvgrn » January 15th, 2020, 1:31 pm

pcallahan wrote:
January 15th, 2020, 12:03 pm
It's not fully automatic, but I think this would have been popular in an alternate universe where CGOL was invented before digital computers.
CGOL really was invented quite a few years before computers, in a sense -- ubiquitous, inexpensive, easy-to-use personal computers, at any rate.

Early stories about Life investigations very often seem to involve reams of paper printouts, and these tiles seem like they'd be a nice improvement over checkers or Go boards. If you had two sets of the six tiles in slightly different colors, stacking generations on top of each other might work pretty well, too... though it might be a little awkward picking out the next tile, since you'd have to get the future colors right based on a non-color property (the dot count) in the combined four-piece area that includes each quadrant.

A mostly unrelated idea: it should be fairly trivial to put together rules with cell icons that look very much like these tiles, in a Golly universe with the grid turned off.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 15th, 2020, 2:26 pm

dvgrn wrote:
January 15th, 2020, 1:31 pm
pcallahan wrote:
January 15th, 2020, 12:03 pm
It's not fully automatic, but I think this would have been popular in an alternate universe where CGOL was invented before digital computers.
CGOL really was invented quite a few years before computers, in a sense -- ubiquitous, inexpensive, easy-to-use personal computers, at any rate.

Early stories about Life investigations very often seem to involve reams of paper printouts, and these tiles seem like they'd be a nice improvement over checkers or Go boards. If you had two sets of the six tiles in slightly different colors, stacking generations on top of each other might work pretty well, too... though it might be a little awkward picking out the next tile, since you'd have to get the future colors right based on a non-color property (the dot count) in the combined four-piece area that includes each quadrant.
Thanks for the comments. There are some variations on these tiles that may or may not enhance usability. If the dots are placed as on the left below, the dot patterns on each square preserve the shape of the Moore neighborhood, albeit rotated somewhat clockwise. Or cell counts can be indicated as "flower petals" on the right. This preserves octagonal symmetry the way my original set of still life tiles did.
Screen Shot 2020-01-15 at 10.15.46 AM.png
Screen Shot 2020-01-15 at 10.15.46 AM.png (47.57 KiB) Viewed 8731 times
The main advantage I see in the design I posted is that people may just have more experience seeing dots arranged as on dice. I haven't tried out the flower petal idea visually. It's possible that this may work. The petals could be spiraled a little counter-clockwise to point at the cells they represent.

(Note: as always with anything involving 90° rotational symmetry, there's a hazard of having swastikas popping up. It's kind of a bummer, since it may make a few possibilities unsuitable for polite company.)

Update: An advantage to the flower petal approach is that the indicators are all clustered together. This helps reduce the problem of counting dots together that really belong in adjacent squares. In fact, maybe a good design ought to push the dots out to the corners and also connect them to the corners so neighborhood counts form a connected blob. (I have been thinking of investing in a Cricut die cutter, since it's a mature crafting technology and may be suitable for thick enough material to be usable as a puzzle. These seem interesting enough to make.)
A mostly unrelated idea: it should be fairly trivial to put together rules with cell icons that look very much like these tiles, in a Golly universe with the grid turned off.
Now that you mention it, that would be interesting to see if anyone wants to do it! I have been making these tiles in Google draw, and my other option would be Python with turtle graphics, believe it or not. I will eventually have to automate this, but I don't have the cycles right now.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 16th, 2020, 4:09 am

The flower petal approach is interesting. It eliminates the need for the red lines, and it is overall more legible I think. For one thing, it's easier to find the neighbors being counted.

It is a little alien looking though. Anyone have a strong preference?
Screen Shot 2020-01-16 at 12.06.09 AM.png
Screen Shot 2020-01-16 at 12.06.09 AM.png (112.91 KiB) Viewed 8700 times

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 16th, 2020, 11:47 am

Here are glider transitions with the new tile set. One way to look at this is in terms of k-petal "daisies." Birth occurs on 3-petal black daisies. Survival occurs on 2 or 3-petal white daisies. I find it easier to spot the daisies than count dice pips. Anyone prefer the other tiles? I'm curious about any reasons, aesthetic, usability based, objective or subjective.
Screen Shot 2020-01-16 at 7.26.15 AM.png
Screen Shot 2020-01-16 at 7.26.15 AM.png (91.84 KiB) Viewed 8683 times
I'm pretty sure what I'm doing with these tiles is equivalent to a 16-state Margolus rule (update: not quite), but I need to think about it. It is interesting that I had the diagonal-joining tiles nearly 4 years ago and never thought about doing it this way.

Update: The tiling is different from a (non-reversible) Margolus implementation of Life, which would look like:

Code: Select all

a b c d      g'h'g'h'
f g h i ---> k'l'k'l
j k l m      g'h'g'h
n o p q      k'l'k'l
where the primed variables are the Life successors, and the rule is applied on alternate 4x4 blocks of cells (or 2x2 blocks of 16-state compound cells).

The tiling also uses 2x2 blocks of 16-state compound cells, but the compound cells always match up. In the Margolus rule, the compound cells duplicate within blocks, but are independent going between blocks.

It's easier to explain the difference in 1D. Margolus is like ab ab cd cd ef ef but the tiling is like ab bc cd de ef.

Update 2: Here's a link to the tiles in Google draw. It's view only, so copy if you want to fit them into patterns. https://docs.google.com/drawings/d/18aF ... lLdJs/view

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 17th, 2020, 3:15 pm

One comment about the practicality of this method: If you take the assembled eater and block with "petals" (shown a couple posts back) and position them in different ways adjacent to each other, it is very easy to spot the places where it is safe to put the block and where it breaks the still life condition. I did this in Google draw, but you could print them and cut out paper. Some experienced Lifers can probably do this in their heads, but it really helped me do the visualization without a computer.

I wonder what's the smallest still life that uses all the tiles at all rotations.

I originally thought about using this for making an image and cutting it into tiles with netpbm (my image processing tool of choice circa 1990 and still available), But there is no reason I need to limit it to still lifes for that purpose. I still wonder what's the answer to the above question.

Update: Here's a 4x4 patch that uses all the tiles in all rotations. Needles to say, it's not a still life, but it may suit my needs.
Screen Shot 2020-01-17 at 5.39.02 PM.png
Screen Shot 2020-01-17 at 5.39.02 PM.png (43.48 KiB) Viewed 8629 times

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 18th, 2020, 10:58 pm

This is another way to use all 16 2x2 tiles (considering rotations distinct), and the result can itself be tiled periodically.
Screen Shot 2020-01-18 at 6.45.28 PM.png
Screen Shot 2020-01-18 at 6.45.28 PM.png (111.61 KiB) Viewed 8604 times
This is a well known infinite period-2 oscillator (though I forget where I saw it; is there a finitization?). The petals make it clear that the solid 2x2 blocks alternate between live and dead, while the checked ones remain the same.

Update: Getting some tooling in place to generate these pictures automatically. I used a Python script to generate netpbm commands to concatenate smaller tiles. (I was using netpbm over 25 years ago, but it still works well for scripting.) The tiles are kept to squares by including the adjacent piece's jigsaw nub. I originally made the tiles in Google draw, but did a little post-editing on the bitmaps to fix some problems. If you make boundaries with the right measurements for each black or white quadrant, the tiles themselves can be drawn more artistically.

Here's a randomish still-life generated by lifesrc.
still.png
still.png (180.31 KiB) Viewed 8586 times
And here are the tiles for orthogonal spaceships. Again I think it is easier to pick out the cell transitions by eye with the petal annotations than just to see it in the original pattern.
spaceships.png
spaceships.png (316.04 KiB) Viewed 8580 times

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 21st, 2020, 12:03 am

A slight variation of the tiles in which the petals are all the same color. This provides the dubious benefit of being able to compose each tile as a union of the two sets shown to the right copied and rotated as needed: a white corner section and a black corner section with disconnected petals on its neighbors. Hmm, maybe this is useful after all, since you could compose the tiles as an overlay of images with transparent pixels.
Screen Shot 2020-01-20 at 7.52.40 PM.png
Screen Shot 2020-01-20 at 7.52.40 PM.png (128.47 KiB) Viewed 8555 times
So we can check still life patterns with 6 tiles. Could the tiles be manageable with period-2 oscillators? In that case, there are 4^4=256 possible patches, reducible to 70 tiles with rotations. Then you'd have to deal with two kinds of petals and more complex rules, but it seems within human ability while at the same time solving a more interesting puzzle.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 25th, 2020, 3:54 pm

Streamlining my process a bit, I am now able to make these tiles using imagemagick, which is a lot more flexible than the old netpbm commands I was using. I haven't added jigsaw contours, but there's nothing stopping me, just more work to do.
tiling.png
tiling.png (31.46 KiB) Viewed 8496 times
Here's a python script to generate a big imagemagick command:

Code: Select all

COLOR = ["white", "black"]

def tile(x, y, length, quadrants):
  size = length * 2 + 1
  xf = length * 0.6
  thickness = length * 0.12
  lines = ["-fill red -draw 'translate %d, %d rectangle 0, 0, %d, %d'" % (x, y, size - 1, size - 1),
           "-fill black"]
  for i in range(len(quadrants)):
      lines.append("-fill %s" % COLOR[quadrants[i]]) 
      lines.append("-draw 'translate %d, %d rotate %d translate %d, %d rectangle 0, 0, %d %d'" %
          (length + x, length + y, i * 90, -length, -length, length - 1, length - 1))
  for i in range(len(quadrants)):
      lines.append("-fill red") 
      if quadrants[(i + 1) % 4]:
         lines.append("-draw 'translate %d, %d rotate %d translate %d, %d rotate 22.5 "
                      "path \"M 0, 0 L %d, %d L %d, %d Z\"'" %
                      (length + x, length + y, i * 90, -length, -length, xf, -thickness, xf, thickness))
      if quadrants[(i + 2) % 4]:
         lines.append("-draw 'translate %d, %d rotate %d translate %d, %d rotate 67.5 "
                      "path \"M 0, 0 L %d, %d L %d, %d Z\"'" %
                      (length + x, length + y, i * 90, -length, -length, xf, -thickness, xf, thickness))
  return lines

def pattern(x, y, length, grid, border):
  size = length * 2 + 1 + border
  lines = []
  for i in range(len(grid) - 1): 
    for j in range(len(grid[i]) - 1): 
      lines.extend(tile(x + j * size, y + i * size, length,
                   (grid[i][j], grid[i][j + 1], grid[i + 1][j + 1], grid[i + 1][j])))
  return lines
 
size = 800

lines = []
lines.append("magick -size %dx%d canvas:none -fill lightgray" % (size, size))
lines.append("-draw 'rectangle 0, 0, %s, %s'" % (size, size))
tilecolors = [(a, b, c, d)
              for a in range(2) for b in range(2) for c in range(2) for d in range(2)]

x = 60
for quadrant in tilecolors:
  if quadrant == min(quadrant[-i:] + quadrant[:-i] for i in range(len(quadrant))):
    lines.extend(tile(x, 80, 40, quadrant))
    x += 120

eater = [
  [0, 0, 0, 0, 0, 0],
  [0, 0, 0, 1, 1, 0],
  [0, 0, 0, 0, 1, 0],
  [0, 1, 1, 1, 0, 0],
  [0, 1, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0]]

lines.extend(pattern(150, 300, 40, eater, 1))

lines.append("tiling.png")

print " \\\n".join(lines)
And here's the command.

Code: Select all

magick -size 800x800 canvas:none -fill lightgray \
-draw 'rectangle 0, 0, 800, 800' \
-fill red -draw 'translate 60, 80 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 100, 120 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 100, 120 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 100, 120 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 100, 120 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
-fill red -draw 'translate 180, 80 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 220, 120 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 220, 120 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 220, 120 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 220, 120 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-draw 'translate 220, 120 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 220, 120 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red -draw 'translate 300, 80 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 340, 120 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 340, 120 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 340, 120 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 340, 120 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 340, 120 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 340, 120 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 340, 120 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 340, 120 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red -draw 'translate 420, 80 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 460, 120 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 460, 120 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 460, 120 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 460, 120 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 460, 120 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 460, 120 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 460, 120 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 460, 120 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 540, 80 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 580, 120 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 580, 120 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 580, 120 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 580, 120 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 580, 120 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 580, 120 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 580, 120 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 580, 120 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 580, 120 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 580, 120 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 660, 80 rectangle 0, 0, 80, 80' \
-fill black \
-fill black \
-draw 'translate 700, 120 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 700, 120 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 700, 120 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 700, 120 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 700, 120 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 700, 120 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 700, 120 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 700, 120 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 700, 120 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 700, 120 rotate 180 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 700, 120 rotate 270 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 700, 120 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 150, 300 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 190, 340 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 340 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 340 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 340 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
-fill red -draw 'translate 232, 300 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 272, 340 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 340 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 340 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 340 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
-fill red -draw 'translate 314, 300 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 354, 340 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 340 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 354, 340 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 340 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 354, 340 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 354, 340 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red \
-fill red -draw 'translate 396, 300 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 436, 340 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 340 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 436, 340 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 436, 340 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 436, 340 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 340 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 436, 340 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 340 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red -draw 'translate 478, 300 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 518, 340 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 340 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 340 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 518, 340 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-draw 'translate 518, 340 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 518, 340 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red -draw 'translate 150, 382 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 190, 422 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 422 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 422 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 422 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
-fill red -draw 'translate 232, 382 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 272, 422 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 422 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 422 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 422 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
-fill red -draw 'translate 314, 382 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 354, 422 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 354, 422 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 422 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 422 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 354, 422 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red \
-fill red \
-draw 'translate 354, 422 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 396, 382 rectangle 0, 0, 80, 80' \
-fill black \
-fill black \
-draw 'translate 436, 422 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 436, 422 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 436, 422 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 422 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 436, 422 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 436, 422 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 422 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 422 rotate 180 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 422 rotate 270 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 436, 422 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 478, 382 rectangle 0, 0, 80, 80' \
-fill black \
-fill black \
-draw 'translate 518, 422 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 422 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 422 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 518, 422 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-draw 'translate 518, 422 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 518, 422 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 518, 422 rotate 180 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 518, 422 rotate 270 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 150, 464 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 190, 504 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 504 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 190, 504 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 504 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 190, 504 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 190, 504 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red \
-fill red -draw 'translate 232, 464 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 272, 504 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 504 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 272, 504 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 272, 504 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 272, 504 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 272, 504 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 272, 504 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 272, 504 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red -draw 'translate 314, 464 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 354, 504 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 504 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 354, 504 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 354, 504 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 354, 504 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 354, 504 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 354, 504 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 354, 504 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red -draw 'translate 396, 464 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 436, 504 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 436, 504 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 504 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 436, 504 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 436, 504 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 504 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 504 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 504 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 478, 464 rectangle 0, 0, 80, 80' \
-fill black \
-fill black \
-draw 'translate 518, 504 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 504 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 504 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 504 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-draw 'translate 518, 504 rotate 180 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 518, 504 rotate 270 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 150, 546 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 190, 586 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 190, 586 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 190, 586 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 586 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 190, 586 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 190, 586 rotate 0 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 190, 586 rotate 90 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red \
-draw 'translate 190, 586 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 232, 546 rectangle 0, 0, 80, 80' \
-fill black \
-fill black \
-draw 'translate 272, 586 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 272, 586 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 586 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 272, 586 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 272, 586 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 272, 586 rotate 90 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 272, 586 rotate 180 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 272, 586 rotate 180 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 272, 586 rotate 270 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 272, 586 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 314, 546 rectangle 0, 0, 80, 80' \
-fill black \
-fill black \
-draw 'translate 354, 586 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 354, 586 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 586 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 586 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 354, 586 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red \
-draw 'translate 354, 586 rotate 180 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 354, 586 rotate 270 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-draw 'translate 354, 586 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 396, 546 rectangle 0, 0, 80, 80' \
-fill black \
-fill black \
-draw 'translate 436, 586 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 586 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 586 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 586 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-draw 'translate 436, 586 rotate 180 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 436, 586 rotate 270 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 478, 546 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 518, 586 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 586 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 586 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 586 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
-fill red -draw 'translate 150, 628 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 190, 668 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill black \
-draw 'translate 190, 668 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 668 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 190, 668 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-draw 'translate 190, 668 rotate 0 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-fill red \
-fill red \
-draw 'translate 190, 668 rotate 270 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 232, 628 rectangle 0, 0, 80, 80' \
-fill black \
-fill black \
-draw 'translate 272, 668 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 668 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 668 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 272, 668 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-draw 'translate 272, 668 rotate 180 translate -40, -40 rotate 67.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red \
-draw 'translate 272, 668 rotate 270 translate -40, -40 rotate 22.5 path "M 0, 0 L 24, -4 L 24, 4 Z"' \
-fill red -draw 'translate 314, 628 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 354, 668 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 668 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 668 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 354, 668 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
-fill red -draw 'translate 396, 628 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 436, 668 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 668 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 668 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 436, 668 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
-fill red -draw 'translate 478, 628 rectangle 0, 0, 80, 80' \
-fill black \
-fill white \
-draw 'translate 518, 668 rotate 0 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 668 rotate 90 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 668 rotate 180 translate -40, -40 rectangle 0, 0, 39 39' \
-fill white \
-draw 'translate 518, 668 rotate 270 translate -40, -40 rectangle 0, 0, 39 39' \
-fill red \
-fill red \
-fill red \
-fill red \
tiling.png

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 26th, 2020, 3:06 pm

An inkjet printer, some scrap cardboard for backing, some scissors and glue. Add to the mix hours of obsessive behavior by a man who graduated kindergarten nearly a half century ago. And we get...

Game of Life unplugged!
20200126_104250.jpg
20200126_104250.jpg (123.91 KiB) Viewed 8468 times
Using the six tiles (previous post and others) the neighbor count shows up as the number of petals on a stylized red "daisy". It is easy to pick out births and deaths. The block on table, beehive, and eater can be identified as still lifes (sorry, ran out of corner pieces on the last one). Conversely, the glider and blinker have births and deaths and are very clearly not still lifes.

With backing cardboard, the pieces aren't too hard to work with, but they do tend to slip. Without precision cutting, I might get some more mileage out of the square shapes by printing them on magnetic stock. If I add jigsaw contours, I will need a better way to cut, e.g. with a Cricut or similar. That's a bigger investment than I am prepared to make at the moment.

Granted all of this is old hat to anyone who has played with CGOL on computers. I wonder what it would be like if this was your first experience with Life rules before programming them. I wouldn't want to inflict the cardboard chits on anyone, but jigsaw pieces or even magnets might be good.

Another thing. There are six tiles. Would it be worth making a bag of dice with a tile pattern on each side?

Update: nameless still life that I put together by hand.
20200129_182604.jpg
20200129_182604.jpg (787.46 KiB) Viewed 8414 times

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » January 30th, 2020, 2:44 pm

Here's a 6-tile set that pulls the complete Moore neighborhood into the middles of cells. Without any placement rules except matching boundaries, you can use it as a visual aid for analyzing the next step of any 2-state Moore neighborhood CA.
Screen Shot 2020-01-30 at 10.20.03 AM.png
Screen Shot 2020-01-30 at 10.20.03 AM.png (37.5 KiB) Viewed 8414 times

Hunting
Posts: 4395
Joined: September 11th, 2017, 2:54 am

Re: Low-tech universal computing

Post by Hunting » February 5th, 2020, 7:15 am

Sorry for non-constructive comments, but I wish I had a set of those tiles.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » February 8th, 2020, 1:46 pm

Hunting wrote:
February 5th, 2020, 7:15 am
Sorry for non-constructive comments, but I wish I had a set of those tiles.
Do you have a printer? All my physical tiles so far are done with an inkjet printer, scrap cardboard (like a cereal box), glue and scissors. It limits me a bit (though I have done triangles and hexagons besides squares using this method and even rhombus* tiles with curved boundaries).

A 3D printer or laser cutter would be nice for putting in some jigsaw contours, but if you only want squares, it's not all that much work to glue a printout to cardboard, cut it into strips, then cut those into squares.

Meanwhile, here is the latest variation. Described in more detail at https://conwaylife.com/forums/viewtopic ... 278#p88835
tiles.png
tiles.png (6.46 KiB) Viewed 8311 times
*And thanks to a helpful answer, I now know the 60°-120° rhombus tiles are usually called "lozenge tilings" and were analyzed by MacMahon over a century ago.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » February 25th, 2020, 11:06 am

Here are some patterns constructed with physical tiles like the above. The blank tile can always be omitted if you're OK leaving holes, while the four-dot tile is only useful for making blocks if you're doing still life patterns.

The yellow tiles are printed on card stock, which is too lightweight to be usable. I also think these dots are too small and difficult to align the halves. I was trying to build a still life, but I left three birth cells in this one.
20200223_101352.jpg
20200223_101352.jpg (218.42 KiB) Viewed 8203 times
(left as an exercise to find)

Here's a stabilization I built by hand in Golly. It's unclear if this is harder or easier than using tiles.

Code: Select all

x = 17, y = 16, rule = B3/S23
8bo$8b3o$11bo$8b4o$8bo$10b2o3b2o$9b2obobobo$8bo3bobo$2ob2o2bob2obob2o$
bobo2bobo2bo$bobob2o3bo$2b2obo2bob2o$7b2o$8bo$6bo$6b2o!
The next set is on plain printer paper, which is even less usable, but I wanted to try them before using any more expensive material or going to the effort of gluing them to backing. I think the dots are at least sized right, and this time I did not make a mistake with the still life.
20200224_205236.jpg
20200224_205236.jpg (131.13 KiB) Viewed 8203 times

Code: Select all

x = 8, y = 6, rule = B3/S23
b2o$o2bo$ob2o$bo2b2o$2bobo2bo$3bo2b2o!

The next thing to try is magnet paper. This is more expensive and probably harder to cut with scissors.

Here's an idea for a puzzle. Use software to find a still life that uses unique proportions of tiles (there must be some, up to symmetry). Then given the tiles, reconstruct the still life without seeing it first. A high-tech connection is that you could have an phone app that checks if your placement is right based on a picture.

Update: Here is an 8x10 pattern (not a still life) that can be printed on 8.5x11 paper after scaling to leave some margins. The tiles are proportioned according to a survey of small lifesrc-generated patterns with a little trial and error. The frequencies as as follows (tuples are in order of corners clockwise around the tile).

Code: Select all

(0, 0, 0, 1) 32
(0, 0, 1, 1) 26
(0, 1, 0, 1) 10
(0, 1, 1, 1) 10
(1, 1, 1, 1) 2
tile8x10.png
tile8x10.png (275.76 KiB) Viewed 8190 times

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » February 27th, 2020, 2:09 am

Latest tiling. This time I glued them to cardboard from a cereal box. I am now waiting for the magnet sheets.
20200226_215403.jpg
20200226_215403.jpg (1.63 MiB) Viewed 8141 times
Though it's pretty obviously a still life, you can see here:

Code: Select all

x = 11, y = 9, rule = B3/S23
9b2o$b2o3b2o2bo$bobobo2b2o$2b2ob2o$4bo$4bo$2b2ob2o$o2bobo2bo$2o5b2o!

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » March 2nd, 2020, 12:44 am

One way to turn the tiles into a puzzle is to specify proportions of tiles as below, and solve the puzzle by building a still life with the given proportions. I ran through a series of patterns to find some with unique solutions up to symmetry. Here are two examples:
Screen Shot 2020-03-01 at 8.25.43 PM.png
Screen Shot 2020-03-01 at 8.25.43 PM.png (165.6 KiB) Viewed 8054 times
and
Screen Shot 2020-03-01 at 8.25.26 PM.png
Screen Shot 2020-03-01 at 8.25.26 PM.png (158.13 KiB) Viewed 8054 times
I haven't tried this with the magnet tiles yet. I have spent more time doing free-form construction of still lifes.

Here are some other examples with proportions given in the same order (i.e. above would be 10-10-0-2-1 and 15-4-7-1-0 respectively).
8-6-1-2-0 (eater 1)

Code: Select all

x = 4, y = 4, rule = B3/S23
2o$o$b3o$3bo!
10-12-2-2-1 block on cap (looks like a toilet seat to me!)

Code: Select all

x = 4, y = 6, rule = B3/S23
2b2o$2b2o2$4o$o2bo$b2o!
12-10-5-2-0 teardrop with claw

Code: Select all

x = 5, y = 6, rule = B3/S23
2b2o$bo2bo$bob2o$2bo$obo$2o!
14-6-1-4-0 broken snake

Code: Select all

x = 7, y = 3, rule = B3/S23
2b2ob2o$o2b2obo$2o!
17-4-10-1-0 barge with very long tail

Code: Select all

x = 8, y = 5, rule = B3/S23
3b2o$2bo2bobo$bobo2b2o$obo$bo!
I think given one of the codes from above and trying to assemble a still life with magnet tiles has the potential to be engaging even for non Game-of-Life people, and it would develop intuition about still lifes if nothing else.

hkoenig
Posts: 259
Joined: June 20th, 2009, 11:40 am

Re: Low-tech universal computing

Post by hkoenig » March 6th, 2020, 1:22 pm

you could make it a competitive game, too.

Each player given a random set of tiles to start. Each turn player can draw another tile, or build an object. Scoring based on the tiles used, and/or the size of the object. Play for set number of rounds, or to a set score, run out of tiles, etc.

Also allow building onto existing objects by adding inductors, replacing existing tiles, etc.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » March 6th, 2020, 3:15 pm

hkoenig wrote:
March 6th, 2020, 1:22 pm
you could make it a competitive game, too.

Each player given a random set of tiles to start. Each turn player can draw another tile, or build an object. Scoring based on the tiles used, and/or the size of the object. Play for set number of rounds, or to a set score, run out of tiles, etc.

Also allow building onto existing objects by adding inductors, replacing existing tiles, etc.
I was thinking along similar lines. You could allow removals with the penalty that you have to take the tiles back and the goal is to discard. If you can finish a complete, stabilized pattern, that can be removed and kept to score. The game ends (maybe) when someone uses all their tiles. Unused tiles carry a penalty. It might also have to end when everyone is stuck.

Hunting
Posts: 4395
Joined: September 11th, 2017, 2:54 am

Re: Low-tech universal computing

Post by Hunting » March 6th, 2020, 3:22 pm

pcallahan wrote:
March 6th, 2020, 3:15 pm
hkoenig wrote:
March 6th, 2020, 1:22 pm
you could make it a competitive game, too.

Each player given a random set of tiles to start. Each turn player can draw another tile, or build an object. Scoring based on the tiles used, and/or the size of the object. Play for set number of rounds, or to a set score, run out of tiles, etc.

Also allow building onto existing objects by adding inductors, replacing existing tiles, etc.
I was thinking along similar lines. You could allow removals with the penalty that you have to take the tiles back and the goal is to discard. If you can finish a complete, stabilized pattern, that can be removed and kept to score. The game ends (maybe) when someone uses all their tiles. Unused tiles carry a penalty. It might also have to end when everyone is stuck.
Like a card game? Waiting to play. Or the game ends when everyone discards all their card, and you cannot remove SL to add to score (You can penalty remove them) and after the game ends the one who build the biggest SL etc wins.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » March 7th, 2020, 1:13 pm

Hunting wrote:
March 6th, 2020, 3:22 pm
Like a card game? Waiting to play. Or the game ends when everyone discards all their card, and you cannot remove SL to add to score (You can penalty remove them) and after the game ends the one who build the biggest SL etc wins.
I have never been very good at playing competitive games let alone inventing them. People who are better at it might come up with something fun. Strictly speaking, there are 6 tiles, but one is completely blank so I don't bother producing it. The tile with all corners populated can only be completed as a block. That could play a strategic role, but it would have to be a lot less frequent than the other tiles.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Low-tech universal computing

Post by pcallahan » June 20th, 2021, 11:14 pm

I finally got around to printing the tiles from https://www.conwaylife.com/forums/viewt ... ile#p96637 on a magnetic sheet. I think it came out pretty well:
image920.png
image920.png (773.86 KiB) Viewed 2728 times
The representation of live cell adjacency doesn't require as much explanation as the flower petals, though on the downside, I'm not sure it's quite as easy to pick out if a cell has more than 3 neighbors (such as the crowded cell in the glider). The rhombus indicators of live/dead adjacency are a little more neutral than the green "leaves".

The next step will be to contour these tiles so they can only be placed so cells line up. I'm not going to do that with scissors though, if i ever do.

ColorfulGabrielsp138
Posts: 288
Joined: March 29th, 2021, 5:45 am

Re: Low-tech universal computing

Post by ColorfulGabrielsp138 » June 21st, 2021, 2:41 am

It seems like this technique can be used to solve the unique father problem.

Code: Select all

x = 21, y = 21, rule = LifeColorful
11.E$10.3E$10.E.2E$13.E4$2.2B$.2B$2B$.2B15.2D$19.2D$18.2D$17.2D4$7.C$
7.2C.C$8.3C$9.C!
I have reduced the glider cost of quadratic growth to eight and probably to seven. Looking for conduits...

Post Reply