forked from TheAlgorithms/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add solution for Project Euler problem 173. (TheAlgorithms#3075)
* Added solution for Project Euler problemm problem 173. TheAlgorithms#2695 * Added docstring * Update formatting, doctest and annotations. Reference: TheAlgorithms#3256
- Loading branch information
Showing
2 changed files
with
41 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
""" | ||
Project Euler Problem 173: https://projecteuler.net/problem=173 | ||
We shall define a square lamina to be a square outline with a square "hole" so that | ||
the shape possesses vertical and horizontal symmetry. For example, using exactly | ||
thirty-two square tiles we can form two different square laminae: | ||
With one-hundred tiles, and not necessarily using all of the tiles at one time, it is | ||
possible to form forty-one different square laminae. | ||
Using up to one million tiles how many different square laminae can be formed? | ||
""" | ||
|
||
|
||
from math import ceil, sqrt | ||
|
||
|
||
def solution(limit: int = 1000000) -> int: | ||
""" | ||
Return the number of different square laminae that can be formed using up to | ||
one million tiles. | ||
>>> solution(100) | ||
41 | ||
""" | ||
answer = 0 | ||
|
||
for outer_width in range(3, (limit // 4) + 2): | ||
if outer_width ** 2 > limit: | ||
hole_width_lower_bound = max(ceil(sqrt(outer_width ** 2 - limit)), 1) | ||
else: | ||
hole_width_lower_bound = 1 | ||
if (outer_width - hole_width_lower_bound) % 2: | ||
hole_width_lower_bound += 1 | ||
|
||
answer += (outer_width - hole_width_lower_bound - 2) // 2 + 1 | ||
|
||
return answer | ||
|
||
|
||
if __name__ == "__main__": | ||
print(f"{solution() = }") |