Periodic Spells 元素周期表之咒

2021-03-13 00:16·151 Reads

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

posted @   DevBobcorn  阅读(151)  评论(0编辑  收藏  举报
编辑推荐:
· .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 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示