mud 板


LINE

看板 mud  RSS
最近有人問,思考了一下做法,以下是偏懶人做法,例如各 mud 大致都有 chinese_number 這個 simul_efun,比方: int n=12345; string sn=chinese_number(n); write(n+" = "+sn); 結果 12345 = 一萬兩千三百四十五 那問題就是如何把 一萬兩千三百四十五 轉回 12345,簡單的做 法是土法煉鋼: int return_n(string sn) { int i=0; while(i++>=0) if(sn==chinese_number(i)) return i; } 但是這樣的問題就是無效的呼叫太多,而且數字越大,迴圈越久 ,這時直覺的想法就是做個簡單的區別,例如假設整數最大數值 是 21 億多: int return_n(string sn) { mixed tmps=({}); int n=0; if(strsrch(sn,"億")) { tmps=explode(sn,"億"); if(sizeof(tmps)<2) tmps+=({"零"}); for(i=1;i<10000;i++) if(tmps[0]==chinese_number(i)) break; n+=i*100000000; sn=tmps[1]; } if(strsrch(sn,"萬")) { tmps=explode(sn,"萬"); if(sizeof(tmps)<2) tmps+=({"零"}); for(i=0;i<10000;i++) if(tmps[0]==chinese_number(i)) break; n+=i*10000; sn=tmps[1]; } for(i=0;i<10000;i++) if(sn==chinese_number(i)) break; n+=i; return i; } 也就是把它拆成看多少個億、然後底下多少個萬、再底下有多少, 去各自做解析,這樣迴圈可以跑少一點。 進一步來說,針對多少個億、多少個萬、..,還可以做以下的解析 int return ranges(string tmp_sn) { if(strsrch(tmp_sn,"千")) return ({1000,10000}); else if(strsrch(tmp_sn,"百")) return ({100,1000}); else return ({0,100}); } 然後上面的 return_n 函數內部份做改寫如下: mixed ranges=({}); if(strsrch(sn,"萬")) { tmps=explode(sn,"萬"); if(sizeof(tmps)<2) tmps+=({"零"}); ranges=return_ranges(tmps[0]); for(i=ranges[0];i<ranges[1];i++) if(tmps[0]==chinese_number(i)) break; n+=i*10000; sn=tmps[1]; } 它的意思是: 如果是一千兩百三十四,那 for(i=1000;i<10000;i++) 就好 如果是一百二十三,那 for(i=100;i<1000;i++) 就好 如果是五十九,那 for(i=0;i<100;i++) 就好 根據以上,還可以進一步改寫 return_ranges 函數: int return ranges(string tmp_sn) { int t; if(t=strsrch(tmp_sn,"千")) { switch(tmp_sn[t-2..t-1]) { case "一": return ({1000,2000}); break; case "二": case "兩": return ({2000,3000}); break; case "三": return ({3000,4000}); break; . . case "九": return ({9000,10000}); break; } } 上面的判斷也可以寫成函數比方 return_units int return_units(string tmp_unit) { switch(tmp_unit) { case "一": return ({1000,2000}); break; case "二": case "兩": return ({2000,3000}); break; // 留意 2 會有二跟兩 case "三": return ({3000,4000}); break; . . case "九": return ({9000,10000}); break; } } 這樣 return_ranges 就可以改寫為 int return ranges(string tmp_sn) { int t; if(t=strsrch(tmp_sn,"千")) return return_units(tmp_sn[t-2,t-1]); else if(t=strsrch(tmp_sn,"百")) return return_units(tmp_sn[t-2,t-1]); // 百以下就不管了 for(i=0;i<100; 迴圈數不多) else return ({0,100}); } 比方 如果是三千兩百二十一,那就 for(i=3000;i<4000;i++) 那可不可以再進一步解析讓迴圈少跑一點呢? 可以,但是,沒必要, 我一慣的想法是: 把解析寫得很簡單 => 程式跑起來loading大 把解析寫得很複雜 => 程式跑起來loading小 那根據均值定理,必定存在一種寫法,可以取得平衡,即程式解析不 用寫得很精確,程式跑起來loading也不會太重就好了。 (上面的程式及函數段,我沒有實際跑過,可能會有 error 要 debug) 以上,一點分享。前提是中文數字的產生均是透過 chinese_number ,例如說如果你要程式解析 "玖壹壹",這是辦不到的,因為通常在 mud 裡頭不會把 int n=911 解成 "玖壹壹",而會解成"九百一十一" Laechan --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.33.66.104 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/mud/M.1636941239.A.C4C.html laechan:轉錄至看板 mud_sanc 11/15 09:54
1F:→ laechan : 以上的東西其實也可以用在防機程式,即跑出一行中文 11/15 09:56
2F:→ laechan : 數字,要使用者鍵入它的阿拉伯數字是多少 11/15 09:56
3F:推 roujuu : 呼叫 siri。^^;;;(認真貌) 11/15 22:35
4F:推 tsetsethatha: 感謝分享!! 11/16 22:17







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP