# Enigmatic Code

Programming Enigma Puzzles

## Enigma 1704: Joe’s triangle

From New Scientist #2871, 30th June 2012 [link]

Joe drew a right-angled triangle on an A6 file card. He asked Penny to cut it out and then cut it in two to make two right-angled triangles. Then he asked her to cut each triangle in two to make four right-angled triangles in total. Now Joe’s triangle was very special. Penny found that the lengths of all the sides of all the triangles were a whole number of millimetres.

What was the area of the smallest triangle?

Note: An A6 card has dimensions of 105 mm × 148 mm.

[enigma1704]

### 9 responses to “Enigma 1704: Joe’s triangle”

1. Jim Randell 27 June 2012 at 5:16 pm

The following Python program runs in 50ms.

```from enigma import irange, is_square, printf

# find possible right-angled triangles that fit on an A6 card
triangles = []
for a in irange(1, 105):
for b in irange(a + 1, 148):
c = is_square(a * a + b * b)
if c is None: continue
triangles.append((a, b, c))

# split a triangle into two
def split(t):
(a, b, c) = t
# find triangles (a1, b1, c1), (a2, b2, c2) such that
# a = c1, b = c2, c = a1 + b2, b1 = a2
for (a1, b1, c1) in triangles:
if a != c1: continue
(a2, b2, c2) = (b1, c - a1, b)
if (a2, b2, c2) not in triangles: continue
yield ((a1, b1, c1), (a2, b2, c2))

# t1 is the first triangle
for t1 in triangles:
# split it into two
for (t2, t3) in split(t1):
# and split each of these into two
for (t4, t5) in split(t2):
for (t6, t7) in split(t3):
printf("triangles = {t1} {t2} {t3} {t4} {t5} {t6} {t7}")
# and find the smallest triangle (by area)
printf("min area = {m}", m=min(a * b // 2 for (a, b, c) in (t4, t5, t6, t7)))
```

Solution: The area of the smallest triangle is 486 sq mm.

2. arthurvause 27 June 2012 at 6:22 pm

I’m not sure if the intention is to use the whole of the card in some way, but if not there are multiple solutions.

• arthurvause 27 June 2012 at 6:37 pm

No there aren’t. I missed one of the equations from the code:

```squares = {n*n:n for n in range(3,149)}

for c in range(1,148):
for a in range(3,c):
if c*c-a*a in squares:
b=squares[c*c-a*a]
for g in range(3,100):
if a*a +g*g in squares:
f=squares[a*a +g*g]
for d in range(3,100):
if b*b+d*d in squares:
e=squares[b*b+d*d]
if (g+b)**2 + (a+d)**2 == (f+e)**2 and f**2 +c**2==(g+b)**2:
print a,b,c,d,e,f,g

```
3. arthurvause 27 June 2012 at 8:43 pm

More understandable code, and a picture:

```squares = {n*n:n for n in range(3,149)}
pythags = [(x,y,squares[x*x+y*y]) for x in range(3,100) for y in range(3,100) if x*x+y*y in squares]

for (a,b,c) in pythags:
for (g,f) in [(y,z) for (x,y,z) in pythags if x==a]:
for(d,e) in [(y,z) for (x,y,z) in pythags if x==b]:
if (g+b)**2 + (a+d)**2 == (f+e)**2 and f**2 +c**2==(g+b)**2 and e**2 +c**2==(a+d)**2:
print a,b,c,d,e,f,g
```
4. Brian Gladman 28 June 2012 at 9:24 am

Here is my solution:

```
# All the triangles are scaled up copies of the same primitive triangle
# (u, v, w) with u <= v and w^2 = u^2 + v^2.   The linear scale factors
# for the three different internal triangles are u^2, u * v and v^2 and
# that for the original triangle is (u^2 + v^2).   The A6 card limits v
# to less than 6.

fs = 'Area = {0:d}, sides = {1:s}'
sq = { x ** 2: x for x in range(1, 11)}

for u in range(1, 6):
for v in range(u, 6):
t = u ** 2 + v ** 2
if t in sq:
prim = (u, v, sq[t])
scale = (u * u, u * v, v * v, u * u + v * v)
sides = tuple(set(x * y for x in prim for y in scale))
print(fs.format((u * u) ** 2 * (u * v // 2), sorted(sides)))
```
5. Brian Gladman 4 July 2012 at 5:17 pm

Hi Claire-Louise,

Yes, but it also has to have the four integer sided right angled angles triangles inside it and this is not possible

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