#! /usr/bin/python3 # Last edited on 2026-09-08 08:34:48 by stolfi # Defines the bipattern for each crib 'USES', 'QI', etc. def get_bencao_starps_bipattern(kw_en): # Returns the bipattern corresponding to # the English keyword type {kw_en}. # if kw_en == "USE1": # Just '主' and 'daiin': bipat = ( ( 0.000, '主', 'daiin' ), ) elif kw_en == "USES": # Matches '主' to 'daiin' and a restricted set of variants: # The weights were adjusted based on the ROOS recipe. bipat = ( ( 0.000, '主', 'daiin' ), ( 0.150, '主', 'kaiin' ), ( 0.160, '主', 'laiin' ), ( 0.170, '主', 'daiiin' ), ( 0.180, '主', 'dain' ), ( 0.190, '主', 'raiin' ), ) elif kw_en == "USEX": # Matches '主' to 'daiin' and a wider set of variants: # The weights were adjusted based on the ROOS recipe. bipat = ( ( 0.000, '主', 'daiin' ), ( 0.020, '主', 'doiin' ), ( 0.040, '主', 'd[ao]iiin' ), ( 0.140, '主', '[pfkl][ao]iii?n' ), ( 0.260, '主', 'd[ao]in' ), ( 0.270, '主', '[pfkl][ao]in' ), ( 0.280, '主', '[rs][ao]iii?n' ), ( 0.290, '主', '[rs][ao]in' ), ( 0.800, '主', 't[ao]iii?n' ), ( 0.810, '主', 't[ao]in' ), ( 9.000, '主', '[a-z][a-z][a-z][a-z][a-z]' ), # Desperation. ) elif kw_en == "LONG-TAKE" or kw_en == "LONG" or kw_en == "TAKE": p_edy_1 = 'q?o[pfk]eedy' p_ain_1 = 'q?o[pfk]aiin' p_edy_2 = 'q?[oy]?[pfk][che][eh][eh]?dy' p_ey_2 = 'q?[oy][kpf]ey' p_ain_2 = 'q?[oy][pfk][ao]ii?i?n' p_edy_3 = 'q?[oy][dlspft][ch][eh][eh]?dy' p_ain_3 = 'q?[oy][dlspft][ao]ii?i?n' p_rched_3 = '[r]ched[ao]?' p_osdaiin_3 = 'q?[oy]s[dlk]aii?n' bipat = ( ( 0.000, '久服|久食', "chedykaiin" ), # BLAR:f114r.4 ( 0.050, '久服|久食', "chdodaiin" ), # AHOR:f114r.8 ( 0.052, '久服|久食', "odaiinypchedy" ), # HLIM:f105r.28 ( 0.055, '久服|久食', "teeydaiin" ), # FOLA:f113r.37 ( 0.060, '久服|久食', "shodykain" ), # CINN:f115r.42 ( 0.065, '久服|久食', "otaiin" ), # CINN:f113v.47 ( 0.066, '久服|久食', "olaiin" ), # CINN:f113v.47 ( 0.070, '久服|久食', "otchedykchedy" ), # DRAG:f114r.14 ( 0.072, '久服|久食', "kchedychckhd" ), # DRAG:f114r.14 ( 0.100, '久服|久食', f"{p_edy_1}{p_ain_1}" ), ( 0.150, '久服|久食', f"{p_edy_1}|{p_ain_1}" ), ( 0.200, '久服|久食', f"{p_edy_2}{p_ain_2}|{p_ey_2}{p_edy_2}" ), ( 0.250, '久服|久食', f"{p_edy_2}|{p_ain_2}" ), ( 0.300, '久服|久食', f"{p_edy_3}{p_ain_3}|{p_edy_3}{p_rched_3}|{p_osdaiin_3}" ), ( 0.350, '久服|久食', f"{p_edy_3}|{p_ain_3}|{p_rched_3}" ), ( 0.360, '久服|久食', f"sheyqokey|qokeykeedy" ), ( 0.361, '久服|久食', f"shey[ao]?key|keykeedy" ), ) elif kw_en == "QI": bipat = ( ( 0.000, '气', 'chedy' ), ( 0.040, '气', 'che[ao]dy' ), # BAMB:f113v.38 ( 0.050, '气', 'ch[ao]dy' ), # AHOR:f114r.8 ( 0.060, '气', 'ckhedy' ), # MULB:f105v.8 ( 0.070, '气', 'chda' ), # COGO:f111v.26 ( 0.080, '气', 'chdedy' ), # WHOP:f114r.4 ( 0.090, '气', 'cheey' ), # JADE:f104v.32 ( 0.100, '气', 'ched[ao]' ), ( 0.160, '气', 'sheedy' ), # BAMB:f113v.38 ( 0.170, '气', 'sheor' ), # FOLA:f113r.37 ( 0.300, '气', '[cs]he?[dk][yao]' ), ( 0.500, '气', '[cs]heee[yao]' ), ( 9.000, '气', '[a-z][a-z][a-z][a-z][a-z]' ), # Desperation. ) elif kw_en == "BOOST-QI": # AHOR = f114r.8 otaiinarok # BAMB = f113v.38 araiincheody # BLAR = f114r.4 cheoldchedy # BROO = f115v.18 dalchedy # BROO = f114r.11 dolorshedy # CLAY = f115v.1 ralytchedylched # DEEG = f114r.11 shdolaiin # DEEG = f111v.34 lcheylsheka # DEEG = f107v.20 cholkchedy # DEEG = f112v.39 cheollchedy # DEEG = f113v.42 oraiinotaiin # DEEG = f113r.34 chedyldyyshssheeol # DEEG = f115v.31 shokchyykchedy # DONG = f107v.8 ytainshedy # DONG = f114r.8 chdaiinchedalos # DONG = f105v.29 okchdotardaiin # DONG = f113v.33 rchedyotain # DONG = f113r.34 sheodyshedain # JADE = f107r.4 okchedyqokeedqokearchedy # JADE = f113r.34 rchedyldyyshssheo # JADE = f108r.17 okeedylkaldaiin p_rchedy_1 = 'rchedy' p_schedy_2 = 'schedy' p_rcheda_2 = 'rched[ao]' p_rcheky_3 = 'rche[klr]y' bipat = ( ( 0.000, '益气', "rchedy" ), ( 0.020, '益气', "arokchedy" ), # AHOR:f114r.8 ( 0.025, '益气', "cheoldchedy" ), # BLAR,CLAY:f114.4 ( 0.026, '益气', "cholchedy" ), # COGO:f115r.10 ( 0.030, '益气', "araiincheody" ), # BAMB:f113v.38 ( 0.032, '益气', "kaiinche?o?dy" ), # CINN:f104v.29,f107r.24,f113v.47 ( 0.035, '益气', "dolorshedy" ), # BROO:f114r.11 ( 0.040, '益气', "otaiinchekey" ), # BAMB:f113v.38 ( 0.045, '益气', "olaiinchedy" ), # CLAY:f104v.22 ( 0.050, '益气', "otchedyockhedy" ), # MULB:f105v.8 ( 0.051, '益气', "ockhedyotchey" ), # MULB:f105v.8 ( 0.054, '益气', "kchedykchedy" ), # CINN:f115r.42 ( 0.055, '益气', "opchedykchdy" ), # MULB:f105v.8 ( 0.056, '益气', "saiinopchedy" ), # MULB:f105v.8 ( 0.057, '益气', "saiinchdedy" ), # WHOP:f114r.4 ( 0.100, '益气', f"{p_schedy_2}|{p_rcheda_2}" ), ( 0.300, '益气', f"{p_rcheky_3}" ), ) elif kw_en == "MAKES": bipat = ( ( 0.000, '令', 'che[oy]dy' ), ( 0.010, '令', 'che[oy]d' ), ( 0.020, '令', 'chdy' ), ( 0.100, '令', 'ch[eoy]dy?' ), ( 0.120, '令', 'cheey' ), ( 0.300, '令', '[cs][eh]e?[eo]?[dk]y?' ), ) elif kw_en == "TOOTH": bipat = ( ( 0.000, '齿', 'q?odaiin' ), ( 0.100, '齿', 'q?[oy][dk]ii?n' ), ) elif kw_en == "BLOOD": p_chodaiin_1 = 'chodaiin' p_okaiin_1 = 'q?okaiin' p_okchdy_1 = 'q?okchdy' p_oteey_1 = 'q?o[tpf]eey' p_oteey_2 = 'q?[aoy][tk][ec][eh][aoy]' p_oshey_2 = 'q?[aoy]sh[ec][aoy]' p_ain_2 = 'q?aii?i?n' p_ain_3 = 'q?[oy]ii?i?n' p_ok_2 = 'q?o[kpf]' p_ok_3 = 'q?[ol]*[aoy][dlspft]' p_otar_2 = 'q?o[tpf]ar' p_otar_3 = 'q?o[tpf]aii?n' bipat = ( ( 0.000, '血', f"{p_chodaiin_1}{p_okaiin_1}|{p_oteey_1}|{p_okchdy_1}" ), ( 0.010, '血', "kaiin" ), # ACOS:f107v.20 ( 0.020, '血', "taiin" ), # ACOS:f114v.11 ( 0.030, '血', "keeos" ), # COGO:f113r.34 ( 0.040, '血', "shedar" ), # FOLA:f113r.37 ( 0.050, '血', f"{p_ain_2}{p_ok_2}|{p_oteey_2}|{p_oshey_2}|{p_otar_2}" ), ( 0.100, '血', f"{p_ain_3}{p_ok_3}|{p_otar_3}" ), ( 9.000, '血', "[a-z][a-z][a-z][a-z][a-z]" ), # Desperation. ) elif kw_en == "AMENO": p_laiin_1 = 'laiin' p_otedy_1 = 'q?[oy]tedy' p_oteedy_1 = 'q?[oy]teedy' p_okeey_1 = 'q?[oy]keey' p_okaiin_1 = 'q?[oy]kaiin' p_okair_1 = 'q?[oy]kair' p_ockhey_1 = 'q?[oy]ckhe[oy]' p_oshey_1 = 'q?[oy]shey' p_ckhy_1 = 'ckh[oy]' p_aiin_1 = 'aiin' p_otleey_1 = 'q?[oy]tleey' bipat = ( ( 0.000, '血闭', f"{p_ockhey_1}{p_oshey_1}" ), ( 0.030, '血闭', "saiinkeeos" ), # COGO:f113r.34 ( 0.034, '血闭', "keedyckhy" ), # HLIM:f105r.28 ( 0.035, '血闭', "ckhyraiin" ), # HLIM:f105r.28 ( 0.100, '血闭', f"{p_oshey_1}{p_ckhy_1}" ), ( 0.200, '血闭', f"{p_laiin_1}{p_otedy_1}" ), ( 0.210, '血闭', f"{p_okaiin_1}{p_otedy_1}" ), ( 0.220, '血闭', f"{p_oteedy_1}{p_okeey_1}" ), ( 0.230, '血闭', f"{p_aiin_1}{p_otleey_1}" ), ) elif kw_en == "KILL": bipat = ( # ( 0.000, '杀', "chsd" ), # ROOS:f105v.32 # ( 0.020, '杀', "chsod" ), # ROOS:f105v.32 ( 0.000, '杀', "kaiin" ), # ROOS:f105v.32,CINN:f113v.47 ( 0.030, '杀', "[ao]?raiin" ), # CINN:f115r.42,MULB:f105.8 ( 0.032, '杀', "[ao]?taiin" ), # CINN:f104v.29 ( 0.035, '杀', "sheol" ), # BAMB:113v.38 ( 0.036, '杀', "sheeol" ), # COGO:f113.34 ( 0.037, '杀', "sheody" ), # ACON:f113r.34 ( 0.038, '杀', "dcheey" ), # ACON:f113r.34 ( 0.039, '杀', "pcheody" ), # FOLA:f113r.37 ( 0.046, '杀', "kchedy" ), # BROO:f114r.11 ( 0.047, '杀', "ychedy" ), # BLAR:f114r.4 ( 0.100, '杀', "chs[ao]?[ktpf]" ), ) elif kw_en == "ELIM": bipat = ( ( 0.000, '除', "chsok" ), # ROOS:f105v.32 ( 0.020, '除', "chsod" ), ( 0.025, '除', "lkaiin" ), # CINN:f113v.47 ( 0.026, '除', "[ao]?kaiin" ), # ROOS:f105v.32 ( 0.030, '除', "[ao]?raiin" ), # ROOS:f105v.32,CINN:f115r.42 ( 0.031, '除', "[ao]?rrail" ), # MULB:f105.8 ( 0.035, '除', "sheol" ), # BAMB:113v.38 ( 0.036, '除', "sheeol" ), # COGO:f113.34 ( 0.038, '除', "pcheody" ), # FOLA:f113r.37 ( 0.040, '除', "[ao]?keey" ), # ROOS:f105v.32 ( 0.042, '除', "[ao]?keeey" ), # ROOS:f105v.32 ( 0.045, '除', "rchedy" ), # ACON:f113r.34 ( 0.046, '除', "kchedy" ), # BROO:f114r.11 ( 0.047, '除', "ychedy" ), # BLAR:f114r.4 ( 0.048, '除', "dcheey" ), # ACON:f113r.34 ( 0.100, '除', "chs[ao]?[ktpf]" ), ) elif kw_en == "EAR": bipat = ( ( 0.000, '耳', "okaiin" ), ) elif kw_en == "HEAD": bipat = ( ( 0.000, '头', "keeey" ), # ROOS:f105v.32 ) else: assert False, f"invalid English keyword {kw_en}" return bipat # ----------------------------------------------------------------------