Brain-Teaser 497: [Alphabets Cricket Club]
From The Sunday Times, 6th December 1970 [link]
All 26 members of the Alphabets Cricket Club (all surnames starting with a different letter of the alphabet) turned up for the annual general meeting at the Ugly Duck. Afterwards they divided into 5 teams of 5 and played a quick game of skittles, the lowest-scoring team to buy beer for the rest. (P. L. Zeigler sportingly stood down).
Each player had just one ball at the 9 skittles, scoring, of course, a point for each skittle knocked down. The team captains varied in performance: Thomson got 9, Knight 5, Oldwhistle 3, C. F. Arrowroot 2, and the luckless Fisher 0. (Fisher’s team moved to have all captains’ scores ignored, but the plea was rejected; it was pointed out that anyhow Fisher’s weren’t due to buy the beer).
The team totals were all different, as indeed they would have been had captains’ scores been ignored. No other player made the same score as any Captain, and no two team members of the same team made the same score. Oldwhistle’s team won.
What was the order of finishing, and what were the individual scores of the team buying the beer?
This puzzle was originally published with no title.
[teaser497]
Jim Randell 9:50 am on 3 September 2019 Permalink |
This Python program considers the set of scores for the winning team, and then looks for possible scores for the remaining teams that gives the teams different scores (both including and excluding the captains scores).
from enigma import (subsets, irange, printf) # we can identify the teams by the captains scores (winning captain first) caps = [ 3, 9, 5, 2, 0 ] # team names (by captains score) team = dict(zip(caps, "OTKAF")) # possible remaining scores scores = set(irange(0, 9)).difference(caps) # solve for captains score in caps # t1 = winning teams total # t0 = winning teams total without captains score # ss = scores so far # t1s = team totals (with captains score) # t0s = team totals (without captains score) def solve(caps, t1, t0, ss=[], t1s=[], t0s=[]): # are we done? if not caps: yield ss else: # consider scores for the next team x = caps[0] for s in subsets(scores, size=4): s0 = sum(s) s1 = s0 + x # check scores are less than the winner if not (s1 < t1 and s0 < t0): continue # and also not repeated if s1 in t1s or s0 in t0s: continue # solve for the remaining captains yield from solve(caps[1:], t1, t0, ss + [s], t1s + [s1], t0s + [s0]) # find scores for the winning team for s in subsets(scores, size=4): t = sum(s) # solve for the remaining teams for ss in solve(caps[1:], caps[0] + t, t): # record (0=team, 1=captain score, 2=other scores, 3=total score (with cap), 4=total score (without cap)) rs = [ ('O', caps[0], s, caps[0] + t, t) ] for (c, x) in zip(caps[1:], ss): rs.append((team[c], c, x, c + sum(x), sum(x))) # sort according to total score (with cap) rs.sort(key=lambda t: t[3], reverse=1) # team F did not come last if rs[-1][0] == 'F': continue # output the table for (x0, x1, x2, x3, x4) in rs: printf("{x0}: {x1} + {x2} = {x3} ({x4})") printf()Solution: The finishing order was: 1st = Oldwhistle, 2nd = Thomson, 3rd = Knight, 4th = Fisher, 5th = Arrowroot. The individual scores of the team buying the beer were: 1, 2 (Arrowroot), 4, 6, 8.
The complete set of results is:
There is also a “near miss” solution:
But this is disallowed as team F is last (and wouldn’t be last if the captains scores are ignored).
LikeLike