Python识别璇玑图中诗的数量
一、璇玑图简介
璇玑图的读法有很多,这里我使用七七棋盘格的读法,在璇玑图中分离出一个七七棋盘格,如下表
吏 | 官 | 同 | 流 | 污 | 合 | 玩 | 痞 | 悍 | 蒙 | 骗 | 造 | 假 | 蛋 | 鸡 | 宴 | 请 | 客 | 友 | 朋 | 远 | 戚 | 偏 | 正 | 反 | 拨 | 乱 | 冤 | 隶 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
奸 | 贪 | 险 | 冠 | 眷 | 阉 | 佃 | ||||||||||||||||||||||
味 | 道 | 人 | 味 | 爱 | 公 | 荒 | ||||||||||||||||||||||
投 | 背 | 渣 | 辣 | 宠 | 猪 | 田 | ||||||||||||||||||||||
臭 | 终 | 灭 | 麻 | 姬 | 汗 | 地 | ||||||||||||||||||||||
相 | 诚 | 明 | 香 | 美 | 血 | 天 | ||||||||||||||||||||||
烂 | 俭 | 贤 | 馋 | 甜 | 粘 | 寒 | ||||||||||||||||||||||
妓 | 贱 | 贫 | 苦 | 断 | 礼 | 谦 | 妻 | 仙 | 女 | 桃 | 花 | 妹 | 嫣 | 姐 | 懒 | 惰 | 猪 | 狗 | 低 | 贱 | 妾 | 酸 | 流 | 泪 | 目 | 满 | 惨 | 婢 |
惨 | 妍 | 淡 | 廉 | 奸 | 艳 | 难 | ||||||||||||||||||||||
败 | 羞 | 雅 | 美 | 猴 | 心 | 家 | ||||||||||||||||||||||
花 | 月 | 和 | 勤 | 狐 | 嘴 | 破 | ||||||||||||||||||||||
佛 | 花 | 温 | 耕 | 鬼 | 手 | 颜 | ||||||||||||||||||||||
心 | 闭 | 娴 | 洁 | 神 | 眼 | 抢 | ||||||||||||||||||||||
虔 | 腼 | 恬 | 俭 | 欢 | 馋 | 欢 | ||||||||||||||||||||||
姊 | 俭 | 食 | 衣 | 胖 | 兄 | 短 | 弟 | 闲 | 柳 | 细 | 云 | 风 | 谦 | 爷 | 叛 | 雷 | 鸣 | 闪 | 电 | 悍 | 爹 | 严 | 管 | 制 | 规 | 家 | 善 | 娣 |
善 | 安 | 瘫 | 憨 | 烦 | 喘 | 谦 | ||||||||||||||||||||||
慈 | 龙 | 身 | 猫 | 厌 | 呼 | 戴 | ||||||||||||||||||||||
猫 | 虎 | 软 | 熊 | 疯 | 吸 | 佩 | ||||||||||||||||||||||
封 | 凰 | 心 | 仔 | 野 | 胸 | 宝 | ||||||||||||||||||||||
挡 | 凤 | 肠 | 免 | 狂 | 肺 | 剑 | ||||||||||||||||||||||
栏 | 健 | 忐 | 变 | 癫 | 惨 | 短 | ||||||||||||||||||||||
鸽 | 馆 | 舍 | 弃 | 反 | 姑 | 叛 | 子 | 贤 | 方 | 圆 | 规 | 法 | 严 | 哥 | 贪 | 仁 | 义 | 德 | 道 | 善 | 姨 | 残 | 心 | 狠 | 断 | 斩 | 弯 | 蛇 |
店 | 犬 | 廉 | 灿 | 侃 | 怨 | 癍 | ||||||||||||||||||||||
亏 | 惧 | 母 | 姐 | 伴 | 解 | 布 | ||||||||||||||||||||||
盈 | 猫 | 慈 | 艳 | 舞 | 化 | 衣 | ||||||||||||||||||||||
叔 | 女 | 爱 | 戏 | 刀 | 利 | 缝 | ||||||||||||||||||||||
舅 | 弱 | 君 | 龙 | 斩 | 让 | 勤 | ||||||||||||||||||||||
乱 | 软 | 侃 | 潭 | 尖 | 谦 | 俭 | ||||||||||||||||||||||
嫡 | 远 | 亲 | 疏 | 羞 | 伯 | 谗 | 娌 | 蛮 | 父 | 鬼 | 通 | 神 | 仙 | 鹅 | 卵 | 洁 | 石 | 藏 | 隐 | 山 | 蝎 | 患 | 病 | 痛 | 寒 | 门 | 艳 | 媳 |
针对上表所示的七七棋盘格图,在苏蕙璇玑图中,前人们总结了上百种很零碎的读法,让普通读者眼花缭乱。其实,我们可以用一句话就把前人的所有读法涵盖了,即,从这个棋盘格的任何一个“交叉结点字”起,沿任何一条线段阅读,当读完第4条线段时,一首七言四绝诗就诞生了,同时,该诗反序逆读后,也是另一首七言四绝诗!(注1:图3共有25个“交叉结点字”,它们分别是:吏、痞、鸡、戚、隶、婢、妾、姐、妻、妓、姊、弟、爷、爹、娣、蛇、姨、哥、子、鸽、嫡、娌、鹅、媳、蝎。注2:每个“线段”都由8个汉字连接而成,其中顶端的两个汉字就是两个“交叉结点字”)
二、算法实现
我们将上面的表格简化成一张图,如下所示:
代码如下:
class Gragh():
def __init__(self, nodes, sides):
'''
nodes 表示点
sides 表示边
'''
# self.sequense是字典,key是点,value是与key相连接的点
self.sequense = {}
# self.side是临时变量,主要用于保存与指定点相连接的点
self.side = []
for node in nodes:
for side in sides:
u, v = side
# 指定点与另一个点在同一个边中,则说明这个点与指定点是相连接的点,则需要将这个点放到self.side中
if node == u:
self.side.append(v)
elif node == v:
self.side.append(u)
self.sequense[node] = self.side # 统计出各个节点与哪一些节点直接连接
self.side = []
'''
做五个循环,五个点确定四句诗
'''
def search(self):
res = []
for i in range(1, 26):
for j in self.sequense[i]:
for k in self.sequense[j]:
if k != i:
for z in self.sequense[k]:
if z != j:
for y in self.sequense[z]:
if y != k:
a = [i, j, k, z, y]
if a not in res:
res.append(a)
return res
if __name__ == "__main__":
nodes = [i + 1 for i in range(25)]
sides = [(1, 2), (2, 3), (3, 4), (4, 5), (1, 6), (1, 7), (2, 7), (3, 8), (4, 9), (5, 10), (5, 9), (6, 7),(7, 8), (8, 9), (9, 10), (6, 11), (7, 12), (7, 13), (8, 13), (9, 13),(9, 14), (10, 15), (11, 12), (12, 13), (13, 14), (14, 15), (11, 16), (12, 17), (13, 18), (13, 17),(13, 19), (14, 19), (15, 20), (16, 17), (17, 18), (18, 19), (19, 20), (16, 21), (17, 21), (17, 22),(18, 23), (19, 24), (19, 25), (20, 25), (21, 22), (22, 23), (23, 24), (24, 25)]
G = Gragh(nodes, sides)
print(len(G.search()))
运行结果
我不管,JS天下第一