public
Authored by
GeekTR 


成语接龙
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
idiom = require('./idiom.json')
fix = require('./fix.json')
idiom.forEach(i => {
i.pinyin = i.pinyin
.replace(/ɡ/g, 'g')
.replace(/,/g, ',')
.replace(/ /g, ' ')
.replace(/, */g, ', ')
if (fix[i.word]) {
i.pinyin = fix[i.word]
}
})
simpleIdiom = idiom.map(({ pinyin, word }) => ({ pinyin, word }))
function toAsciiChar(pinyin) {
return pinyin
.replace(/ā|á|ǎ|à/g, 'a')
.replace(/ō|ó|ǒ|ò/g, 'o')
.replace(/ê|ē|é|ě|è/g, 'e')
.replace(/ī|í|ǐ|ì/g, 'i')
.replace(/ū|ú|ǔ|ù/g, 'u')
.replace(/ǖ|ǘ|ǚ|ǜ|ü/g, 'u')
.replace(/ń|ň/g, 'n')
.replace(/, /g, ' ')
}
// availablePinyin = 'a,ai,an,ang,ao,ba,bai,ban,bang,bao,bei,ben,beng,bi,bian,biao,bie,bin,bing,bo,bu,ca,cai,can,cang,cao,ce,cen,ceng,cha,chai,chan,chang,chao,che,chen,cheng,chi,chong,chou,chu,chua,chuai,chuan,chuang,chui,chun,chuo,ci,cong,cou,cu,cuan,cui,cun,cuo,da,dai,dan,dang,dao,de,dei,den,deng,di,dia,dian,diao,die,ding,diu,dong,dou,du,duan,dui,dun,duo,e,en,eng,er,fa,fan,fang,fei,fen,feng,fiao,fo,fou,fu,ga,gai,gan,gang,gao,ge,gei,gen,geng,gong,gou,gu,gua,guai,guan,guang,gui,gun,guo,ha,hai,han,hang,hao,he,hei,hen,heng,hong,hou,hu,hua,huai,huan,huang,hui,hun,huo,ji,jia,jian,jiang,jiao,jie,jin,jing,jiong,jiu,ju,juan,jun,jue,ka,kai,kan,kang,kao,ke,ken,keng,kong,kou,ku,kua,kuai,kuan,kuang,kui,kun,kuo,la,lai,lan,lang,lao,le,lei,leng,li,lia,lian,liang,liao,lie,lin,ling,liu,lo,long,lou,lu,luan,lue,lun,luo,ma,mai,man,mang,mao,me,mei,men,meng,mi,mian,miao,mie,min,ming,miu,mo,mou,mu,na,nai,nan,nang,nao,ne,nei,nen,neng,ni,nian,niang,niao,nie,nin,ning,niu,nong,nou,nu,nue,nuan,nun,nuo,o,ou,pa,pai,pan,pang,pao,pei,pen,peng,pi,pian,piao,pie,pin,ping,po,pou,pu,qi,qia,qian,qiang,qiao,qie,qin,qing,qiong,qiu,qu,quan,que,qun,ran,rang,rao,re,ren,reng,ri,rong,rou,ru,rua,ruan,rui,run,ruo,sa,sai,san,sang,sao,se,sen,seng,sha,shai,shan,shang,shao,she,shei,shen,sheng,shi,shou,shu,shua,shuai,shuan,shuang,shui,shun,shuo,si,song,sou,su,suan,sui,sun,suo,ta,tai,tan,tang,tao,te,tei,teng,ti,tian,tiao,tie,ting,tong,tou,tu,tuan,tui,tun,tuo,wa,wai,wan,wang,wei,wen,weng,wo,wu,xi,xia,xian,xiang,xiao,xie,xin,xing,xiong,xiu,xuan,xue,xun,xu,ya,yan,yang,yao,ye,yi,yin,ying,yo,yong,you,yu,yuan,yue,yun,za,zai,zan,zang,zao,ze,zei,zen,zeng,zha,zhai,zhan,zhang,zhao,zhe,zhei,zhen,zheng,zhi,zhong,zhou,zhu,zhua,zhuai,zhuan,zhuang,zhui,zhun,zhuo,zi,zong,zou,zu,zuan,zui,zun,zuo'.split(',')
// idiom.forEach(({ pinyin, word }) => {
// const pinyinList = toAsciiChar(pinyin).split(' ')
// if (pinyinList.find(i => !availablePinyin.includes(i))) {
// console.log(word, pinyin)
// }
// })
simpleIdiom = idiom.map(({ pinyin, word }) => {
const pinyinList = toAsciiChar(pinyin).split(' ')
const start = pinyinList.shift()
const end = pinyinList.pop()
return { start, end, word }
})
allPinyin = new Set()
simpleIdiom.forEach(i => {
allPinyin.add(i.start)
allPinyin.add(i.end)
})
idiomSet = new Set(simpleIdiom)
loopCache = { yi: {} }
function resolve(pinyin, coll) {
coll[pinyin] = coll[pinyin] || {}
loopCache[pinyin] = coll[pinyin]
idiomSet.forEach(i => {
if (i.end === pinyin) {
idiomSet.delete(i)
coll[pinyin][i.start] = {}
loopCache[i.start] = coll[pinyin][i.start]
}
})
Object.keys(coll[pinyin]).forEach((key) => resolve(key, loopCache))
}
(() => { idiomSet = new Set(simpleIdiom) })()
map = { yi: {} }
function loop() {
let found = false
idiomSet.forEach(i => {
if (i.end === i.start) {
console.log(i.word)
idiomSet.delete(i)
found = true
return
}
if (map[i.end]) {
map[i.end][i.start] = map[i.end][i.start] || {}
map[i.start] = map[i.start] || map[i.end][i.start]
idiomSet.delete(i)
found = true
}
})
if (found) { loop() }
}
loop()
ways = {}
function findPath(node, path) {
let subNodeNames = Object.keys(node)
if (!subNodeNames.length) {
ways[path[path.length - 1]] = path.reverse()
return
}
subNodeNames.forEach(i => {
let newPath = path.slice()
newPath.push(i)
findPath(node[i], newPath)
})
}
findPath(map.yi, ['yi'])
// Array.from(allPinyin).forEach(i => map[i] = false)
// simpleIdiom.filter(i => i.end === 'yi').forEach((i) => {
// map[i.start] = [i]
// })
idiomMap = {}
simpleIdiom.forEach(({ start, end, word }) => { idiomMap[`${start}-${end}`] = word })
idiomEnds = {}
simpleIdiom.forEach(({ start, end, word }) => { idiomEnds[word] = end })
Please register or sign in to comment