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
(
)
)
)
运行结果