forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsol1.py
62 lines (42 loc) · 1.75 KB
/
sol1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"""
Project Euler Problem 115: https://projecteuler.net/problem=115
NOTE: This is a more difficult version of Problem 114
(https://projecteuler.net/problem=114).
A row measuring n units in length has red blocks
with a minimum length of m units placed on it, such that any two red blocks
(which are allowed to be different lengths) are separated by at least one black square.
Let the fill-count function, F(m, n),
represent the number of ways that a row can be filled.
For example, F(3, 29) = 673135 and F(3, 30) = 1089155.
That is, for m = 3, it can be seen that n = 30 is the smallest value
for which the fill-count function first exceeds one million.
In the same way, for m = 10, it can be verified that
F(10, 56) = 880711 and F(10, 57) = 1148904, so n = 57 is the least value
for which the fill-count function first exceeds one million.
For m = 50, find the least value of n
for which the fill-count function first exceeds one million.
"""
fromitertoolsimportcount
defsolution(min_block_length: int=50) ->int:
"""
Returns for given minimum block length the least value of n
for which the fill-count function first exceeds one million
>>> solution(3)
30
>>> solution(10)
57
"""
fill_count_functions= [1] *min_block_length
fornincount(min_block_length):
fill_count_functions.append(1)
forblock_lengthinrange(min_block_length, n+1):
forblock_startinrange(n-block_length):
fill_count_functions[n] +=fill_count_functions[
n-block_start-block_length-1
]
fill_count_functions[n] +=1
iffill_count_functions[n] >1_000_000:
break
returnn
if__name__=="__main__":
print(f"{solution() =}")