春节到了,免不了要去七大姑八大姨家拜年,
顺便接受长辈们的关怀。有时偶然遇到许久没见过的远房亲戚,叫不出合适的称谓就尴尬了;或者即便被家人提示了叫法,但依然不知道和自己是什么关系。
于是就有机智的程序员开发出了
亲戚关系计算器
,可以通过指定关系的叠加,计算出互相之间的关系称谓,有的还可以通过称呼来倒推关系。这种工具网上已经有了不少版本,网页、App、微信小程序,都能搜到不少。不过讲真,考虑到实际中能遇上的复杂关系以及东西南北各地称呼不一样,其实算不上实用。
但对于程序员来说,解决问题本身就具有挑战的乐趣。
目前我看到比较好的版本是:
https://github.com/mumuy/relationship
演示地址:
http://passer-by.com/relationship/
小程序版本
这个问题看似简单,其实处理起来也并不是几行代码就能解决的。简单介绍下 mumuy 这个版本的原理:
-
定义最基本的原子关系,比如:
f:父,m:母,h:夫,w:妻,s:子,d:女,xb:兄弟,ob:兄,lb:弟,xs:姐妹,os:姐,ls:妹
-
通过关系链,表示复合关系,比如:爷爷就是
f,f
,伯父就是
f,ob
-
讲前两点对应关系用字典的方式预先整理好,就是所有关系链到称谓的直接映射
-
定义可简化的关系,比如:哥哥的姐姐就是自己的姐姐,即
xb,xs
就是
xs
;母亲的丈夫
m,h
就是父亲
f
。这一步的作用是为了将复杂的关系链转化成可查找到的直接关系链
-
为了处理性别、长幼带来的影响,作者还额外定义了一些修饰符:
1:男性,0:女性,&o:年长,&l:年幼,#:隔断,[a|b]:并列
-
定义好以上信息好,当获取用户的输入后,将其转化成关系符号,再递归简化关系链,直到不可再简化为止,再去映射关系中查找称呼。
这个版本的算法是网上相对最完善的,并且被MIUI自带亲戚计算器功能所采用。
作者的详细解读:
https://www.jianshu.com/p/74290f1ae838
我本来也打算挑战一下,后来发现其实蛮复杂,估计等我写好,《难忘今宵》都唱完了,于是作罢。就在此版本的基础上,做了个 python 版本的移植(原版是 js)。
本来打算尝试用 jiphy 等自动工具来把 js 转成 python,结果发现效果差到不能看,所以最后是手动转的。原项目在文本和关系链处理时用了大量的正则计算,而我在转代码时也靠 SublimeText 的正则替换省了很多事。但同样是正则,js 和 python 的写法又有不少区别,可以说这个项目让我对
正则表达式
的熟练度又 +1 了。
其他内容回复左侧关键词获取:
python
:零基础入门课程目录
新手
:初学者指南及常见问题
资源
:超过500M学习资料网盘地址
项目
:十多个进阶项目代码实例
如需了解视频课程及答疑群等更多服务,请号内回复
码上行动
代码相关问题可以在论坛上发帖提问 bbs.crossincode.com
推荐阅读:
Python转行
|
爬抖音
|
AI名画
|
如何debug
|
查天气
|
我用Python
|
知乎
|
排序
|
电影票
|
技术宅
|
单词表
|
新手建议
|
如何提问
|
一图学Pytho
n
|
智能防挡弹幕
目的:实现同Python中eval函数一样,对于复杂算术运算提供一个简易的计算器;思路:1、通过正则表达式,将运算式子中所有的数字和运算符分割开来形成类表的方式,然后可以方便列表检索进行运算,eq_format(eq)函数;2、通过列表的检索,通过递归的运算,一层层的剥离掉(),然后进行+,-,*...