Teaser 3064: Turnip prize
From The Sunday Times, 13th June 2021 [link] [link]
The Turnip Prize is awarded to the best piece of work by an artist under fifty. This year’s winning entry consisted of a mobile made up of many different plain white rectangular or square tiles hanging from the ceiling. The sides of the tiles were all whole numbers of centimetres up to and including the artist’s age, and there was precisely one tile of each such possible size (where, for example, a 3-by-2 rectangle would be the same as a 2-by-3 rectangle). Last week one of the tiles fell and smashed and then yesterday another tile fell and smashed. However, the average area of the hanging tiles remained the same throughout.
How old is the artist?
There are now 500 Teaser puzzles available on the site (approximately 10 years worth).
And I still have 52 puzzles from 2016-2017 that I solved at the time to post, which at the current rate will take me another year.
[teaser3064]
Jim Randell 4:50 pm on 11 June 2021 Permalink |
The following Python program runs in 52ms.
Run: [ @replit ]
from enigma import irange, tri, div, printf # collect rectangles with sides up to x, and total area (rs, t) = (list(), 0) for x in irange(1, 49): rs.extend((a, x) for a in irange(1, x)) t += x * tri(x) # calculate the number of tiles and the total area n = len(rs) # look for an integer mean m = div(t, n) if m is None: continue # look for tiles with the mean area ts = list((a, b) for (a, b) in rs if a * b == m) if len(ts) > 1: printf("x={x} [m={m}; ts={ts}]")or (shorter, but doesn’t track tile dimensions):
from enigma import multiset, irange, div, printf # collect rectangles with sides up to x rs = multiset() for x in irange(1, 49): rs.update(a * x for a in irange(1, x)) # calculate integer mean tile area m = div(rs.sum(), rs.size()) # look for tiles with the mean area if rs.count(m) > 1: printf("x={x} [m={m}]")Solution: The artist is 37.
So, there were originally 703 tiles with a total area of 255892 cm², given a mean area of 364 cm².
There are 2 tiles with this area (= 14×26, 13×28), and the removal of either (or both) will leave the mean area unchanged.
LikeLike
Jim Randell 8:47 am on 12 June 2021 Permalink |
And here’s a version that doesn’t collect the rectangles at all (and does report tile dimensions):
The number of tiles is given by the triangular numbers:
And the total area is given by the 4-dimensional pyramidal numbers (see: OEIS A001296):
And hence the mean area of a tile is:
So we can look for an integer mean, that has (at least) 2 divisor pairs in the required range:
from enigma import irange, div, divisors_pairs, printf # consider ages for x in irange(1, 49): # calculate integer mean m = div((x + 2) * (3 * x + 1), 12) if m is None: continue # find tiles with mean area ts = list((a, b) for (a, b) in divisors_pairs(m) if b <= x) if len(ts) > 1: printf("x={x} [m={m}; ts={ts}]")LikeLike
Frits 10:05 am on 12 June 2021 Permalink |
Nice.
Proof:
see [ https://www.wolframalpha.com/input/?i=%28sum+x*x*%28x%2B1%29%2F2%2C+x%3D1+to+n%29+ ]
total area = sum(y=1..x) 1/2 y y (y + 1) = 1/24 x (x + 1) (x + 2) (3x + 1)
number of tiles = x (x+1) / 2
integer mean = (x + 2) * (3 * x + 1) / 12
LikeLike
Tony Brooke-Taylor 8:07 am on 14 June 2021 Permalink |
To get an integer mean, x must satisfy the requirement that (x+2).(3x+1) mod 12 = 0. This requires that x be equal to either 1+12i or 10+12i (i=0,1,…).
This plot gives a visual representation of that requirement.
import numpy as np import matplotlib.pyplot as plt x = np.asarray([a for a in range(1,51)]) y = np.asarray([(a+2)*(3*a+1)%12 for a in range(1,51)]) plt.scatter(x, y) plt.title('y=(x + 2).(3x + 1) mod 12') plt.xlabel('x') plt.ylabel('y') plt.show()LikeLike