Skip to content

Instantly share code, notes, and snippets.

@mountain
Last active February 17, 2020 03:09
Show Gist options
  • Save mountain/faec48a345bf03b5bb8fbe82ba9149cc to your computer and use it in GitHub Desktop.
Save mountain/faec48a345bf03b5bb8fbe82ba9149cc to your computer and use it in GitHub Desktop.
search crossword for Chinese poetries
# -*- coding: utf-8 -*-
'''
This simple program is used to search for crossword sentences in selected Chinese poetries
The selected Chinese poetries here is stored in a text file - tang_poetry_5char.txt.
You can change to your version of candidates
You should install networkx by pip
pip install networkx
Here are some examples of the search result
天边一树
⬡⬡⬡⬡⬡⬡⬡⬡
⬡⬡⬢⬡⬢⬡⬡⬡
⬡⬡⬢⬡⬢⬡⬡⬡
⬡⬡天⬢一⬢⬢⬡
⬡⬡⬢⬡⬢⬡⬡⬡
⬡⬢树⬢边⬢⬡⬡
⬡⬡⬡⬡⬡⬡⬡⬡
⬡⬡⬡⬡⬡⬡⬡⬡
⬡⬡野⬡声⬡⬡⬡
⬡⬡旷⬡雁⬡⬡⬡
⬡⬡天地一沙鸥⬡
⬡⬡低⬡秋⬡⬡⬡
⬡绿树村边合⬡⬡
⬡⬡⬡⬡⬡⬡⬡⬡
野旷天低树、绿树村边合、边秋一雁声、天地一沙鸥
春云意深
⬡⬡⬡⬡⬡⬡⬡⬡
⬡⬡⬢⬡⬡⬡⬡⬡
⬡⬡云深⬢⬢⬢⬡
⬡⬡⬢⬢⬡⬡⬡⬡
⬡⬡⬢⬢⬡⬡⬡⬡
⬡⬢意春⬢⬢⬡⬡
⬡⬡⬡⬢⬡⬡⬡⬡
⬡⬡⬡⬡⬡⬡⬡⬡
⬡⬡⬡⬡⬡⬡⬡⬡
⬡⬡浮⬡⬡⬡⬡⬡
⬡⬡云深不知处⬡
⬡⬡游木⬡⬡⬡⬡
⬡⬡子草⬡⬡⬡⬡
⬡随意春芳歇⬡⬡
⬡⬡⬡城⬡⬡⬡⬡
⬡⬡⬡⬡⬡⬡⬡⬡
浮云游子意、随意春芳歇、城春草木深、云深不知处
'''
import networkx as nx
ix2ln = {}
ln2ix = {}
with open('tang_poetry_5char.txt') as f:
g = nx.Graph()
for ix, ln in enumerate(f):
ln = ln[:-1]
g.add_node(ix)
ix2ln[ix] = ln
ln2ix[ln] = ix
for ix, iln in ix2ln.items():
for jx, jln in ix2ln.items():
intersec = set(iln).intersection(set(jln))
if len(intersec) > 0:
for char in intersec:
g.add_edge(ix, jx, char=char)
for ix in range(len(ix2ln)):
for base in nx.cycle_basis(g, ix):
if len(base) == 4:
e1 = g.get_edge_data(base[0], base[1])['char']
e2 = g.get_edge_data(base[1], base[2])['char']
e3 = g.get_edge_data(base[2], base[3])['char']
e4 = g.get_edge_data(base[3], base[0])['char']
l1 = ix2ln[base[0]]
l2 = ix2ln[base[1]]
l3 = ix2ln[base[2]]
l4 = ix2ln[base[3]]
if e1 != e2 and e1 != e3 and e1 != e4 and e2 != e3 and e2 != e4 and e3 != e4:
line = '%s%s%s%s: %s, %s, %s, %s' % (e1, e2, e3, e4, l1, l2, l3, l4)
p11, p21 = l1.index(e1), l2.index(e1)
p22, p32 = l2.index(e2), l3.index(e2)
p33, p43 = l3.index(e3), l4.index(e3)
p44, p14 = l4.index(e4), l1.index(e4)
if p14 > p11 and p22 > p21 and p33 > p32 and p44 > p43:
if p14 - p11 == p33 - p32 and p22 - p21 == p44 - p43:
print(line)
空山不见人
但闻人语响
返景入深林
复照青苔上
山中相送罢
日暮掩柴扉
春草明年绿
王孙归不归
春眠不觉晓
处处闻啼鸟
夜来风雨声
花落知多少
白日依山尽
黄河入海流
欲穷千里目
更上一层楼
千山鸟飞绝
万径人踪灭
孤舟蓑笠翁
独钓寒江雪
向晚意不适
驱车登古原
夕阳无限好
只是近黄昏
月黑雁飞高
单于夜遁逃
欲将轻骑逐
大雪满弓刀
红豆生南国
春来发几枝
愿君多采撷
此物最相思
移舟泊烟渚
日暮客愁新
野旷天低树
江清月近人
床前明月光
疑是地上霜
举头望明月
低头思故乡
松下问童子
言师采药去
只在此山中
云深不知处
林暗草惊风
将军夜引弓
平明寻白羽
没在石棱中
寒山转苍翠
秋水日潺湲
倚杖柴门外
临风听暮蝉
渡头馀落日
墟里上孤烟
复值接舆醉
狂歌五柳前
空山新雨后
天气晚来秋
明月松间照
清泉石上流
竹喧归浣女
莲动下渔舟
随意春芳歇
王孙自可留
城阙辅三秦
风烟望五津
与君离别意
同是宦游人
海内存知己
天涯若比邻
无为在歧路
儿女共沾巾
离离原上草
一岁一枯荣
野火烧不尽
春风吹又生
远芳侵古道
晴翠接荒城
又送王孙去
萋萋满别情
渡远荆门外
来从楚国游
山随平野尽
江入大荒流
月下飞天镜
云生结海楼
仍怜故乡水
万里送行舟
青山横北郭
白水绕东城
此地一为别
孤蓬万里征
浮云游子意
落日故人情
挥手自兹去
萧萧班马鸣
细草微风岸
危樯独夜舟
星垂平野阔
月涌大江流
名岂文章著
官应老病休
飘飘何所似
天地一沙鸥
戍鼓断人行
边秋一雁声
露从今夜白
月是故乡明
有弟皆分散
无家问死生
寄书长不达
况乃未休兵
国破山河在
城春草木深
感时花溅泪
恨别鸟惊心
烽火连三月
家书抵万金
白头搔更短
浑欲不胜簪
旅馆无良伴
凝情自悄然
寒灯思旧事
断雁警愁眠
远梦归侵晓
家书到隔年
沧江好烟月
门系钓鱼船
故人具鸡黍
邀我至田家
绿树村边合
青山郭外斜
开轩面场圃
把酒话桑麻
待到重阳日
还来就菊花
八月湖水平
涵虚混太清
气蒸云梦泽
波撼岳阳城
欲济无舟楫
端居耻圣明
坐观垂钓者
徒有羡鱼情
人事有代谢
往来成古今
江山留胜迹
我辈复登临
水落鱼梁浅
天寒梦泽深
羊公碑尚在
读罢泪沾襟
清晨入古寺
初日照高林
曲径通幽处
禅房花木深
山光悦鸟性
潭影空人心
万籁此都寂
但余钟磬音
海上生明月
天涯共此时
情人怨遥夜
竟夕起相思
灭烛怜光满
披衣觉露滋
不堪盈手赠
还寝梦佳期
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment