From The Sunday Times, 29th March 1981 [link]
Recently I attended the Numerical Astrologers Conference, held annually in Brighton. At this meeting, members wore badges on which were written not only their names, but also their dates of birth. These dates were written numerically in the usual English manner of first putting the day, then the month, then the year (e.g. 7th March 1946 would be represented by 7/3/46, and the 31st December 1954 by 31/12/54). The year always uses two digits.
I had just entered the meeting when I was accosted by an internationally acclaimed cabalist, who, I noticed, shared with me the month of his birthday, though he was born in a year eight years prior to the year of my birth. He had been looking at my badge, and now told me that the digits of my date of birth were, in sequence, in exactly the reverse order to his own.
We were eagerly discussing this coincidence when an old acquaintance of mine introduced himself to the cabalist, who then made the same claim to my friend about their dates of birth. At first this puzzled me, as I knew my friend to be younger than myself, but, upon inspection, both the claims proved to be correct.
Strangely, both of us had dates of birth whose digits, when taken in completely the reverse order, were exactly the same as those of the cabalist.
Numerically, what was the cabalist’s date of birth?
The puzzle is included in the book The Sunday Times Book of Brainteasers (1994).
[teaser975]
Jim Randell 6:17 am on 14 June 2026 Permalink |
This Python 3 program generates all possible paths between O and D using the specified directions. And then factorises the number of paths found into two 2-digit numbers.
It runs in 71ms. (Internal runtime is 7.9ms).
from enigma import (icount, divisors_pairs, printf) # the grid of intersections is composed of those points (x, y) = [0..6] * [0..4] # where x and y have the same parity # possible moves (<delta-x>, <delta-y>) which preserve parity moves = [ # parity 0: NW, N, NE, E, SE [(-1, +1), (+0, +2), (+1, +1), (+2, 0), (+1, -1)], # parity 1: NW, NE, SE [(-1, +1), (+1, +1), (+1, -1)], ] # extend path <vs> to <dst> without revisiting a vertex def paths(vs, dst): (x, y) = vs[-1] # are we done? if (x, y) == dst: yield vs else: # consider possible moves for (dx, dy) in moves[x % 2]: v = (vx, vy) = (x + dx, y + dy) if not (vx < 0 or vy < 0 or vx > 6 or vy > 4 or v in vs): yield from paths(vs + [v], dst) # count the number of paths between (0, 0) and (6, 4) n = icount(paths([(0, 0)], (6, 4))) printf("{n} possible paths") # factor n into two 2-digit numbers for (a, b) in divisors_pairs(n): if 9 < a < b < 100: printf("-> {n} = {a} * {b}")Solution: [To Be Revealed]
LikeLike
Ruud 11:37 am on 14 June 2026 Permalink |
def search(pos, visited): if pos == (6, 4): yield 1 else: for dir in ((-1, 1), (1, 1), (1, -1)) if pos[0] % 2 else ((-1, 1), (0, 2), (1, 1), (2, 0), (1, -1)): pos_next = tuple(v + d for v, d in zip(pos, dir)) if pos[0] in range(7) and pos[1] in range(5) and pos_next not in visited: yield from search(pos_next, visited | {pos_next}) number_of_routes = sum(search((0, 0), {(0, 0)})) for olive in range(10, 100): if (number_of_routes % olive) == 0 and olive < (don := number_of_routes // olive) < 100: print(f"{number_of_routes=} {olive=} {don=}")LikeLike