### Source: Squares With Three Sides

Part 1:Given a list of sides, determine how many form valid triangles. (Hint: triangle inequality)

Nothing particularly complicated about this one:

```
possible_triangles = 0
with open(args.input_file, 'r') as fin:
for line in fin:
sides = list(sorted(map(int, line.split())))
if sides[0] + sides[1] > sides[2]:
possible_triangles += 1
print('part 1:', possible_triangles)
```

The most interesting part is probably sorting the sides so that you know the largest will always be `sides[2]`

.

Part 2:Reorder the sides so that each triangle is three numbers in a column. For example:`A B C D E F G H I J K L M N O P Q R ...`

The triangles would be

`ADG`

,`BEH`

,`CFI`

,`JMP`

, etc.

This mostly comes down to figuring out how to read the data in. In order to use mostly the same loop as before, I wrote a `generator`

that would read in three lines at a time into a buffer and then `yield`

the triangles from those three rows before reading the next:

```
possible_triangles = 0
def rotate(stream):
while True:
triple = []
for i in range(3):
row = stream.readline()
if not row: return
triple.append(list(map(int, row.split())))
for row in range(3):
yield list(sorted(triple[col][row] for col in range(3)))
with open(args.input_file, 'r') as fin:
for sides in rotate(fin):
if sides[0] + sides[1] > sides[2]:
possible_triangles += 1
print('part 2:', possible_triangles)
```

An interesting problem in reading input files. To some extent, that’s a lot of programming in real life: figuring out how to turn real world data into something you can actually analyze.