Teaser 3207: Dodecahedra
From The Sunday Times, 10th March 2024 [link] [link]
Fabulé’s next creation will be a set of equal-sized silver regular dodecahedra, but some of the faces will be gold-plated. He is undecided whether to go ahead with either a “Charm” set or a “Partial” set.
“Charm” is composed of dodecahedra with at least one gold-plated face but with no gold-plated face having a common side with more than one other gold-plated face. “Partial” is composed of dodecahedra with exactly six gold-plated faces. All the items in each set are distinguishable.
What is the maximum number of dodecahedra possible in (a) “Charm”, (b) “Partial”?
[teaser3207]
Jim Randell 5:58 pm on 8 March 2024 Permalink |
See also: Teaser 2538.
This Python program constructs the 60 rotations of the faces of a regular dodecahedron, and then uses them to count the number of distinguishable dodecahedra in each set.
It runs in 140ms. (Internal runtime is 64ms).
Run: [ @replit ]
from enigma import (rotate, flatten, irange, subsets, printf) # arrangement of adjacent faces adj = { 0: [1, 2, 3, 4, 5], 1: [0, 5, 8, 7, 2], 2: [0, 1, 7, 6, 3], 3: [0, 2, 6, 10, 4], 4: [0, 3, 10, 9, 5], 5: [0, 4, 9, 8, 1], } # add in the opposite faces opp = lambda f: 11 - f # opposite face adj.update((opp(k), list(opp(v) for v in reversed(vs))) for (k, vs) in list(adj.items())) # make a set of rotations with upper face U, adjacent faces fs def make_rots(U, fs): for _ in fs: r = [U] + fs r.extend(reversed(list(opp(f) for f in r))) yield r fs = rotate(fs, 1) # construct the 60 rotations of the dodecahedron rots = flatten(make_rots(k, vs) for (k, vs) in adj.items()) # apply a rotation to a set of faces rot = lambda r, fs: tuple(sorted(r[f] for f in fs)) # canonical colouring for a set of faces canonical = lambda fs: min(rot(r, fs) for r in rots) # "Charm" = colour some faces; no more than 2 adjacent rs = set() # choose coloured faces for fs in subsets(irange(12), min_size=1, max_size=4, fn=set): # check no coloured face has more than 1 coloured neighbour if not any(len(fs.intersection(adj[f])) > 1 for f in fs): rs.add(canonical(fs)) printf("Charm = {n} dodecahedra", n=len(rs)) # "Partial" = colour 6 of the faces rs = set(canonical(fs) for fs in subsets(irange(12), size=6)) printf("Partial = {n} dodecahedra", n=len(rs))Solution: (a) Charm has a maximum of 11 dodecahedra; (b) Partial has a maximum of 24 dodecahedra.
Here is a diagram of the 11 possible arrangements for “Charm”:
There is 1 colouring with 1 gold face; 3 colourings with 2 gold faces; 3 colourings with 3 gold faces; 4 colourings with 4 gold faces.
The first 4 colourings in the diagram have no shared edges between gold faces, the next 4 have one pair of faces that share an edge, and the final 3 have two separate pairs of faces that share an edge.
And here are the 24 possible arrangements for “Partial” (6 coloured faces):
LikeLike
Hugo 9:08 am on 18 March 2024 Permalink |
I had a think about other Platonic solids.
For the tetrahedron there is one way to have no gilt faces, one way to gild one face, one way to gild two faces (because any two faces share an edge), one way to gild three faces (because that leaves just one face silver so is just the inverse of one gilt face), and one way to gild all four faces.
For the cube there is one way to have no gilt faces or all six faces gilt, one way to gild one face or five faces, two ways to gild two faces (either adjacent or opposite) and therefore two ways to gild four faces, two ways to gild three faces (all sharing a vertex, or two opposite faces and one between them).
The octahedron exceeds my power of visualizing in three dimensions. Anyone have any ideas?
LikeLike
Jim Randell 9:41 am on 18 March 2024 Permalink |
In Teaser 2538 we looked at colouring some of the the faces of an octahedron.
The code for calculating the “Partial” collection can be used to find the colourings of the dodcahedron:
OEIS A098112 gives the total number of colourings of the icosahedron as 17824.
LikeLike
Hugo 10:35 am on 18 March 2024 Permalink |
Thank you, Jim. I’d forgotten that.
LikeLike