Brain-Teaser 910: The Teaser Club
From The Sunday Times, 30th December 1979 [link]
“The Teaser Club was formed in the summer of 1969”, the secretary of the Chub told me. “We held our Inaugural meeting then. A president and a secretary were appointed, and a constitution was drawn up. One rule of the Club is that each member must send a Christmas card to every other member. Each card, as you may guess, carries a Teaser as well as Christmas greetings”.
The membership increased every year”, he continued, “indeed, in 1970, we sent 330 more cards than we did in 1969”.
“How many were sent in 1978?”, I asked.
“We sent 330 more than in 1977”, the secretary replied with a smile.
“And how many did you send in 1977?”, I persisted.
“By a strange coincidence”, he replied, “it was 330 more than in 1976”.
“Thank you for your information”, I said. “I see now why you call it the Teaser Club”.
How many Christmas cards were sent in 1975?
This puzzle is included in the book The Sunday Times Book of Brainteasers (1994). The puzzle text above is taken from the book.
[teaser910]
Jim Randell 9:31 am on 7 April 2022 Permalink |
If there are n members of the club, then the number of cards send is s(n) = n(n − 1).
This Python program looks for pairs of possible s(n) values that differ by 330. And then looks for two pairs which chain together (for the 1976, 1977, 1978 membership.
We then look for possible lower values (the membership must grow by at least 1 member a year) for the 1969, 1970 membership.
Together these give us upper and lower bounds on the 1975 membership, from which we can determine the number of cards sent.
It runs in 55ms.
Run: [ @replit ]
from enigma import (irange, inf, subsets, printf) # record s[n] = number of cards sent by n members s = [0] for n in irange(1, inf): t = n * (n - 1) if t - s[-1] > 330: break s.append(t) # find terms that differ by 330, record by index d = dict() for ((i, x), (j, y)) in subsets(enumerate(s), size=2): if y - x == 330: d[i] = j printf("[s[{i}] = {x} -> s[{j}] = {y}]") # look for indices i, j, k such that d[i] = j and d[j] = k for (i, j) in d.items(): k = d.get(j) if k is None: continue printf("1976 = {i}; 1977 = {j}; 1978 = {k}") # and look for 1969, 1970 valules for (a, b) in d.items(): if b + 6 > i: continue printf("-> 1969 = {a}; 1970 = {b}") # calculate 1975 values for g in irange(b + 5, i - 1): printf("--> 1975 = {g}; cards = {x}", x=s[g])Solution: 552 Christmas cards were sent in 1975.
LikeLike