Brain-Teaser 521: [Names and occupations]
From The Sunday Times, 6th June 1971 [link]
There were six. Messrs. Butcher, Carpenter, Draper, Farmer, Grocer and Miller, who shared the fire-watching on Friday nights — three this week, three the next. By occupation they were (not necessarily respectively) a butcher, a carpenter, a draper, a farmer, a grocer and a miller.
Incidents were few and far between, until that Saturday morning when they found the “log” book signed by the Acting Deputy Assistant something or other, as follows: “All three present and fast asleep”.
Something had to be done about it: they decided to watch, to play whist, and to keep awake in the future. It was arranged thus: four did duty this week, next week two stood down and two others came in, and so on. Each did two turns in three weeks.
On the first Friday the carpenter, the draper, the farmer and the miller watched. Next week Mr Carpenter, Mr Draper, Mr Farmer and Mr Grocer played. On the third occasion Mr Butcher played against Mr Grocer, Mr Farmer against the butcher, and the miller against the draper. Each night the four cut for partners and kept them till morning.
If Mr Carpenter’s occupation is the same as the name of the one whose occupation is the same as the name of the one whose occupation is the same as the one whose occupation is the same as the name of the miller:
What is Mr Miller’s occupation?
As presented this puzzle has no solutions. In the comments I give a revised version that does have a unique answer.
This puzzle was originally published with no title.
[teaser521]
Jim Randell 9:33 am on 9 June 2020 Permalink |
I thought the tricky bit in this puzzle would be detangling the long obfuscated condition at the end (and decide if there was a “the name of” missing from it). But it turns out we can show that there are no solutions before we get that far, so the puzzle is flawed.
In week 3 we have the following pairs (Mr Butcher + Mr Grocer), (Mr Farmer + the butcher), (the miller + the draper).
But there are only four people (i.e. two pairs), so one of the pairs is repeated. The middle one doesn’t overlap with either of the outer two, so the outer two must refer to the same pair. i.e. (Mr Butcher + Mr Grocer) = (the miller + the draper).
In week 2 we had Mr Carpenter, Mr Draper, Mr Farmer and Mr Grocer. And Mr Farmer and Mr Grocer stayed on for week 3, which means they can’t have done week 1.
The jobs missing from week 1 are the butcher and the grocer, so: (Mr Farmer + Mr Grocer) = (the butcher + the grocer).
But Mr Grocer cannot be one of (the miller + the draper) and also one of (the butcher + the grocer).
So the described situation is not possible.
However if we change the names in the second week to match the jobs from the first week (which I think makes for a more pleasing puzzle), and also insert the missing “the name of” into the final obfuscated condition we get the following revised puzzle:
Then we get a puzzle that does have solutions (although not the same as the published solution).
The following Python program runs in 54ms.
Run: [ @repl.it ]
from enigma import (irange, subsets, multiset, map2str, printf) # labels for the names and jobs labels = (B, C, D, F, G, M) = irange(0, 5) # check the schedule for the 3 weeks def check(w1, w2, w3): m = multiset() for w in (w1, w2, w3): w = set(w) # 4 different people each week if len(w) != 4: return False m.update_from_seq(w) # each person does 2 duties over the 3 weeks return all(v == 2 for v in m.values()) # map: job -> name for n in subsets(labels, size=len, select="P"): # Week 1 = carpenter, draper, farmer, miller w1 = [n[C], n[D], n[F], n[M]] # Week 2 = Carpenter, Draper, Farmer, Miller w2 = [C, D, F, M] # NOT: [C, D, F, G] # Week 3 = Butcher + Grocer, Farmer + butcher, miller + draper # so: Butcher + Grocer = miller + draper if not(set([B, G]) == set([n[M], n[D]])): continue w3 = [B, G, F, n[B]] if not check(w1, w2, w3): continue # "Mr Carpenter's occupation is the same as the name of the one # whose occupation is the same as the name of the one whose # occupation is the same as the [name of] one whose occupation is # the same as the name of the miller" if not(n[n[n[n[n[M]]]]] == C): continue # output the map names = ("Butcher", "Carpenter", "Draper", "Farmer", "Grocer", "Miller") jobs = list(x.lower() for x in names) printf("{s}", s=map2str(((names[n], j) for (n, j) in zip(n, jobs)), sep="; ", enc=""))Solution: Mr Miller is the carpenter.
There are three ways to assign the jobs to the names:
LikeLike