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 + sides > sides: 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
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
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
that would read in three lines at a time into a buffer and then
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 + sides > sides: 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.