Skip to content

Instantly share code, notes, and snippets.

@LieBtrau
Last active August 17, 2024 01:40
Show Gist options
  • Save LieBtrau/c03590a2e500eac50ddff7602c75387f to your computer and use it in GitHub Desktop.
Save LieBtrau/c03590a2e500eac50ddff7602c75387f to your computer and use it in GitHub Desktop.
Program to find solutions for SmartGames IQ-star puzzle game
#!/usr/bin/env python3
#
# This program is a solver for the [SmartGames IQ-Stars](https://www.smartgames.eu/nl/1-speler-spellen/iq-stars) puzzle game.
# 381 unique solutions can be found. My Thinkpad L580 takes 536s to find them.
import math, sys
from timeit import default_timer as timer
def place_block(block, color, x, y):
# Check if the block can be placed on the board at the given coordinates
# If the block can be placed, return True, otherwise False
for coord in block:
# Check if the x-coordinate is within the board
if x+coord[0] < 0 or x+coord[0] > 12:
return False
# Check if the y-coordinate is within the board
if y+coord[1] < 0 or y+coord[1] > 3:
return False
# Check if the block is not placed on an illegal place
if board[y+coord[1]][x+coord[0]] != 0:
return False
# Place the block on the board
for coord in block:
board[y+coord[1]][x+coord[0]] = color
return True
def remove_block(block, x, y):
# Remove the block from the board
# No safety measures here. Make sure the block is placed on the board.
for coord in block:
board[y+coord[1]][x+coord[0]] = 0
def rotate_block_fast(block):
# The block is 60° counter-clockwise rotated around the first coordinate, which is (0,0) in every case
# The rotated block is returned
# The number of mathematical operations is reduced to increase speed.
output_block = []
for coord in block:
# The following code block can be optimized, but is kept for clarity
sqrt3 = 1.73205 # math.sqrt(3)
# Convert to actual coordinates
x = coord[0]/2
y = coord[1] * sqrt3/2
# Rotate 60° counter-clockwise
x2 = round(x - y * sqrt3)
y2 = round(x + y / sqrt3)
output_block.append([x2, y2])
return output_block
def rotate_block(block):
# The block is 60° counter-clockwise rotated around the first coordinate, which is (0,0) in every case
# The rotated block is returned
output_block = []
for coord in block:
# The following code block can be optimized, but is kept for clarity
# Convert to actual coordinates
x = coord[0]/2
y = coord[1] * math.sqrt(3)/2
# Rotate 60° counter-clockwise
x2 = (x/2 - y * math.sqrt(3)/2) # x * cos(60°) - y * sin(60°) = x/2 - y * sqrt(3)/2
y2 = (x * math.sqrt(3)/2 + y/2) # x * sin(60°) + y * cos(60°) = x * sqrt(3)/2 + y/2
# Convert back to grid coordinates
x2 = round(x2 * 2)
y2 = round(y2 * 2 / math.sqrt(3))
output_block.append([x2, y2])
return output_block
def string_solution():
# Print the solution
output=""
for y in range(4):
for x in range(13):
if board[y][12-x] == 0:
output += " "
elif board[y][12-x] == 100:
output += " "
else:
color = board[y][12-x]
if color==1:
output += "P"
elif color==2:
output += "M"
elif color==3:
output += "B"
elif color==4:
output += "R"
elif color==5:
output += "O"
elif color==6:
output += "Y"
else:
output += "G"
output += "\t"
#output += "\r\n"
return output
def add_solution(solution):
# Add a solutions to the list of solutions
# A new solution will only be added when it's not a duplicate of a previous one.
for sol in solutions:
if sol==solution:
return False
solutions.append(solution)
return True
def find_solution(block_index=0):
# Find a solution for the board with the given blocks
# The board is filled with the blocks and the color of the block
# The blocks are placed on the board in the order of the list
# The blocks are rotated in the order of the list
# The board is modified with the solution
for x in range(13):
for y in range(4):
# Try to place the block on the board
rotated_block = rotated_blocks[block_index]
# Loop through all the possible rotations of that block
for block in rotated_block:
#print("Block", block_index, "Rotation", rotation)
if place_block(block, block_index+1, x, y):
if block_index == 6:
# The board is full
solution_str = string_solution()
if add_solution(solution_str):
print(string_solution())
else:
find_solution(block_index+1)
# Remove the block from the board
remove_block(block, x, y)
def main(argv):
# Find the solution
start = timer()
find_solution()
end = timer()
print("Lapsed seconds: ", round(end - start))
print("Solutions found: ", len(solutions))
# Define the board
# The board is 4 rows high and each row contains maximum 7 blocks. So the x-coordinates are 0 to 12.
# An array of 13x4 is used, which results in 52 places
board = [[0 for x in range(13)] for y in range(4)]
# The blocks occupy 26 grid locations in total. So the board has 26 illegal places, that must remain empty.
# Fill the illegal places with 100
for y in range(4):
for x in range(0,14, 2):
if y%2 != 0:
board[y][x] = 100
elif x < 12:
board[y][x+1] = 100
# Define the blocks
# The grid coordinates are arranged in triangle shapes. So corners of 60° are used.
# On a horizontal line, the coordinates are separated by 2 units. The line above that is shifted by the cosine of 60°, so 2*0.5 = 1 unit.
# The vertical distance between the lines is actually sqrt(3)/2, but we use 1 as unit for simplicity.
block_purple = ((-2,0), (0,0), (2,0))
block_magenta = ((0, 0), (1, 1), (3, 1), (4, 0))
block_blue = ((0, 0), (1, 1), (2, 0), (4, 0))
block_red = ((0, 0), (1,1), (2,0), (3,1))
block_orange = ((0, 0), (1, 1), (3, 1))
block_yellow = ((0, 0), (1, 1), (2, 0), (2,2))
block_green = ((0, 0), (2,0), (4, 0), (5,1))
blocks = (block_purple, block_magenta, block_blue, block_red, block_orange, block_yellow, block_green)
# Precalculate the rotated blocks
rotated_blocks = []
for block in blocks:
rotated_block = []
for rotation in range(6):
rotated_block.append(block)
block = rotate_block_fast(block)
rotated_blocks.append(rotated_block)
solutions = []
if __name__ == '__main__':
main(sys.argv[1:])
# Solutions for the SmartGames IQ-stars
Y = yellow block
B = blue block
P = purple block
G = green block
O = orange block
R = red block
M = magenta/pink block
Row 1 = Top Row 2 Row 3 Row4 = Bottom
Y Y Y B B B P Y G G G B P O G R R M P M O O R R M M
G R R B B B P G R R Y B P O G G Y M P M O O Y Y M M
G G O B B B P R G O O B P R R G Y M P M R Y Y Y M M
O O G B B B P R O G Y B P R R G Y M P M R G Y Y M M
G Y Y Y R R P G Y B R R P O G G B M P M O O B B M M
Y Y G G G O P Y G B O O P Y R R B M P M R R B B M M
B B B Y Y Y P O B M Y M P O R R M M P G O R R G G G
Y Y O M R R P Y O M R R P Y B O M M P G B B B G G G
O R R M Y Y P O R R M Y P O B M M Y P G B B B G G G
Y Y Y M M B P Y G M B B P R R G M B P O R R G G O O
Y Y Y B B B P Y G G G B P M G M R R P O M M R R O O
Y B B B R R P Y Y B R R P M Y M O O P G M M O G G G
Y Y M M R R P Y M O R R P Y B M O O P G B B B G G G
B B M M Y Y P B M R M Y P O B R R Y P G O O R G G G
O O R R Y Y P M O R R Y P M B B B Y P G M M B G G G
B B B R Y Y P M B R R Y P M O O R Y P G M M O G G G
M M Y Y Y B P O M Y B B P O M R R B P G O R R G G G
Y Y Y O P P P Y G O B B B R R G O M B M R R G G M M
Y Y O O P P P Y R R O B M Y R R G B B M G G G B M M
Y Y Y G P P P Y R R G B M O R R G B B M O O G B M M
G Y Y Y P P P G Y B R R M O G G B R R M O O B B M M
B B B Y P P P R B Y O O M R R Y Y G O M R G G G M M
R R B B P P P R R B O O M Y Y Y B G O M Y G G G M M
O G R R P P P O G R R Y M O G B Y Y Y M G B B B M M
B B R R P P P B G R R Y M O B G Y Y Y M O O G G M M
Y Y G G P P P Y R R G M O Y B R R G M O B B B M M O
Y Y Y B P P P Y R R B M M O R R B B G M O O G G G M
O B B B P P P O O B Y M M R R Y Y Y G M R R G G G M
Y Y Y B P P P Y O B B M M O O B G R R M G G G R R M
O Y Y B P P P O Y B B M M O Y B G R R M G G G R R M
Y Y Y G P P P Y R R G M M O R R B G G M O O B B B M
B B B G P P P R B Y G M M R R Y O G G M R Y Y O O M
B B B Y P P P R B Y Y M M R R O O Y G M R O G G G M
Y Y B G P P P Y B B G M M Y B O G R R M O O G R R M
Y Y Y G P P P Y B B G M M R R B O G G M R R B O O M
B Y O O P P P B Y Y O M M B B Y G R R M G G G R R M
B Y Y Y P P P B Y O O M M B B O G R R M G G G R R M
B Y Y Y P P P B Y R R M M B B O R R G M O O G G G M
B R R G P P P B R R G M M B B Y O G G M Y Y Y O O M
Y Y G G P P P Y R R G M M Y B R R G O M B B B O O M
Y Y R G P P P Y R R G M M Y B R O G G M B B B O O M
B B R R P P P B R R Y M M O B Y Y Y G M O O G G G M
Y B B B P P P Y Y B G G G O Y M G M R R O O M M R R
O B B B P P P O Y B G G G O Y M G M R R Y Y M M R R
O B R R P P P O B R R M M O B B G M Y M G G G Y Y Y
B R R G P P P B R R G M M B B O G M Y M O O G Y Y Y
O G R R P P P O G R R M M O B G G M Y M B B B Y Y Y
B B R G P P P B R R G M M O B R G M Y M O O G Y Y Y
O O R R P P P B O R R M M B B B G M Y M G G G Y Y Y
Y Y Y M P P P Y G M B B B R R G M M B O R R G G O O
B B B Y P P P R B Y M M O R R Y Y G M O R G G G M O
R R B B P P P R R B M M O Y Y Y B G M O Y G G G M O
B B B G P P P M B M G Y R O M M G Y R R O O G Y Y R
Y Y O O P P P Y B M O R R Y B B M R R G B M M G G G
O G M M P P P O G Y M R R O G Y M B R R G Y Y B B B
B O M M P P P B O O M R R B B Y M R R G Y Y Y G G G
O Y M M P P P O Y Y M R R O B Y M R R G B B B G G G
Y O O G P P P Y Y O G R R M Y M G B R R M M G B B B
Y Y Y G P P P Y O O G R R M O M G B R R M M G B B B
Y B B B P P P Y Y B G G G M Y M G O R R M M O O R R
Y B B B P P P Y Y B R R O M Y M R R G O M M G G G O
B B O O P P P B O Y Y R R M B M Y R R G M M Y G G G
Y Y M M P P P Y M G R R O Y B M G R R O B B B G G O
B B M M P P P B M Y Y R R O B M Y R R G O O Y G G G
B G G O P P P B M G O O R B B M G Y R R M M Y Y Y R
B O O G P P P B M O G Y R B B M G Y R R M M G Y Y R
Y Y M M P P P Y M O M R R Y O O G B R R G G G B B B
B B B G P P P M B O G Y R M O O G Y R R M M G Y Y R
B B B Y P P P M B G Y Y R M O O G Y R R M M O G G R
Y M M G P P P Y Y M G R R O Y M G B R R O O G B B B
O M M G P P P O Y M G R R O Y M G B R R Y Y G B B B
M M G Y P P P O M G Y Y R O M G B Y R R O G B B B R
G G B B B P O R G M B P O R R G M P Y O R M M Y Y Y
Y Y O M G G G Y O M G R R Y B O M M R R B B B P P P
G G Y Y Y B B O G Y R R B O M G M R R B O M M P P P
Y Y M G G G O Y M G R R O Y B M M R R O B B B P P P
R R G G B B B R R M G O B Y Y Y M G O O Y M M P P P
Y Y G G G B B Y G M R R B Y O O M R R B O M M P P P
G G B B B Y O R G M B Y O R R G M Y Y O R M M P P P
G G B B B O O R G M B O Y R R G M Y Y Y R M M P P P
R R G G B B O R R M G B O Y Y Y M G B O Y M M P P P
Y O O R R B B Y Y O R R B M Y M G G G B M M G P P P
Y Y Y R R B B Y O O R R B M O M G G G B M M G P P P
Y B B B G G G Y Y B G R R M Y M O O R R M M O P P P
Y B B B R R O Y Y B R R O M Y M G G G O M M G P P P
Y Y M M G G G Y M O G R R Y B M O O R R B B B P P P
Y Y G G B B B Y M M G O B Y R R M G O O R R M P P P
Y Y G G B B O Y M M G B O Y R R M G B O R R M P P P
B B B G G G Y M B G R R Y M O O R R Y Y M M O P P P
Y M M R R B B Y Y M R R B O Y M G G G B O O G P P P
O M M R R B B O Y M R R B O Y M G G G B Y Y G P P P
Y Y Y P P P B Y G G G B B O G R R M B M O O R R M M
G R R P P P B G R R Y B B O G G Y M B M O O Y Y M M
G G O P P P B R G O O B B R R G Y M B M R Y Y Y M M
O O G P P P B R O G Y B B R R G Y M B M R G Y Y M M
B B Y P P P G B Y Y G G G O B M Y M R R O O M M R R
Y Y Y P P P O Y G G G B O M G M R R B O M M R R B B
Y Y Y P P P B Y G G G B B M G M R R B O M M R R O O
B B Y P P P G B Y Y G G G M B M Y O R R M M O O R R
B B B P P P G M B Y G G G M Y Y Y O R R M M O O R R
B B B P P P G M B Y G G G M O O Y Y R R M M O Y R R
O G R R Y Y Y O G R R Y M O G B P P P M G B B B M M
B B R R Y Y Y B G R R Y M O B G P P P M O O G G M M
Y Y M M O R R Y M O O R R Y B M P P P G B B B G G G
M M B B B R R O M Y B R R O M Y P P P G O Y Y G G G
G G B B B Y Y R G M B P Y R R G M P Y O R M M P O O
O G M M B B B O G Y M P B O G Y M P R R G Y Y P R R
Y O O G B B B Y Y O G P B M Y M G P R R M M G P R R
Y Y Y G B B B Y O O G P B M O M G P R R M M G P R R
Y Y M M B B B Y M O M P B Y O O G P R R G G G P R R
Y M M G B B B Y Y M G P B O Y M G P R R O O G P R R
O M M G B B B O Y M G P B O Y M G P R R Y Y G P R R
Y Y G G G M M Y G B P M O Y R R B P M O R R B B P O
B B G G G Y Y B G P P P Y O B R R M Y M O O R R M M
B B G G G Y Y B G P P P Y M B M R R Y O M M R R O O
B B B P Y Y Y M B G P Y R M O O G P R R M M O G G R
M M G P Y Y Y O M G P Y R O M G B P R R O G B B B R
Y Y Y R R M M Y B R R M O B B G G G M O B G P P P O
B Y Y Y G G G B Y M G M R B B O M M R R O O P P P R
Y Y Y G G G O Y M G M O O R R M M B B B R R P P P B
Y G G R R B B Y Y G R R B M Y M G O O B M M P P P O
Y B B B G G G Y Y B G O R M Y M O O R R M M P P P R
Y G G B B O O Y Y G B O R M Y M G B R R M M P P P R
B B G G Y Y Y B O O G Y R M B M O G R R M M P P P R
B B R R G G G B R R G Y O M B M Y Y Y O M M P P P O
O O Y Y Y R R M O Y G R R M G G G B B B M M P P P B
M M R R B B B O M R R Y B O M G G G Y Y O G P P P Y
M M G Y Y R R O M G Y R R O M G Y B B B O G P P P B
M M G B Y Y Y O M G B Y R O M G B B R R O G P P P R
M M G G Y Y Y O M B G Y R O M B B G R R O B P P P R
Y Y P P P O O Y R R M O M Y B R R M M G B B B G G G
Y Y P P P M M Y R R B M O Y R R G B M O G G G B B O
O G P P P R R O G Y M R R O G Y M B B B G Y Y M M B
O G P P P B B O G Y M M B O G Y M R R B G Y Y M R R
G G P P P B O R G M B B O R R G M B Y O R M M Y Y Y
G G P P P O Y R G M O O Y R R G M B Y Y R M M B B B
Y Y P P P R R Y B M O R R Y B B M O O G B M M G G G
M M P P P B B O M G G G B O M G Y R R B O Y Y Y R R
M M P P P B B O M Y G G B O M Y R R G B O Y Y R R G
M M P P P Y Y O M B B B Y O M R R B Y G O R R G G G
M M P P P G Y O M G G G Y O M R R B Y Y O R R B B B
M M P P P R R O M Y B R R O M Y B B B G O Y Y G G G
Y Y R R G G G Y R R G M O Y B P P P M O B B B M M O
Y Y R R G G G Y R R G M M Y B P P P O M B B B O O M
G R R M M B B G R R P M B O G G P M Y B O O P Y Y Y
O O G M M B B R O G P M B R R G P M Y B R G P Y Y Y
B R R M M Y Y B R R P M Y B B O P M Y G O O P G G G
B B R M M Y Y B R R P M Y O B R P M Y G O O P G G G
B B R R G Y Y B R R P G Y M B M P G Y O M M P G O O
B B R R Y Y Y B R R P Y O M B M P O O G M M P G G G
B B R R O Y Y B R R P O Y M B M P O Y G M M P G G G
B B B G Y Y Y O B P G Y M O R R P G G M O R R P M M
Y Y M M G G G Y M P G O O Y B M P O R R B B B P R R
Y Y M M G G G Y M P G R R Y B M P O R R B B B P O O
Y Y M M G G G Y M P G R R Y B M P R R O B B B P O O
Y Y M M G G G Y M P G O R Y B M P O R R B B B P O R
Y Y M M G G G Y M P G O O Y B M P R R O B B B P R R
Y Y M M G G G Y M P G R O Y B M P R R O B B B P R O
B B B P Y Y Y R B P M Y M R R P O M M G R O O G G G
Y Y Y P M R R Y B P M R R B B P O M M G B O O G G G
Y Y Y P G G G Y B P G M M B B P O R R M B O O R R M
B B B P G G G R B P G M M R R P O M Y M R O O Y Y Y
B B B P G G G O B P G Y R O M P M Y R R O M M Y Y R
B B B P R Y Y O B P R R Y O M P M R Y G O M M G G G
O G P R R Y Y O G P R R Y O G B P M Y M G B B B M M
B B P R R Y Y B G P R R Y O B G P M Y M O O G G M M
O O P G Y Y Y R O P G Y M R R B P G G M R B B B M M
Y Y R R B B B Y R R O O B Y G G G M O M G P P P M M
Y Y R R O O B Y R R O B B Y G G G M B M G P P P M M
O R R Y Y Y B O R R Y B B O G G G M B M G P P P M M
O G B R R Y Y O G B R R Y O G B B M Y M G P P P M M
O G G R R Y Y O B G R R Y O B B G M Y M B P P P M M
G G B B Y Y Y R G B M Y M R R G B M M O R P P P O O
G G Y Y Y O O R G Y B O M R R G B B B M R P P P M M
O O B G Y Y Y R O B G Y M R R B B G G M R P P P M M
G G B B Y Y Y R G B O Y M R R G B O O M R P P P M M
B B B G G G Y R B G O M Y R R O O M Y Y R P P P M M
G G B B O O Y R G B O M Y R R G B M Y Y R P P P M M
G G B B B Y Y R G M B M Y R R G M M Y O R P P P O O
Y Y R R G G G Y R R G M M Y O O B B B M O P P P B M
O O Y Y G G G R O Y G M M R R Y B B B M R P P P B M
Y Y R R M M O Y R R M B O Y G G G M B O G P P P B B
Y Y R R M M B Y R R M B B Y G G G M B O G P P P O O
G G Y Y Y B B R G Y M M B R R G M O M B R P P P O O
O P P P Y Y Y O R R M Y M O B R R M M G B B B G G G
Y P P P G G G Y Y R G B M O Y R R B B M O O R B M M
O P P P G G G O Y R G B M O Y R R B B M Y Y R B M M
B P P P G M M B G G G M O B B Y R R M O Y Y Y R R O
B P P P M R R B G G M R R B B Y G M M O Y Y Y G O O
B P P P M R R B O O M R R B B Y O M M G Y Y Y G G G
B P P P G G G B O O G M M B B Y O R R M Y Y Y R R M
O P P P G G G O R R G M M O B R R M Y M B B B Y Y Y
Y P P P M M B Y Y R M B B O Y R R M B G O O R G G G
O P P P M M B O Y R M B B O Y R R M B G Y Y R G G G
B P P P M M O B G G M O O B B Y G M R R Y Y Y G R R
O P P P B B B O O M R R B Y Y Y M R R G Y M M G G G
O P P P G G G O O M G R R Y Y Y M B R R Y M M B B B
O P P P G G G O B M G Y R O B B M Y R R B M M Y Y R
O P P P R Y Y O B M R R Y O B B M R Y G B M M G G G
O P P P B B B O O M M Y B R R M Y Y Y G R R M G G G
Y P P P B B B Y Y O R R B M Y M O R R G M M O G G G
Y P P P G G G Y Y O G R R M Y M O B R R M M O B B B
Y P P P G G G Y Y B G O O M Y M B O R R M M B B R R
Y P P P G G G Y Y B G R R M Y M B O R R M M B B O O
Y P P P G G G Y Y B G R R M Y M B R R O M M B B O O
Y P P P G G G Y Y B G O R M Y M B O R R M M B B O R
Y P P P G G G Y Y B G O O M Y M B R R O M M B B R R
Y P P P G G G Y Y B G R O M Y M B R R O M M B B R O
B P P P G G G B M O G Y R B B M O Y R R M M O Y Y R
B P P P R Y Y B M O R R Y B B M O R Y G M M O G G G
B P P P Y Y Y B M R R Y O B B M R R G O M M G G G O
G P P P B B B G M M Y Y B O G G M Y R R O O M Y R R
G P P P R B B G M M R R B O G G M R Y B O O M Y Y Y
G P P P Y Y Y G M M B Y R O G G M B R R O O M B B R
G P P P R R Y G M M R R Y O G G M B Y Y O O M B B B
B P P P G G G B M M G Y R B B O M Y R R O O M Y Y R
B P P P R Y Y B M M R R Y B B O M R Y G O O M G G G
O P P P B B B O M M R R B O M Y M R R G Y Y Y G G G
O P P P G G G O M M G R R O M Y M B R R Y Y Y B B B
B B B G Y Y Y R B P G Y M R R P G O O M R P G O M M
M M G G Y Y Y O M P G Y R O M P B G R R O P B B B R
Y Y Y G G G B Y P G O B B R R P O M B M R R P O M M
Y Y Y O G G G Y P O G B M R R P O B B M R R P B M M
Y Y Y B B M M Y P G B M O R R P G B M O R R P G G O
Y Y Y G G G O Y P G M O O R R P M B B B R R P M M B
B B R R M Y Y B P R R M Y O B P M M Y G O O P G G G
Y Y Y O M M B Y P O M B B R R P O M B G R R P G G G
Y Y Y M B B B Y P M O O B R R P M M O G R R P G G G
Y Y Y M O O B Y P M O B B R R P M M B G R R P G G G
Y Y Y G G G O Y P G M M O R R P M B M O R R P B B B
B P R R Y Y Y B P R R Y M B B P G O O M G G G O M M
O P R R M Y Y O P R R M Y O B P M M Y G B B B G G G
R R B B B O O R R G B O M G G G Y Y Y M P P P Y M M
B G R R Y Y Y B G R R Y M B B G G O O M P P P O M M
B R R G Y Y Y B R R G Y M B B O O G G M P P P O M M
Y Y G G G R R Y G O M R R Y O O M B B B P P P M M B
R R O O M B B R R G O M B G G G M M Y B P P P Y Y Y
O B R R M Y Y O B R R M Y O B B M M Y G P P P G G G
O O R R M Y Y B O R R M Y B B B M M Y G P P P G G G
Y Y G G G B B Y G O M M B Y O O M R R B P P P M R R
B R R M G Y Y B R R M G Y B B M M G Y O P P P G O O
B R R M Y Y Y B R R M Y O B B M M O O G P P P G G G
B R R M O Y Y B R R M O Y B B M M O Y G P P P G G G
O R R M M B B O R R G M B O G G G M Y B P P P Y Y Y
B R R M M Y Y B R R O M Y B B O O M Y G P P P G G G
R R M M O B B R R G M O B G G G M O Y B P P P Y Y Y
P P P Y Y Y B O G G Y B B O R R G M B M O R R G M M
P P P G G G B O O G Y B B O R R Y M B M R R Y Y M M
P P P G G G B R R G Y B B O R R Y M B M O O Y Y M M
P P P G G G B R R G O B B R R Y O M B M Y Y Y O M M
P P P G G G B R R G Y B B R R O Y M B M O O Y Y M M
P P P G G G B O R G Y B B O R R Y M B M O R Y Y M M
P P P G G G B O O G Y B B R R O Y M B M R R Y Y M M
P P P G G G B R O G Y B B R R O Y M B M R O Y Y M M
P P P G B Y Y G G G B B Y R R O B M Y M R R O O M M
P P P O O Y Y G G B B O Y R R G B M Y M R R G B M M
P P P R R Y Y G G G R R Y G B O O M Y M B B B O M M
P P P O Y Y Y R B O M Y M R R B O M M G R B B G G G
P P P B Y Y Y R B B M Y M R R B O M M G R O O G G G
P P P O G G G R R O G B M R R Y O B B M Y Y Y B M M
P P P G Y Y Y O O B G Y M O R R B G G M R R B B M M
P P P G Y Y Y R R B G Y M O R R B G G M O O B B M M
P P P G Y Y Y R R B G Y M R R O B G G M O O B B M M
P P P G Y Y Y O R B G Y M O R R B G G M O R B B M M
P P P G Y Y Y O O B G Y M R R O B G G M R R B B M M
P P P G Y Y Y R O B G Y M R R O B G G M R O B B M M
P P P B Y Y Y R R B B Y M R R B G O O M G G G O M M
P P P G Y Y Y G G G B Y M R R O B B B M R R O O M M
P P P G Y Y Y B B B G Y M R R B G O O M R R G O M M
P P P G Y Y Y G G G B Y M R R B B O O M R R B O M M
P P P O G G G R O O G Y M R R B Y Y Y M R B B B M M
P P P G Y Y Y R O O G Y M R R B O G G M R B B B M M
P P P G G G Y R B G O M Y R R B O M Y Y R B B O M M
P P P B B M M R R G B M O R R Y G B M O Y Y Y G G O
P P P Y M R R O O Y M R R O B Y Y M M G B B B G G G
P P P Y G G G O O Y G M M O B Y Y R R M B B B R R M
P P P G G G O R R G M O O R R Y M B B B Y Y Y M M B
P P P O O B B G G O M Y B R R G M Y Y B R R G M M Y
P P P G G G O R B G M Y O R R B M Y Y O R B B M M Y
P P P G B Y Y G G G B B Y R R M B M Y O R R M M O O
P P P O G G G R B O G M M R R B O M Y M R B B Y Y Y
P P P B G G G R B B G M M R R B O M Y M R O O Y Y Y
P P P O M M B R R O M B B R R Y O M B G Y Y Y G G G
P P P M B B B R R M O O B R R Y M M O G Y Y Y G G G
P P P M O O B R R M O B B R R Y M M B G Y Y Y G G G
P P P M G G G R B M G O O R R B M M Y O R B B Y Y Y
P P P G G G Y R B G M M Y R R B M O Y Y R B B M O O
P P P M Y Y Y G G G M Y O G B M M R R O B B B R R O
P P P M M B B O G G G M B O G R R M Y B O R R Y Y Y
P P P M M B B R R O O M B R R O G M Y B G G G Y Y Y
P P P M M Y Y O B B B M Y O R R B M Y G O R R G G G
P P P M M Y Y G G B B M Y R R G B M Y O R R G B O O
P P P M M Y Y O O R R M Y O B R R M Y G B B B G G G
P P P B G G G O B B G Y R O M B M Y R R O M M Y Y R
P P P B R Y Y O B B R R Y O M B M R Y G O M M G G G
P P P G G G O R R G M M O R R Y M B M O Y Y Y B B B
P P P M M B B O O M G G B O R R M Y G B R R Y Y Y G
P P P M M B B R R M G G B O R R M Y G B O O Y Y Y G
P P P M M B B R R M G G B R R O M Y G B O O Y Y Y G
P P P M M B B O R M G G B O R R M Y G B O R Y Y Y G
P P P M M B B O O M G G B R R O M Y G B R R Y Y Y G
P P P M M B B R O M G G B R R O M Y G B R O Y Y Y G
P P P M M B O G G M B B O R R G M B Y O R R G Y Y Y
P P P M M O Y G G M O O Y R R G M B Y Y R R G B B B
P P P M M Y Y O O M B M Y O R R B B Y G R R B G G G
P P P M M Y Y R R M B M Y O R R B B Y G O O B G G G
P P P M M Y Y R R M B M Y R R O B B Y G O O B G G G
P P P M M Y Y O R M B M Y O R R B B Y G O R B G G G
P P P M M Y Y O O M B M Y R R O B B Y G R R B G G G
P P P M M Y Y R O M B M Y R R O B B Y G R O B G G G
P P P Y B B B O M Y R R B O M Y Y R R G O M M G G G
P P P R R B B O M R R G B O M G G G Y B O M M Y Y Y
P P P Y G G G O M Y G R R O M Y Y B R R O M M B B B
P P P R R Y Y O M B R R Y O M B B B Y G O M M G G G
P P P B B B O R R M M B O R R M G M Y O G G G Y Y Y
P P P O O B B R R M M O B R R M G M Y B G G G Y Y Y
P P P B B B Y O M M G B Y O M R R G Y Y O M R R G G
P P P Y B B B M G G Y Y B M O O G Y R R M M O G R R
P P P O B B B M Y O R R B M Y Y O R R G M M Y G G G
P P P G G G O M Y G R B O M Y Y R R B O M M Y R B B
P P P B B B Y M G G G B Y M G R R O Y Y M M R R O O
P P P B B B Y M O O G B Y M O R R G Y Y M M R R G G
P P P R R B B M Y G R R B M Y Y G O O B M M Y G G O
P P P O O B B M Y O G G B M Y Y R R G B M M Y R R G
P P P G G B B M R R Y G B M R R Y O G B M M Y Y O O
P P P G O B B M R R G O B M R R G O Y B M M G Y Y Y
P P P G G G B M Y G R B B M Y Y R R B O M M Y R O O
P P P Y Y Y B M R R Y B B M R R O O B G M M O G G G
P P P B Y Y Y M R R B Y O M R R B B G O M M G G G O
P P P O O Y Y M R R B O Y M R R B B Y G M M B G G G
P P P O G G G M Y O G R R M Y Y O B R R M M Y B B B
P P P B B O O M Y G B O R M Y Y G B R R M M Y G G R
P P P O G G G M O O G Y R M B B B Y R R M M B Y Y R
P P P O R Y Y M O O R R Y M B B B R Y G M M B G G G
P P P O O R R M Y O B R R M Y Y B B B G M M Y G G G
P P P G Y Y Y M R R G Y O M R R B G G O M M B B B O
P P P O B B B M M Y O O B M Y Y Y G R R M G G G R R
P P P Y B B B M M Y R R B M O Y Y R R G M O O G G G
P P P Y Y Y O M M G Y O O M R R G B B B M R R G G B
P P P R R B B M M R R G B M O G G G Y B M O O Y Y Y
P P P Y Y Y B M M O Y B B M R R O O B G M R R G G G
P P P Y G G G M M Y G R R M O Y Y B R R M O O B B B
P P P G G G Y M M G O O Y M R R O B Y Y M R R B B B
P P P R R Y Y M M B R R Y M O B B B Y G M O O G G G
P P P G Y Y Y M M B G Y O M B B G R R O M B G R R O
P P P R R Y Y M M B R R Y M B B O O Y G M B O G G G
P P P O G G G M M O G Y R M B M O Y R R B B B Y Y R
P P P G G G O M M G R R O M B M R R Y O B B B Y Y Y
P P P O O Y Y M M O R R Y M B M R R Y G B B B G G G
P P P R R Y Y M M O R R Y M B M O O Y G B B B G G G
P P P R R Y Y M M R R O Y M B M O O Y G B B B G G G
P P P O R Y Y M M O R R Y M B M O R Y G B B B G G G
P P P O O Y Y M M R R O Y M B M R R Y G B B B G G G
P P P R G Y Y M M R R G Y M B M R G Y O B B B G O O
P P P R Y Y Y M M R R Y O M B M R O O G B B B G G G
P P P R O Y Y M M R R O Y M B M R O Y G B B B G G G
R R Y Y Y M M R R Y B M O P P P G B M O G G G B B O
R R O M M B B R R O O M B P P P G M Y B G G G Y Y Y
O G G R R Y Y O P G R R Y O P B G M Y M P B B B M M
O B B B Y Y Y O P B M Y M O P R R M M G P R R G G G
O B B B G G G O P B G M M O P R R M Y M P R R Y Y Y
P Y Y Y G G G P Y R G B M O P R R B B M O O R B M M
P B B B M R R P Y B M R R O P Y Y M M G O O Y G G G
P B B B G G G P Y B G M M O P Y Y R R M O O Y R R M
P Y Y Y M M B P Y R M B B O P R R M B G O O R G G G
P R R M M Y Y P R R B M Y O P B B M Y G O O B G G G
P Y Y Y B B B P Y O R R B M P M O R R G M M O G G G
P R R G G B B P R R Y G B M P M Y O G B M M Y Y O O
P R R G O B B P R R G O B M P M G O Y B M M G Y Y Y
P R R Y Y Y B P R R Y B B M P M O O B G M M O G G G
P R R B Y Y Y P R R B Y O M P M B B G O M M G G G O
P R R O O Y Y P R R B O Y M P M B B Y G M M B G G G
P Y Y Y G G G P Y O G R R M P M O B R R M M O B B B
P Y Y Y G G G P Y B G O O M P M B O R R M M B B R R
P Y Y Y G G G P Y B G R R M P M B O R R M M B B O O
P Y Y Y G G G P Y B G R R M P M B R R O M M B B O O
P Y Y Y G G G P Y B G O R M P M B O R R M M B B O R
P Y Y Y G G G P Y B G O O M P M B R R O M M B B R R
P Y Y Y G G G P Y B G R O M P M B R R O M M B B R O
P O G G Y Y Y P O O G Y R M P M B G R R M M B B B R
P R R G Y Y Y P R R G Y O M P M B G G O M M B B B O
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment