public
Authored by avatar GeekTR :speech_balloon:

成语接龙

idiom.js 4.25 KiB
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 })
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment