python版親戚關係計算器

春節到了,免不了要去七大姑八大姨家拜年,順便接受長輩們的關懷。有時偶然遇到許久沒見過的遠房親戚,叫不出合適的稱謂就尷尬了;或者即使被家人提示了叫法,但依然不知道和本身是什麼關係。python

因而就有機智的程序員開發出了 親戚關係計算器 ,能夠經過指定關係的疊加,計算出互相之間的關係稱謂,有的還能夠經過稱呼來倒推關係。這種工具網上已經有了很多版本,網頁、App、微信小程序,都能搜到很多。不過講真,考慮到實際中能趕上的複雜關係以及東西南北各地稱呼不同,其實算不上實用。git

但對於程序員來講,解決問題自己就具備挑戰的樂趣。程序員

目前我看到比較好的版本是:
https://github.com/mumuy/relationshipgithub

演示地址:
http://passer-by.com/relationship/正則表達式

小程序版本算法

這個問題看似簡單,其實處理起來也並非幾行代碼就能解決的。簡單介紹下 mumuy 這個版本的原理:編程

  1. 定義最基本的原子關係,好比:f:父,m:母,h:夫,w:妻,s:子,d:女,xb:兄弟,ob:兄,lb:弟,xs:姐妹,os:姐,ls:妹
  2. 經過關係鏈,表示複合關係,好比:爺爺就是f,f,伯父就是f,ob
  3. 講前兩點對應關係用字典的方式預先整理好,就是全部關係鏈到稱謂的直接映射
  4. 定義可簡化的關係,好比:哥哥的姐姐就是本身的姐姐,即 xb,xs 就是 xs;母親的丈夫 m,h 就是父親 f。這一步的做用是爲了將複雜的關係鏈轉化成可查找到的直接關係鏈
  5. 爲了處理性別、長幼帶來的影響,做者還額外定義了一些修飾符:1:男性,0:女性,&o:年長,&l:年幼,#:隔斷,[a|b]:並列
  6. 定義好以上信息好,當獲取用戶的輸入後,將其轉化成關係符號,再遞歸簡化關係鏈,直到不可再簡化爲止,再去映射關係中查找稱呼。

這個版本的算法是網上相對最完善的,而且被MIUI自帶親戚計算器功能所採用。
做者的詳細解讀:
https://www.jianshu.com/p/74290f1ae838小程序

我原本也打算挑戰一下,後來發現其實蠻複雜,估計等我寫好,《難忘今宵》都唱完了,因而做罷。就在此版本的基礎上,作了個 python 版本的移植(原版是 js)。微信小程序

原本打算嘗試用 jiphy 等自動工具來把 js 轉成 python,結果發現效果差到不能看,因此最後是手動轉的。原項目在文本和關係鏈處理時用了大量的正則計算,而我在轉代碼時也靠 SublimeText 的正則替換省了不少事。但一樣是正則,js 和 python 的寫法又有很多區別,能夠說這個項目讓我對 正則表達式 的熟練度又 +1 了。微信

python 版代碼:https://gitee.com/crossin/snippet/tree/master/relationship

════

其餘文章及回答:

如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 人工智能 | 爬蟲 | 我用Python | requests | 計算機視覺 | 字符播放器 | 一圖學Python | 智能防擋彈幕

歡迎搜索及關注公衆號: Crossin的編程教室

相關文章
相關標籤/搜索