# Enigmatic Code

Programming Enigma Puzzles

## Enigma 1380: Points for a win

From New Scientist #2540, 25th February 2006

Our local football team consists of five teams and in the course of the season each team plays each of the others once. One point is awarded to each team for a draw and a higher whole number of points (I forget how many) are awarded for a win. Below is part of the league table sometime during the season before all the matches had been completed. The teams are shown in alphabetical order rather than order of merit. No teams have the same number of points. In the table, digits have been replaced consistently by letters, with different letters used for different digits.

How many points for a win? Which team or teams (if any) have the Authors beaten so far?

Enigma 1559 is also called “Points for a win”.

[enigma1380]

### One response to “Enigma 1380: Points for a win”

1. Jim Randell 24 October 2013 at 10:12 am

This Python program uses the [[ `Football()` ]] class, recently added to the enigma.py module. It looks at the possibilities for the “Won”, “Lost”, “Drawn”, “Points” and “Position” columns, and then goes on to verify that are possible score lines corresponding to the games that would make the “Goals for” and “Goals against” columns work. It runs in 469ms.

```# there are 10 games in the complete season:
# AvB, AvC, AvD, AvE, BvC, BvD, BvE, CvD, CvE, DvE.

# each team plays 4 matches, so the "Won", "Lost" and "Drawn" columns
# must all be no more than 4, and we have P, O, I, F, A filled out in
# them and so these must correspond to 0, 1, 2, 3, 4 in some order.

# also the "Position" column must contain 1, 2, 3, 4, 5 (in some
# order), as there are no ties on points, but N is already filled out,
# so N = 5.

# hence the remaining letters T, S, R, W are 6, 7, 8, 9 in some order.

# P, O, I are all different and their sum cannot exceed 4, so they are
# (0, 1, 2) or (0, 1, 3) (in some order), and so (F, A) is what's
# left: (3, 4) or (2, 4) (in some order), and I, F, A are all drawn
# matches, so there must be at least 3 drawn matches played.

# The Authors have 5 points, which can be composed of:
# 3d + 1w (win is 2 points)
# 2d + 1w (win is 3 points)
# 1d + 2w (win is 2 points)
# 1d + 1w (win is 4 points)
# 0d + 1w (win is 5 points)
# so the points for a win is 2, 3, 4, 5.

# The Bankers have 5 goals against and T > 5 goals for, so they must
# have won at least one match (P != 0).

from collections import Counter
from enigma import Football, diff, printf

# initialise the game scoring rules
football = Football(points={ 'w': 2, 'd': 1 })

N = 5

# record points for a win and A's victories
r = Counter()

# consider possible points for a win X
for X in (2, 3, 4, 5):
football = Football(points={ 'w': X, 'd': 1 })

# consider B's games
for (ab, bc, bd, be) in football.games(repeat=4):
# compute won, lost, drawn statistics for B
tB = football.table([ab, bc, bd, be], [1, 0, 0, 0])
(P, O, I, S) = (tB.w, tB.l, tB.d, tB.points)
# P cannot be 0 and P, O, I should be distinct
if P == 0 or len(set((P, O, I))) != 3: continue
# remaining digits
d0 = diff([6, 7, 8, 9], [S])
if len(d0) != 3: continue

# remaining games for E
for (ae, ce, de) in football.games(repeat=3):
tE = football.table([ae, be, ce, de], [1, 1, 1, 1])
# check the points
if tE.points != I: continue

# remaining games for A
tA = football.table([ab, ac, ad, ae], [0, 0, 0, 0])
# check the points
if tA.points != N: continue

# remaining game
for cd in football.games():
tC = football.table([ac, bc, cd, ce], [1, 1, 0, 0])
tD = football.table([ad, bd, cd, de], [1, 1, 1, 0])
# check the remaining drawn figures
(F, A) = (tC.d, tD.d)
if set([P, O, I, F, A]) != set([0, 1, 2, 3, 4]): continue
# and the points for each team must all be different
points = set([N, S, I, tC.points, tD.points])
if not(len(points) == 5 and min(points) == I): continue

# score B's matches
for T in d0:
for (AB, BC, BD, BE) in football.scores([ab, bc, bd, be], [1, 0, 0, 0], T, N):

# score C's matches
for R in diff(d0, [T]):
for (AC, CD, CE) in football.scores([ac, cd, ce], [1, 0, 0], R, O):

# check E's goals for hasn't exceeded W
(fE, aE) = football.goals([BE, CE], [1, 1])
W = diff(d0, [T, R])
if fE > W: continue

# A's victories
v = ','.join(t for (t, g) in zip('BCDE', [ab, ac, ad, ae]) if g == 'w')
r[(X, v)] += 1

printf("AB={ab}:{AB} AC={ac}:{AC} AD={ad} AE={ae} BC={bc}:{BC} BD={bd}:{BD} BE={be}:{BE} CD={cd}:{CD} CE={ce}:{CE} DE={de}\nA={tA}\nB={tB}\nC={tC}\nD={tD}\nE={tE}\nX={X}, P={P} O={O} I={I} S={S} F={F} A={A} T={T} R={R} W={W}\n")

for ((X, v), n) in r.items():
printf("win = {X} points, A beat {v} [{n} solutions]")
```

Solution: 4 points are awarded for a win. The Authors have beaten The Editors.

There are many possible score lines for the games, but in all cases the answers to the questions in the problem statement are the same.

This site uses Akismet to reduce spam. Learn how your comment data is processed.