Teaser 3304: Roaming bull
From The Sunday Times, 18th January 2026 [link] [link]
Farmer Quentin keeps his prize bull in a circular field of diameter 50m. To improve the layout, he decides to switch to a square field with side length equal to the old diameter. He builds the new fencing around the old, with fence posts every metre starting at the corner. After completing the new fencing, he tethers the bull outside the fence to one of these fence posts with a rope of integer metre length, to allow the removal of the inner circular fence. As a result, the bull’s temporary roaming area is now four times what it was inside the circle.
What is the length of the rope?
[teaser3304]









Jim Randell 7:14 am on 18 January 2026 Permalink |
If the bull were tethered to a single post with a 50 m rope in an otherwise unobstructed flat plain, then it would be able to roam a region that is 4 times the area of the original (25 m radius) circular field. So the rope must be at least this long.
When tethered to a post that makes up the boundary of the square field, then bull can roam over a collection of quadrants of a circle are centred on the tether point, and the corners of the square field, as the rope wraps around the boundary of the field.
I considered rope lengths allowing roaming areas of between 2 and 6 non-overlapping quadrants (of various sizes) around the outside of the field. (Which assumes the bull has no other obstructions). If the rope is longer than 100 m then the regions will overlap, as the bull can reach the opposite point on the perimeter of the square from either direction.
For each possible tethering point a corresponding equation is generated and then solved to find possible integer rope lengths.
The following Python code runs in 79ms. (Internal runtime is 2.1ms).
from enigma import (Rational, Polynomial as Poly, irange, sq, divc, sprintf as f, printf) Q = Rational() q = Q(1, 4) d = 50 # size of the square A = sq(d) # target area (= 4 * r^2 where r = d/2) # find roots of polynomial <p> = <v> between <lo> and <hi> def roots(p, v, lo, hi, s=''): xs = p.roots(v, domain='Z', include='+', F=Q) # integer roots for x in xs: if lo <= x <= hi: printf("{s}x={x}") # suppose the bull is tethered at post a = 0 (corner) to 25 (middle) # with a rope of length x for a in irange(0, divc(d, 2)): # 2 quadrants: 0 <= x <= a p = 2*q * sq(Poly([0, 1])) # x^2 roots(p, A, 0, a, f("[2 quads] a={a} -> ")) # 3 quadrants: a <= x <= d - a p += q * sq(Poly([-a, 1])) # (x - a)^2 roots(p, A, a, d - a, f("[3 quads] a={a} -> ")) # 4 quadrants: d - a <= x <= d + a p += q * sq(Poly([a - d, 1])) # (x + (a - d))^2 roots(p, A, d - a, d + a, f("[4 quads] a={a} -> ")) # 5 quadrants: d + a <= x <= 2d - a p += q * sq(Poly([-(a + d), 1])) # (x - (a + d))^2 roots(p, A, d + a, 2*d - a, f("[5 quads] a={a} -> ")) # 6 quadrants (no overlap): 2d - a <= x <= 2d p += q * sq(Poly([a - 2*d, 1])) # (x + (a - 2d))^2 roots(p, A, 2*d - a, 2*d, f("[6 quads] a={a} -> "))Solution: The length of the rope is 58 m.
And the tether is at post 2 m from a corner.
The bull can roam in two quadrants with radius 58 m, one quadrant with radius 56 m, one quadrant with radius 10 m, and one quadrant with radius 6 m.
Here is a diagram of the situation – the light green area (outside the square field) is 4 times the size of the dark green area (inside the square field):
If Farmer Quentin only measures the rope to approximately a whole number of metres, then there are two more solutions where the rope is within 4 cm of a whole number of metres:
We can see these non-integer solutions by setting [[
domain='F', F='float']] at line 11 in the program above.LikeLike
Jim Randell 11:00 am on 18 January 2026 Permalink |
Alternatively, just considering all possible rope lengths and tether points (although this doesn’t let you find non-integer rope lengths).
This Python program runs in 392µs.
from enigma import (irange, sq, divc, printf) d = 50 # size of the square A = 4 * sq(d) # target area (in quarter units) # consider possible tether points for a in irange(0, divc(d, 2)): # consider increasing rope length for x in irange(d, 2*d): # calculate total area of possible quadrants rs = [x, x, x - a, x + a - d, x - a - d, x + a - 2*d] v = sum(sq(r) for r in rs if r > 0) # output solution if v == A: printf("a={a} x={x} [quads={q}]", q=sum(r > 0 for r in rs)) if v >= A: breakLikeLike
Frits 1:43 pm on 18 January 2026 Permalink |
3 areas (or 4 quadrants) will definitely be roamed as I don’t let the rope length start from 1.
A 6th quadrant is not possible for diameter 50 as I have calculated a basic upper limit for the rope length.
d = 50 # diameter in meters # old roaming area = 25^2.pi so new roaming area must be 50^2.pi # southern area S = r^2 / 2 < 2500, r^2 < 5000 mx_rope = int((2 * d**2)**.5) # the rope length must be larger than the diameter for r in range(d + 1, mx_rope + 1): # tether the bull to the southern fence (on the west side) for y in range(26): # distance from SW corner # quadruple areas divided by pi S4 = 2 * r**2 # 4 x area below the southern fence NW4 = (r - y)**2 N4 = (r - d - y)**2 if r - d - y > 0 else 0 E4 = (r - d + y)**2 # all areas should sum to 100^2 if S4 + NW4 + N4 + E4 == 4 * d**2: print("answer:", r, "meters")LikeLike