Teaser 2998: Football league
From The Sunday Times, 8th March 2020 [link] [link]
In our league three points are awarded to a team for a win and one point goes to each team in a drawn match. In each division, the teams play each other twice per season.
Comparison of the results of the two divisions at the end of last season showed that:
(a) Division II had one more team than Division I.
(b) The same total number of points was awarded in each division.
(c) For the division with the larger number of drawn matches, that number was equal to the number of matches not drawn in the other division.
(d) The number of drawn matches in one division was a multiple of the (3-digit) number of drawn matches in the other.
How many teams were in Division II?
The puzzle text has been reworded slightly to reduce ambiguity.
[teaser2998]







Jim Randell 5:54 pm on 6 March 2020 Permalink |
If there are n teams in a division, and each team plays each other team twice, then the total number of matches played is:
So, if Division I has n teams the total number of matches played is:
And Division II has n + 1 teams, so the total number of matches played is:
These totals are divided into drawn matches and not-drawn matches. If the division with the lower number of drawn matches has x drawn matches (x is a 3-digit number), then the other division has kx draws (where k > 1), and this means the original division has kx not-drawn matches.
So the total number of matches for the division with the lower number draws is also expressible as (k + 1)x, and the total number of points is:
If the division with the higher number of draws (kx draws) has y not-draws, then we also have:
This Python 3 program runs in 73ms.
Run: [ @repl.it ]
from enigma import (irange, inf, printf) # check the total number of matches works # tl = total number of matches for the division with the fewer draws # th = total number of matches for the other division # d = division with fewer draws # return: (pts, (n1, t1, md1, mn1), (n2, t2, md2, mn2)) def check(d, tl, th, nl, nh): # divide the total into (k + 1) and x for k in irange(2, inf): (x, r) = divmod(tl, k + 1) if x < 100: break if r > 0 or x > 999: continue # calculate the number of points pts = (2 + 3 * k) * x y = th - k * x if 2 * k * x + 3 * y != pts: continue # return solution s = ((nl, tl, x, k * x), (nh, th, k * x, y)) yield (pts,) + (s if d == 1 else s[::-1]) # find number of teams in each division def solve(): for n in irange(2, inf): (t1, t2) = (n * (n - 1), (n + 1) * n) yield from check(1, t1, t2, n, n + 1) yield from check(2, t2, t1, n + 1, n) # output the first solution for (pts, (n1, t1, md1, mn1), (n2, t2, md2, mn2)) in solve(): printf("pts={pts} -> D1: n={n1} t={t1} md={md1} mn={mn1}; D2: n={n2} t={t2} md={md2} mn={mn2}") breakSolution: There were 20 teams in Division II.
There were 19 teams in Division I, giving a total of 342 matches. 114 of the matches were drawn, and the remaining 228 were won outright, giving a total number of points of 2×114 + 3×228 = 912.
The 20 teams in Division II played a total of 380 matches. 228 of the matches were drawn (twice the number of drawn matches in Division I, and the same as the number of not-drawn matches in Division I), and the remaining 152 were won outright, giving a total number of points of 2×228 + 3×152 = 912.
LikeLike
Robert Brown 11:11 am on 7 March 2020 Permalink |
I found the first solution working by hand on the back of an envelope! But there are many solutions, and I don’t see anything in the text restricting the size of the divisions.
LikeLike
Jim Randell 11:13 am on 7 March 2020 Permalink |
@Robert: Are you sure you are using all the information? I found there was only one solution (even though my program only outputs the first solution it finds, but I did have it check for divisions with up to 5000 teams).
LikeLike
Jim Randell 12:02 pm on 7 March 2020 Permalink |
Some analysis allows us to fully explore the solution space, and confirm that there is only a single solution.
We can derive the following expressions for x and k:
The values for n are thus limited by the acceptable values for x and k.
Here is a Python 3 program that determines possible values for n:
from enigma import (irange, inf, div, printf) for n in irange(8, inf): x = div(n * (n - 7), 2) if x < 100: continue if x > 999: break k = div(n + 5, n - 7) if k is None or k < 2: continue (t1, t2) = ((n - 1) * n, n * (n + 1)) printf("pts={(2 + 3 * k) * x} -> D1: n={n} t={t1} md={x} mn={k * x}; D2: n={n + 1} t={t2} md={k * x} mn={t2 - k * x}")Or the solution can be determined analytically:
Restricting the value of n to positive integers, we have the following:
x is a 3-digit number:
k is a non-trivial integer multiplier:
From which we see there is only a single possible value for n, which gives us the solution, and the values of the other parameters can be calculated.
LikeLike
GeoffR 11:09 am on 8 March 2020 Permalink |
LikeLike
Robert Brown 1:46 pm on 8 March 2020 Permalink |
I had made the classic error of awarding 1 point per draw to each division. As the points are awarded to teams, you get 2 points for every drawn match. Sorry about that!
LikeLike
Jim Randell 10:27 am on 10 March 2020 Permalink |
I’ve modified the wording of the puzzle to (hopefully) clarify things.
LikeLike