How many cubes?

avril 2019 python, casse-tête

In [1]:
import itertools as it
import collections

picture of the game

How many colored cubes exist?

How many corners exist?

In [2]:
colors = sorted(['jaune', 'vert', 'cyan', 'rouge', 'bleu', 'noir'])

def cycles(elements, length):
    '''return all possible cycles using N elements
       from the given set of elements'''
    cycles = []
    for choice in it.combinations(elements, length):
        #choice = sorted(choice)
        cycles.extend((choice[0], *perm)
                      for perm in it.permutations(choice[1:]))
    return cycles

A corner is defined as a cycle (clockwise rotation) of three colors. To compare cycle together, the first color is choosen as the min.

In [3]:
all_possible_corners = cycles(colors, 3)
print('number of possible corners:', len(all_possible_corners))
print('\n', ', '.join(['->'.join(corner) for corner in all_possible_corners]))
number of possible corners: 40

 bleu->cyan->jaune, bleu->jaune->cyan, bleu->cyan->noir, bleu->noir->cyan, bleu->cyan->rouge, bleu->rouge->cyan, bleu->cyan->vert, bleu->vert->cyan, bleu->jaune->noir, bleu->noir->jaune, bleu->jaune->rouge, bleu->rouge->jaune, bleu->jaune->vert, bleu->vert->jaune, bleu->noir->rouge, bleu->rouge->noir, bleu->noir->vert, bleu->vert->noir, bleu->rouge->vert, bleu->vert->rouge, cyan->jaune->noir, cyan->noir->jaune, cyan->jaune->rouge, cyan->rouge->jaune, cyan->jaune->vert, cyan->vert->jaune, cyan->noir->rouge, cyan->rouge->noir, cyan->noir->vert, cyan->vert->noir, cyan->rouge->vert, cyan->vert->rouge, jaune->noir->rouge, jaune->rouge->noir, jaune->noir->vert, jaune->vert->noir, jaune->rouge->vert, jaune->vert->rouge, noir->rouge->vert, noir->vert->rouge

and cubes...

The top face color is define as the one with the "smallest" color. The bottom face can be one of the five remaining colors. The four sides are all possible loops of the four remaining colors.

indexing of faces

In [4]:
all_cubes = set()
color_set = set(colors[1:])
for bottom in color_set:
    remaining_colors = color_set.difference({bottom, })
    possible_sides = cycles(remaining_colors, 4)
    all_cubes.update([(colors[0], *sides, bottom) for sides in possible_sides])
print('number of cubes:', len(all_cubes))
number of cubes: 30

Solutions of the game

In [5]:
def start_the_cycle_at_the_min(c):
    id_min = c.index(min(c))
    return c[id_min:] + c[:id_min] 

def eight_corners(cube):
    '''list the eight corners of the given cube
        clockwise numbering
    '''
    sides_twice = 2*cube[1:-1]
    corners = []
    for i in range(4):
        duo = sides_twice[i:i+2]
        corners.append((cube[0], *duo[::-1]))
        corners.append((*duo, cube[-1]))

    return [start_the_cycle_at_the_min(corner)
            for corner in corners]
In [10]:
# The eight cubes in the game:
cubes = [['jaune', 'vert', 'noir', 'cyan', 'bleu', 'rouge'],
         ['jaune', 'vert', 'noir', 'bleu', 'cyan', 'rouge'],
         ['jaune', 'noir', 'cyan', 'rouge', 'vert', 'bleu'],
         ['jaune', 'noir', 'rouge', 'cyan', 'vert', 'bleu'],
         ['jaune', 'cyan', 'vert', 'rouge', 'bleu', 'noir'],
         ['jaune', 'cyan', 'vert', 'bleu', 'rouge', 'noir'],
         ['jaune', 'bleu', 'rouge', 'noir', 'cyan', 'vert'],
         ['jaune', 'cyan', 'rouge', 'bleu', 'noir', 'vert']]

def order_the_faces(cube):
    return (cube[0], *start_the_cycle_at_the_min(cube[1:-1]), cube[-1])

game_cubes = [order_the_faces(cube) for cube in cubes]
In [7]:
corner_to_cube = collections.defaultdict(set)
for cube in game_cubes:
    for corner in eight_corners(cube):
        corner_to_cube[corner].add(cube)
        
print(len(corner_to_cube))   # for 40 in total..
36
In [8]:
for the_cube in all_cubes:
    target_corners = eight_corners(the_cube)
    solutions = [corner_to_cube[corner] for corner in target_corners]
    
    for possibility in it.product(*solutions):
        
        if len(set(possibility)) == 8:
            
            print('\nfinal cube: [%s]' % ', '.join(the_cube))
            
            for cube, corner in zip(possibility, target_corners):
                print(' [%s]' % ', '.join(cube), '->'.join(corner))
final cube: [bleu, jaune, vert, rouge, noir, cyan]
 [jaune, bleu, rouge, cyan, vert, noir] bleu->vert->jaune
 [jaune, cyan, vert, noir, rouge, bleu] cyan->jaune->vert
 [jaune, cyan, rouge, vert, noir, bleu] bleu->rouge->vert
 [jaune, bleu, cyan, vert, noir, rouge] cyan->vert->rouge
 [jaune, bleu, cyan, vert, rouge, noir] bleu->noir->rouge
 [jaune, bleu, vert, noir, cyan, rouge] cyan->rouge->noir
 [jaune, bleu, noir, cyan, rouge, vert] bleu->jaune->noir
 [jaune, bleu, rouge, noir, cyan, vert] cyan->noir->jaune

final cube: [bleu, jaune, vert, rouge, noir, cyan]
 [jaune, bleu, rouge, cyan, vert, noir] bleu->vert->jaune
 [jaune, cyan, vert, noir, rouge, bleu] cyan->jaune->vert
 [jaune, bleu, rouge, noir, cyan, vert] bleu->rouge->vert
 [jaune, bleu, cyan, vert, noir, rouge] cyan->vert->rouge
 [jaune, bleu, cyan, vert, rouge, noir] bleu->noir->rouge
 [jaune, bleu, vert, noir, cyan, rouge] cyan->rouge->noir
 [jaune, bleu, noir, cyan, rouge, vert] bleu->jaune->noir
 [jaune, cyan, rouge, vert, noir, bleu] cyan->noir->jaune

final cube: [bleu, jaune, vert, rouge, noir, cyan]
 [jaune, bleu, rouge, cyan, vert, noir] bleu->vert->jaune
 [jaune, bleu, cyan, vert, rouge, noir] cyan->jaune->vert
 [jaune, cyan, rouge, vert, noir, bleu] bleu->rouge->vert
 [jaune, bleu, cyan, vert, noir, rouge] cyan->vert->rouge
 [jaune, cyan, vert, noir, rouge, bleu] bleu->noir->rouge
 [jaune, bleu, vert, noir, cyan, rouge] cyan->rouge->noir
 [jaune, bleu, noir, cyan, rouge, vert] bleu->jaune->noir
 [jaune, bleu, rouge, noir, cyan, vert] cyan->noir->jaune

final cube: [bleu, jaune, vert, rouge, noir, cyan]
 [jaune, bleu, rouge, cyan, vert, noir] bleu->vert->jaune
 [jaune, bleu, cyan, vert, rouge, noir] cyan->jaune->vert
 [jaune, bleu, rouge, noir, cyan, vert] bleu->rouge->vert
 [jaune, bleu, cyan, vert, noir, rouge] cyan->vert->rouge
 [jaune, cyan, vert, noir, rouge, bleu] bleu->noir->rouge
 [jaune, bleu, vert, noir, cyan, rouge] cyan->rouge->noir
 [jaune, bleu, noir, cyan, rouge, vert] bleu->jaune->noir
 [jaune, cyan, rouge, vert, noir, bleu] cyan->noir->jaune

final cube: [bleu, cyan, noir, rouge, vert, jaune]
 [jaune, cyan, rouge, vert, noir, bleu] bleu->noir->cyan
 [jaune, bleu, noir, cyan, rouge, vert] cyan->noir->jaune
 [jaune, bleu, rouge, cyan, vert, noir] bleu->rouge->noir
 [jaune, bleu, rouge, noir, cyan, vert] jaune->noir->rouge
 [jaune, bleu, vert, noir, cyan, rouge] bleu->vert->rouge
 [jaune, bleu, cyan, vert, rouge, noir] jaune->rouge->vert
 [jaune, cyan, vert, noir, rouge, bleu] bleu->cyan->vert
 [jaune, bleu, cyan, vert, noir, rouge] cyan->jaune->vert

final cube: [bleu, cyan, noir, rouge, vert, jaune]
 [jaune, cyan, rouge, vert, noir, bleu] bleu->noir->cyan
 [jaune, bleu, noir, cyan, rouge, vert] cyan->noir->jaune
 [jaune, bleu, cyan, vert, noir, rouge] bleu->rouge->noir
 [jaune, bleu, rouge, noir, cyan, vert] jaune->noir->rouge
 [jaune, bleu, vert, noir, cyan, rouge] bleu->vert->rouge
 [jaune, bleu, cyan, vert, rouge, noir] jaune->rouge->vert
 [jaune, cyan, vert, noir, rouge, bleu] bleu->cyan->vert
 [jaune, bleu, rouge, cyan, vert, noir] cyan->jaune->vert

final cube: [bleu, cyan, noir, rouge, vert, jaune]
 [jaune, cyan, rouge, vert, noir, bleu] bleu->noir->cyan
 [jaune, bleu, vert, noir, cyan, rouge] cyan->noir->jaune
 [jaune, bleu, rouge, cyan, vert, noir] bleu->rouge->noir
 [jaune, bleu, rouge, noir, cyan, vert] jaune->noir->rouge
 [jaune, bleu, noir, cyan, rouge, vert] bleu->vert->rouge
 [jaune, bleu, cyan, vert, rouge, noir] jaune->rouge->vert
 [jaune, cyan, vert, noir, rouge, bleu] bleu->cyan->vert
 [jaune, bleu, cyan, vert, noir, rouge] cyan->jaune->vert

final cube: [bleu, cyan, noir, rouge, vert, jaune]
 [jaune, cyan, rouge, vert, noir, bleu] bleu->noir->cyan
 [jaune, bleu, vert, noir, cyan, rouge] cyan->noir->jaune
 [jaune, bleu, cyan, vert, noir, rouge] bleu->rouge->noir
 [jaune, bleu, rouge, noir, cyan, vert] jaune->noir->rouge
 [jaune, bleu, noir, cyan, rouge, vert] bleu->vert->rouge
 [jaune, bleu, cyan, vert, rouge, noir] jaune->rouge->vert
 [jaune, cyan, vert, noir, rouge, bleu] bleu->cyan->vert
 [jaune, bleu, rouge, cyan, vert, noir] cyan->jaune->vert

final cube: [bleu, jaune, rouge, cyan, vert, noir]
 [jaune, bleu, noir, cyan, rouge, vert] bleu->rouge->jaune
 [jaune, cyan, vert, noir, rouge, bleu] jaune->rouge->noir
 [jaune, cyan, rouge, vert, noir, bleu] bleu->cyan->rouge
 [jaune, bleu, rouge, cyan, vert, noir] cyan->noir->rouge
 [jaune, bleu, rouge, noir, cyan, vert] bleu->vert->cyan
 [jaune, bleu, cyan, vert, rouge, noir] cyan->vert->noir
 [jaune, bleu, vert, noir, cyan, rouge] bleu->jaune->vert
 [jaune, bleu, cyan, vert, noir, rouge] jaune->noir->vert

final cube: [bleu, jaune, rouge, cyan, vert, noir]
 [jaune, bleu, noir, cyan, rouge, vert] bleu->rouge->jaune
 [jaune, cyan, vert, noir, rouge, bleu] jaune->rouge->noir
 [jaune, bleu, cyan, vert, noir, rouge] bleu->cyan->rouge
 [jaune, bleu, rouge, cyan, vert, noir] cyan->noir->rouge
 [jaune, bleu, rouge, noir, cyan, vert] bleu->vert->cyan
 [jaune, bleu, cyan, vert, rouge, noir] cyan->vert->noir
 [jaune, bleu, vert, noir, cyan, rouge] bleu->jaune->vert
 [jaune, cyan, rouge, vert, noir, bleu] jaune->noir->vert

final cube: [bleu, jaune, rouge, cyan, vert, noir]
 [jaune, bleu, cyan, vert, rouge, noir] bleu->rouge->jaune
 [jaune, cyan, vert, noir, rouge, bleu] jaune->rouge->noir
 [jaune, cyan, rouge, vert, noir, bleu] bleu->cyan->rouge
 [jaune, bleu, rouge, cyan, vert, noir] cyan->noir->rouge
 [jaune, bleu, rouge, noir, cyan, vert] bleu->vert->cyan
 [jaune, bleu, noir, cyan, rouge, vert] cyan->vert->noir
 [jaune, bleu, vert, noir, cyan, rouge] bleu->jaune->vert
 [jaune, bleu, cyan, vert, noir, rouge] jaune->noir->vert

final cube: [bleu, jaune, rouge, cyan, vert, noir]
 [jaune, bleu, cyan, vert, rouge, noir] bleu->rouge->jaune
 [jaune, cyan, vert, noir, rouge, bleu] jaune->rouge->noir
 [jaune, bleu, cyan, vert, noir, rouge] bleu->cyan->rouge
 [jaune, bleu, rouge, cyan, vert, noir] cyan->noir->rouge
 [jaune, bleu, rouge, noir, cyan, vert] bleu->vert->cyan
 [jaune, bleu, noir, cyan, rouge, vert] cyan->vert->noir
 [jaune, bleu, vert, noir, cyan, rouge] bleu->jaune->vert
 [jaune, cyan, rouge, vert, noir, bleu] jaune->noir->vert

final cube: [bleu, jaune, noir, cyan, rouge, vert]
 [jaune, bleu, cyan, vert, noir, rouge] bleu->noir->jaune
 [jaune, cyan, vert, noir, rouge, bleu] jaune->noir->vert
 [jaune, bleu, cyan, vert, rouge, noir] bleu->cyan->noir
 [jaune, bleu, rouge, cyan, vert, noir] cyan->vert->noir
 [jaune, bleu, vert, noir, cyan, rouge] bleu->rouge->cyan
 [jaune, bleu, noir, cyan, rouge, vert] cyan->rouge->vert
 [jaune, bleu, rouge, noir, cyan, vert] bleu->jaune->rouge
 [jaune, cyan, rouge, vert, noir, bleu] jaune->vert->rouge

final cube: [bleu, jaune, noir, cyan, rouge, vert]
 [jaune, bleu, cyan, vert, noir, rouge] bleu->noir->jaune
 [jaune, cyan, vert, noir, rouge, bleu] jaune->noir->vert
 [jaune, bleu, cyan, vert, rouge, noir] bleu->cyan->noir
 [jaune, bleu, rouge, noir, cyan, vert] cyan->vert->noir
 [jaune, bleu, vert, noir, cyan, rouge] bleu->rouge->cyan
 [jaune, bleu, noir, cyan, rouge, vert] cyan->rouge->vert
 [jaune, bleu, rouge, cyan, vert, noir] bleu->jaune->rouge
 [jaune, cyan, rouge, vert, noir, bleu] jaune->vert->rouge

final cube: [bleu, jaune, noir, cyan, rouge, vert]
 [jaune, bleu, cyan, vert, noir, rouge] bleu->noir->jaune
 [jaune, bleu, vert, noir, cyan, rouge] jaune->noir->vert
 [jaune, bleu, cyan, vert, rouge, noir] bleu->cyan->noir
 [jaune, bleu, rouge, cyan, vert, noir] cyan->vert->noir
 [jaune, cyan, vert, noir, rouge, bleu] bleu->rouge->cyan
 [jaune, bleu, noir, cyan, rouge, vert] cyan->rouge->vert
 [jaune, bleu, rouge, noir, cyan, vert] bleu->jaune->rouge
 [jaune, cyan, rouge, vert, noir, bleu] jaune->vert->rouge

final cube: [bleu, jaune, noir, cyan, rouge, vert]
 [jaune, bleu, cyan, vert, noir, rouge] bleu->noir->jaune
 [jaune, bleu, vert, noir, cyan, rouge] jaune->noir->vert
 [jaune, bleu, cyan, vert, rouge, noir] bleu->cyan->noir
 [jaune, bleu, rouge, noir, cyan, vert] cyan->vert->noir
 [jaune, cyan, vert, noir, rouge, bleu] bleu->rouge->cyan
 [jaune, bleu, noir, cyan, rouge, vert] cyan->rouge->vert
 [jaune, bleu, rouge, cyan, vert, noir] bleu->jaune->rouge
 [jaune, cyan, rouge, vert, noir, bleu] jaune->vert->rouge
In [9]:
8*7*6*5*4*3*2*3**6
Out[9]:
29393280
In [ ]: