Brain-Teaser 950: Magic moments
From The Sunday Times, 5th October 1980 [link]
Joe decided to utilise the garden see-saw to demonstrate the principles of balance, and of moments to, his family. Alf, Bert, Charlie, Doreen, Elsie and Fiona weighed 100, 80, 70, 60, 50 and 20 kilos respectively. The seesaw had three seats each side, positioned 1, 2 and 3 metres from the centre.
They discovered many ways of balancing using some or all of the family.
In one particular combination, with at most one person on each seat, one of the family not on the seesaw observed that the sum of the moments of all of the people on the seesaw was a perfect square.
“That’s right”, said Joe, “but, as you can see, it doesn’t balance — and what’s more, there’s nowhere you can sit to make it balance”.
“Wrong”, was the reply. “I could sit on someone’s lap”.
“True,” said Joe, “but only if you sit at the end”.
Which two would then be sitting together, and who else, if anyone, would be on the same side of the see-saw?
[To find the moment due to each person, multiply their distance from the centre by their weight. The sum of the moments on one side should equal the sum of those on the other if balance is to be achieved].
This puzzle is included in the book The Sunday Times Book of Brainteasers (1994).
[teaser950]

Jim Randell 10:16 am on 14 May 2024 Permalink |
Participants can be uniquely identified by their weights.
This Python program finds possible seating arrangements on the see-saw.
It runs in 72ms. (Internal runtime is 13ms).
Run: [ @replit ]
from enigma import (subsets, is_square, div, printf) # weights and positions weights = [100, 80, 70, 60, 50, 20] poss = [+1, +2, +3, -1, -2, -3] # there is at least one member not seated for ws in subsets(weights, min_size=2, max_size=len(weights) - 1, select='C'): # allocate positions (including +3) for ps in subsets(poss, size=len(ws), select='P'): if +3 not in ps: continue # find the total sum of the moments ms = sum(w * abs(p) for (w, p) in zip(ws, ps)) if not is_square(ms): continue # weight required at +3 to balance the see-saw x = -sum(w * p for (w, p) in zip(ws, ps)) w = div(x, +3) # is it the weight of a missing person? if not (w in weights and w not in ws): continue # output solution printf("ws={ws} ps={ps} ms={ms} x={x} w={w}")Solution: Doreen would join Fiona at the end of the see-saw. Elsie is also seated on the same side.
The seating arrangement is as follows:
Without D the moments are (kg.m):
They don’t balance, but they do sum to 400 = 20^2.
With D the moments on the right become:
and the see-saw balances.
LikeLike
Frits 2:26 pm on 14 May 2024 Permalink |
from enigma import express from itertools import product # weights and positions weights = [100, 80, 70, 60, 50, 20] names = ["Alf", "Bert", "Charlie", "Doreen", "Elsie", "Fiona"] # possible squares divisible by 10 for sq in [100, 400, 900]: # decompose square into weights for e in express(sq, weights, min_q=0, max_q=3): # someone is sitting at the end and one place is empty if all(x for x in e) or 3 not in e: continue # at most one person on each seat if any(e.count(i) > 2 for i in range(1, 4)): continue # one of the family not on the seesaw to sit at the end on someone's lap for i, seat in enumerate(e): if seat: continue # not an empty seat e1 = e[:i] + [3] + e[i + 1:] # multiply elements by 1 or -1 times the weight and # see if they sum to zero for prod in product([-1, 1], repeat=len([x for x in e1 if x])): if prod[0] > 0: continue # avoid symmetric duplicates # weave in zeroes p = list(prod) p = [p.pop(0) if x else 0 for x in e1] # is the seesaw in balance? if sum([x * y * weights[i] for i, (x, y) in enumerate(zip(p, e1))]) != 0: continue # new persion must be sitting on someone's lap at the end someone = [j for j in range(6) if j != i and e1[j] == 3 and p[j] == p[i]] if not someone: continue print(f"{names[i]} would join {names[someone[0]]}", f"at the end ofthe see-saw.") oths = [j for j in range(6) if p[j] == p[i] and j not in {i, someone[0]}] if not oths: continue ns = [names[o] for o in oths] oths = ns[0] + " is" if len(oths) == 1 else ' and '.join(ns) + " are" print(f"{oths} also seated on the same side.")LikeLike