""" Project Euler Problem 117: https://projecteuler.net/problem=117 Using a combination of grey square tiles and oblong tiles chosen from: red tiles (measuring two units), green tiles (measuring three units), and blue tiles (measuring four units), it is possible to tile a row measuring five units in length in exactly fifteen different ways. |grey|grey|grey|grey|grey| |red,red|grey|grey|grey| |grey|red,red|grey|grey| |grey|grey|red,red|grey| |grey|grey|grey|red,red| |red,red|red,red|grey| |red,red|grey|red,red| |grey|red,red|red,red| |green,green,green|grey|grey| |grey|green,green,green|grey| |grey|grey|green,green,green| |red,red|green,green,green| |green,green,green|red,red| |blue,blue,blue,blue|grey| |grey|blue,blue,blue,blue| How many ways can a row measuring fifty units in length be tiled? NOTE: This is related to Problem 116 (https://projecteuler.net/problem=116). """ def solution(length: int = 50) -> int: """ Returns the number of ways can a row of the given length be tiled >>> solution(5) 15 """ ways_number = [1] * (length + 1) for row_length in range(length + 1): for tile_length in range(2, 5): for tile_start in range(row_length - tile_length + 1): ways_number[row_length] += ways_number[ row_length - tile_start - tile_length ] return ways_number[length] if __name__ == "__main__": print(f"{solution() = }")