Files
SolutionEuler/solutions/0042.CodedTriangleNum/euler_42.py

79 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
The nth term of the sequence of triangle numbers is given by, $t_n = \frac{n(n+1)}{2}$ ;
so the first ten triangle numbers are:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
By converting each letter in a word to a number corresponding to its alphabetical position
and adding these values we form a word value. For example, the word value for SKY is 19+11+25 = 55 = t_10 .
If the word value is a triangle number then we shall call the word a triangle word.
Using words.txt (right click and 'Save Link/Target As...'), a 16K text file containing nearly two-thousand
common English words, how many are triangle words?
"""
import time
from pathlib import Path
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.perf_counter()
result = func(*args, **kwargs)
end_time = time.perf_counter()
print(f"Time taken by {func.__name__}: {end_time - start_time:.8f} seconds")
return result
return wrapper
def word_to_num(txt: str) -> int:
"""
将单词转换为数字每个字母对应其在字母表中的位置A=1, B=2, ..., Z=26
参数:
txt: 要转换的单词
返回:
单词的数字表示
示例:
>>> word_to_num("SKY")
55
"""
return sum(ord(c) - ord("A") + 1 for c in txt)
def is_triangle_number(n: int) -> bool:
"""
判断一个数是否为三角形数
参数:
n: 要判断的数
返回:
True 如果 n 是三角形数,否则 False
示例:
>>> is_triangle_number(10)
True
>>> is_triangle_number(11)
False
"""
# 使用二次方程求解,如果结果是整数则为三角形数
# 三角形数公式n = k(k+1)/2
# 解得 k = (-1 + sqrt(1 + 8n)) / 2
k = (-1 + (1 + 8 * n) ** 0.5) / 2
return k.is_integer()
@timer
def main() -> None:
with open(Path(__file__).parent / "0042_words.txt", "r") as file:
words = file.read().replace('"', "").split(",")
triangle_words = [word for word in words if is_triangle_number(word_to_num(word))]
print(f"Number of triangle words: {len(triangle_words)}")
if __name__ == "__main__":
main()