Periodic Spells 元素周期表之咒
当你翻阅元素周期表的时候,看着各种元素符号在你眼前闪过,你曾否有什么惊人的发现?某些元素符号首尾相连,竟能连成许多单词,例如GeNIUS(铬 氮 碘 铀 硫),LuCK(镥 碳 钾),十分有趣。在好奇心的驱使下,我决定找一找有多少这样的单词。幸好我们有Python,可以免去手动列举的麻烦,因为元素符号所能组成的词较少,所以我在匹配时添加了两个字母的元素符号倒置的情况(如ScINeCe可匹配science),最终的元素符号拼写可能与单词不同。
代码如下:
import re
single = [
'h', 'b', 'c', 'n', 'o', 'f', 'p',
's', 'k', 'v', 'y', 'i', 'w', 'u'
]
double = [
'he', 'li', 'be', 'ne', 'na', 'mg',
'al', 'si', 'cl', 'ca', 'sc', 'ti',
'cr', 'mn', 'fe', 'co', 'ni', 'cu',
'zn', 'ga', 'ge', 'as', 'se', 'br',
'kr', 'rb', 'sr', 'zr', 'nb', 'mo',
'tc', 'ru', 'rh', 'pd', 'ag', 'cd',
'in', 'sn', 'sb', 'te', 'xe', 'cs',
'ba', 'la', 'ce', 'pr', 'nd', 'pm',
'sm', 'eu', 'gd', 'tb', 'dy', 'ho',
'er', 'tm', 'yb', 'lu', 'hf', 'ta',
're', 'os', 'ir', 'pt', 'au', 'hg',
'tl', 'pb', 'bi', 'po', 'at', 'rn',
'fr', 'ra', 'ac', 'th', 'pa', 'np',
'pu', 'am', 'cm', 'bk', 'cf', 'es',
'fm', 'md', 'no', 'lr', 'rf', 'db',
'sg', 'bh', 'hs', 'mt', 'ds', 'rg',
'cn', 'nh', 'fl', 'mc', 'lv', 'ts',
'og'
]
def in_double(str):
return str in double
def invrsd_double(str):
return (str[1] + str[0]) in double
def is_double(str):
return str in double or (str[1] + str[0]) in double
punct = '!,;:.?"\'、,;。'
def rm_punct(str):
str = re.sub(r'[{}]+'.format(punct),' ',str)
return str.strip()
def get(word):
ln = len(word)
idx = 0
res = []
while idx < ln:
if (idx + 1) < ln and in_double(word[idx] + word[idx+1]):
res.append(word[idx] + word[idx+1])
idx += 2
elif word[idx] in single:
res.append(word[idx])
idx += 1
elif (idx + 1) < ln and invrsd_double(word[idx] + word[idx+1]):
res.append('*' + word[idx] + word[idx+1])
idx += 2
elif idx >= 2 and in_double(word[idx-2] + word[idx-1]) and (word[idx-2] in single) and is_double(word[idx-1] + word[idx]):
res.pop()
res.append(word[idx-2])
if in_double(word[idx-1] + word[idx]):
res.append(word[idx-1] + word[idx])
else:
res.append('*' + word[idx-1] + word[idx])
idx += 1
else:
res.append('?' + word[idx])
idx += 1
return res
def spell(arr):
procd = ''
for str in arr:
if len(str) == 1:
procd += str.upper()
elif str[0] == '?':
if (str[1].isdigit()):
procd += str[1]
else:
procd += '?'
elif str[0] == '*':
procd += (str[2].upper() + str[1])
else:
procd += (str[0].upper() + str[1])
return procd
with open('src.txt','r') as f:
src = rm_punct(f.read()).split()
txt = ''
for s in src:
txt += spell(get(s.lower())) + ' '
print(txt)
测试输入:
Spruce trees grow from spruce saplings and have growth patterns and requirements similar to birch trees, although they appear different. They are mainly found in the taiga biome, but they may also generate in wooded mountains, snowy tundra, snowy taiga, and giant tree taiga biomes. Spruce logs have the same texture as oak logs, but it is a darker shade of brown; its leaves are denser, with a darker and blueish tone.
输出:
SPrUCe ?ReEs RgOW FrO? SPrUCe SPaLiNSg Na? H?V? RgOWTh PAtTeRnS Na? Re?UIRe?NeTs Si?ILa? ?O BiCrH ?ReEs AlThOUHg Th?Y PaP?Ar ?IFFeReN? Th?Y Ar? AmIn?Y FOUNd In Th? TaIGa BiO?? BU? Th?Y AmY AlSO GeNeRaTe In WOO??? MoUNTaInS SnOWY ?UNdRa SnOWY TaIGa Na? ?INa? ?Re? TaIGa BiO?Es SPrUCe ?OgS H?V? Th? SAm? Te??URe As O?K ?OgS BU? I? IS ? ?ArKEr SH??? OF BrOWN ITs ???VEs Ar? ?NeSEr WITh ? ?ArKEr Na? BLu?ISH ?ONe
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?