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