Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(上)
概述
Swift 语言是一门现代化、安全、强大且还算性感的语言。在去年 WWDC 24 中苹果正式推出了秃头码农们期待许久的 Swift 6.0,它进一步完善了 Swift 语言的语法和语义,并再接再厉——强化了现代化并发模型的安全性和灵活性。
这里我们不妨用 Swift 来验证一个实际世界中有趣的小疑问:汉语中到底有没有拼音首字母全部相同的 4 字成语呢?
在本篇博文中,您将学到如下内容:
- 概述
- 1. 一个“悬悬而望”的问题
- 2. 自力更生
- 3. 如何获取汉字的拼音
- 总结
到底问题的谜底将会如何?结果绝对会让大家“始料不及”!
那还等什么呢?Let’s go!!!😉
1. 一个“悬悬而望”的问题
我一直对中国博大精深的成语世界兴趣盎然,有个藏在心底很久的问题一直想知道答案:四字成语里有没有 4 个字的拼音首字母都相同的成语呢?
比如 左道旁门(zuǒ dào páng mén) 这个成语中每个字拼音的第一个字母分别为 z、d、p 和 m,不符合要求。而成语 樽俎折冲(zūn zǔ zhé chōng) 前 3 个字的拼音首字母都为 z,可惜最后一个字拼音的首字母却为 c ,从而也无奈的丧失了候选资格。
樽俎折冲
释义:指不以武力而在宴席交谈中制胜敌人,泛指外交谈判活动。折冲,使敌人战车后撤,指击退敌军。
出处:语出汉·刘向《新序·杂事一》
示例:今吾国以存亡关系而不签字,各国当能见谅,必可留作悬案,为他日~之馀地。
★《五四”爱国运动资料·学界风潮记下编》
俗话说得好:“最好的代码是还没有写的代码”,所以在实际撸码解决这个问题之前,我想试试有没有其它方法能够找到这个问题的答案,现在很火的“当红炸子鸡” AI 无疑值得一试。
首先尝试的是豆包 AI 引擎。可以看到她似乎没搞懂我的问题,给出了完全错误的答案:
接下来再试试 Kimi 引擎。这次 AI 扳回一局,Kimi 不但正确读懂了我的意图,而且给出了不止一个正确答案:
最后我们再试试 ChatGPT:
可以看到它开始举了一个错误的例子(“自作自受”),但随后又给出了几个正确的答案,真不知道它是到底是啥子脑回路。
但好奇心作祟的我们不禁要问:除了上面这些成语,还有其它符合条件的成语吗?
更多其它 Swift 趣味开发的小“栗子”,请小伙伴们移步如下链接观赏有趣且精彩的内容:
- 国内顶级 AI 的回答令人“贻笑大方”:看来苹果秃头码农们暂时还不会失业吧?
- 有趣的小实验:五种语言搞定“超超超难”剑桥面试数学题
- 搞定“超超超难”剑桥面试数学题番外篇:ARM64汇编
- 搞定剑桥面试数学题番外篇2:使用多线程并发“加强版”
2. 自力更生
接下来我们就来看看如何撸码来完成这项貌似“艰巨”的任务。
大致的思路其实很简单:先获取尽可能多的成语文本,然后计算它们的拼音,最后判断这些拼音的首字母是否相同。
需要说明的是,如今网上有很多公开的 API 接口可以帮助我们查询某个成语的释义、出处等信息,有的甚至可以模糊查找,比如查询“左”字开头和“门”字结尾的成语。但这些 API 都没有提供遍历所有成语的方法,所以对于我们这个需要蛮力来攻克的问题可能都有些力不从心。
不过不要紧,我们幸运的从网上找到一个包含超过 3w 个成语的文本文件,我想这是一个很好的开端。
3. 如何获取汉字的拼音
在掌控海量成语文本之后,接下来的问题是如何获取它们的拼音。
Swift 对于汉字拼音的支持比小伙伴们想象的要好很多,我们不用借助任何第三方库,只需使用 Swift 系统框架中的 API 即可完美实现。
let idiomString = "樽前月下"
print(idiomString)
let cfString = CFStringCreateMutableCopy(nil, 0, idiomString as CFString)
CFStringTransform(cfString, nil, kCFStringTransformToLatin, false)
print("带声调的拼音:\(cfString! as String)")
CFStringTransform(cfString, nil, kCFStringTransformStripCombiningMarks, false)
print("不带声调的拼音: \(cfString! as String)")
运行结果如下所示,我们可以选择输出带声调或不带声调的拼音:
不过本例中我们无需多此一举,因为对应的成语文本文件中已经包含了拼音信息,实际上除了拼音以外该文件还包含了与每个成语相关的其它丰富信息:
樽酒论文 拼音:zūn jiǔ lùn wén释义:一边喝酒,一边议论文章。出处:唐·杜甫《春日忆李白》诗何时一樽酒,重与细论文。”示例:连年客里度初度,~第一遭。★陈世宜《上巳社集是日值余初度》诗
其中甚至包括了许多超过 4 字的成语:
来是是非人,去是是非者 拼音:lái shì shì fēi rén,qù shì shì fēi zhě释义:犹言解铃还是系铃人。指谁惹起的是非,还得由谁来了结。出处:无示例:无
其实这些附加内容对我们这个例子来说基本没啥用,而且带来了解析上的额外麻烦。不过不要紧,因为我们本来就是在“自找麻烦”。
在下一篇博文中,看我们如何继续扮演“麻烦制造者”的角色,不见不散!
想要进一步系统地学习 Swift 开发的小伙伴们,可以来我的《Swift 语言开发精讲》专栏逛一逛哦:
- 《Swift 语言开发精讲》
总结
在本篇博文中,我们讨论了用 Swift 语言解决一个成语小问题预先所需要的准备工作。
感谢观赏,我们下一篇见!😎