# Enigmatic Code

Programming Enigma Puzzles

## Enigma 1472: Wrong calls

From New Scientist #2633, 8th December 2007

In tennis a set is won by the first player to win 6 games unless the score reaches 5-5; in that case the set is won 7-5 or 7-6.

At Wimbledon the first batch of tennis balls is used for the warm-up and the first seven games; each subsequent batch of balls is used for nine games.

This means that during the second set there are certain scores at which it is impossible for a new batch of balls to be required, whatever the score in the first set may have been.

Dick wants to be a Wimbledon umpire and practiced by umpiring the match between Harry and Tom. But three times during the second set he called for new balls at scores at which it is impossible for them to be required.

The number of games that Tom had won in the second set was the same when Dick made the third of those calls as when Dick made the second of them.

What was the score in the second set at the time of (a) the first wrong call, (b) the third wrong call? Give each answer in the form xy, Harry’s score first.

[enigma1472]

Advertisements

### One response to “Enigma 1472: Wrong calls”

1. Jim Randell 20 January 2013 at 11:38 am

The following Python program runs in 40ms.

```from itertools import combinations, permutations
from enigma import irange, printf

# determine possible scores in a set, and winning scores
(scores, wins) = (set(), set())
for n in irange(0, 13):
for a in irange(min(n, 7), n // 2, -1):
b = n - a
if b > a: continue
if a == 7 and b < 5: continue
scores.add((a, b))
if (a == 6 and b < 5) or a == 7: wins.add((a, b))

# record possible second set scores when new balls are needed
nb = set()
# choose a score for the first set
for s1 in wins:
g1 = sum(s1)
# now consider possible scores in the second set
for s2 in scores:
g = g1 + sum(s2)
# new balls?
if (g - 7) % 9 == 0: nb.add(s2)

# so the impossible scores for new balls in the second set are...
imp = scores.difference(nb)
printf("[impossible = {imp}]")

# we need to find a sequence of three such scores
for s in combinations(imp, 3):
# sort them by the number of games played
(s1, s2, s3) = sorted(s, key=sum)
# ignore sequences that wouldn't get to the third item
if s1 in wins or s2 in wins: continue
# must have the same number of won games for Tom is s2 and s3
for T2 in set(s2).intersection(s3):
# Harry's wins are the other one in the second and third items
H2 = s2[int(T2 == s2[0])]
H3 = s3[int(T2 == s3[0])]
# Harry's wins can't have decreased
if H2 > H3: continue
# consider the wins in the first item of the sequence
for (T1, H1) in permutations(s1):
# neither Tom's wins nor Harry's wins can have decreased
if T1 > T2 or H1 > H2: continue
# so the scores that the calls were made at were...
printf("calls: [1st] {H1}-{T1}, [2nd] {H2}-{T2}, [3rd] {H3}-{T2}")
```

Solution: The scores are: (a) 0-2; (b) 6-5.