Brain-Teaser 455: [Darts teams]
From The Sunday Times, 1st February 1970 [link]
Every week we field a village darts team of 3 men, one from each of our pubs (Plough, Queen’s Head, and Roebuck). Altogether we can call on 14 players (whose names, luckily, start respectively with the first 14 letters of the alphabet): five of them frequent the Plough, six the Queen’s Head and seven the Roebuck, the apparent discrepancy is explained by the thirsts of Ernie, Fred, Len and Mark, all of whom are “two-pub men” and are thus eligible to represent either of their haunts.
For over three years we have picked a different team each week and have just exhausted all 162 possible combinations. The last two teams were:
Joe, Nigel, Charlie
Charlie, Fred, HarryFor the next seven weeks we are waiving the one-man-per-pub rule and have picked teams which have not so far played together. The are:
Ernie, Len, Mark
Ian, Fred, Alan
Joe, Fred, George
Len, Mark, Keith
Fred, Keith, Nigel
Ernie, Len, Nigel
Ian, Joe, and one other to be picked from a hat on the night.Which darts players frequent the Roebuck?
This puzzle was originally published with no title.
[teaser455]
Jim Randell 10:07 am on 26 February 2019 Permalink |
I found two solutions for this puzzle, although with a slight change in the wording we could arrive at a unique solution.
This Python program runs in 226ms.
Run: [ @repl.it ]
from itertools import product, permutations, combinations from enigma import icount, unpack, printf # all the players players = "ABCDEFGHIJKLMN" # players with dual allegiance duals = "EFLM" # the pubs pubs = set("PQR") # do the three sets form a team def team(a, b, c): for (x, y, z) in permutations(pubs): if x in a and y in b and z in c: return True return False # choose the "missing" pub for the duals for s1 in product(pubs, repeat=4): (E, F, L, M) = (pubs.difference([x]) for x in s1) # ELM do not form a team if team(E, L, M): continue # choose (single) pubs for K, N for s2 in product(pubs, repeat=2): (K, N) = (set([x]) for x in s2) # KLM, FKN, ELN do not form teams if team(K, L, M) or team(F, K, N) or team(E, L, N): continue # CJN do form a team for s3 in permutations(pubs.difference(N)): (C, J) = (set([x]) for x in s3) # remaining assignments for given combinations, AGHI for s4 in product(pubs, repeat=4): (A, G, H, I) = (set([x]) for x in s4) # check the remaining combinations if not (team(C, F, H)) or team(A, F, I) or team(F, G, J): continue # which leaves B and D for s5 in product(pubs, repeat=2): (B, D) = (set([x]) for x in s5) table = (A, B, C, D, E, F, G, H, I, J, K, L, M, N) # P, Q, R should have teams of 5, 6, 7 (P, Q, R) = (icount(table, (lambda x: p in x)) for p in 'PQR') if (P, Q, R) != (5, 6, 7): continue # count the total possible teams t = icount(combinations(table, 3), unpack(team)) # there should be 162 if t != 162: continue # find how many unused IJ? combinations there are ijs = list(p for (p, x) in zip(players, table) if p not in 'IJ' and not team(I, J, x)) # there should be at least 2 if len(ijs) < 2: continue # who plays for R Rs = list(p for (p, x) in zip(players, table) if 'R' in x) printf("Rs = {Rs}") printf(" A={A} B={B} C={C} D={D} E={E} F={F} G={G} H={H} I={I} J={J} K={K} L={L} M={M} N={N}") printf(" ijs={ijs}") printf()Solution: A, B, D, F, G, I, J are on the Roebuck team.
This solution assumes that the final team member of the I+J+? team that is picked out of the hat can be any of the other players (i.e. I and J have never played together on a team before).
The team allegiances in this case are:
However, I took the construction of final I+J+? team by picking a name out of a hat to require only that there should be more than one candidate to placed in the hat. If we have the following team allegiances:
Then this is also a solution to the puzzle. In this case the remaining possible partners for I+J+? are: A, B, C, D, F, G.
LikeLike