精華區beta mud_sanc 關於我們 聯絡資訊
Pattarn: 為第(%1)段 Commands: chnumbers="零 一 二 三 四 五 六 七 八 九" #var bloodmap %1 #loop 0,9 {#var bloodmap %replace(@bloodmap,%word(@chnumbers,%eval(%i+1)),|%i|)} #delitem bloodmap "" #case (%ismember(%ismember(十,@bloodmap),0|1)) {#var total 0} {#var total 10} {#var total %eval(%item(@bloodmap,%ismember(十,@bloodmap)-1)*10)} #if (%ismember(百,@bloodmap)>0) {#var total %eval(%item(@bloodmap,1)*100+@total)} #if (%item(@bloodmap,%numitems(@bloodmap))<10) {#var total %eval(%item(@bloodmap,%numitems(@bloodmap))+@total)} #say @total 說明: 01行:建立一個字串chnumbers,裡面包含中文字一到九。 03行:將段數存入bloodmap,由於血肉長城的段數不完全符合書寫標準,所以段數有    以下情況:        一    十 << 標準格式為一十。    十七 << 標準格式為一十一。      八十二    三百    三百零九    三百四十    四百五十六 04行:用loop將chnumbers裡的中文字改成數字0~9,chnumbers沒有第0項,所以要加    1。上列段數經置換後結果如下: 原 格 式  置 換 後 結 果        一 |1|    十 十    十七 十|7|      八十二 |8|十|2|    三百 |3|百    三百零九 |3|百|0||9|    三百四十 |3|百|4|十    四百五十六 |4|百|5|十|6| 05行:現在bloodmap的內容是標準String list格式,為了讓內容更好判斷,必須將    空白欄位刪除,使用#delitem處理後如下: 原 格 式  置 換 後 結 果 delitem處理結果        一 |1| 1    十 十 十    十七 十|7| 十|7      八十二 |8|十|2| 8|十|2    三百 |3|百 3|百    三百零九 |3|百|0||9| 3|百|0|9    三百四十 |3|百|4|十 3|百|4|十    四百五十六 |4|百|5|十|6| 4|百|5|十|6 06行:本行在處理十位數的計算,將十位數計算置於首位可以順便將舊有的total值 重新寫入,十位數的計算有以下情況: delitem處理結果 資料筆數 "十"的位置 判斷結果  選擇項  結果  01 1 1 none(0) 1 1 0 02 十 1 1 2 2 10 03 十|7 2 1 2 2 10 04 8|十|2 3 2 none(0) 3 80 05 3|百 2 none(0) 1 1 0 06 3|百|0|9 4 none(0) 1 1 0 07 3|百|4|十 4 4 none(0) 3 40 08 4|百|5|十|6 5 4 none(0) 3 50 #case 判斷式結構如下: 算出"十"在bloodmap的位置(上表黃色欄位) (%ismember(%ismember(十,@bloodmap),0|1))  算出黃色式子的值在藍色列表的位置╝(上表綠色欄位) 選擇項代表三個情況:1.十不存在。2.十前方無數字。3.十前方有數字。 1與2內容很簡單無須說明,而3結構如下: 算出"十"前一筆資料在bloodmap的位置   %eval(%item(@bloodmap,%ismember(十,@bloodmap)-1)*10) 取出bloodmap中,"十"前一筆資料 將該筆資料X10 07行:本行執行百位數的計算,比起十位數相對容易得多,僅有兩種情況: delitem處理結果 "百"的位置 判斷結果  選擇項  結果  加 總 01 1 none(0) 0 2 不執行 02 十 none(0) 0 2 不執行 03 十|7 none(0) 0 2 不執行 04 8|十|2 none(0) 0 2 不執行 05 3|百 2 1 1 300 300 06 3|百|0|9   2 1 1 300 300 07 3|百|4|十   2 1 1 300 340 08 4|百|5|十|6 2 1 1 400 450 #if 判斷式如下,找出百在bloodmap第幾個欄位,大於0,就選擇執行項目1,    小於0,因為沒設定項目,所以結束: (%ismember(百,@bloodmap)>0) 選擇項1結構如下: 取出bloodmap第一欄資料 %eval(%item(@bloodmap,1)*100+@total) 黃色式子的結果X100再加上total的值 如果要計算到千位,上方選擇項就要用十位數計算式選項3的寫法。 08行:本行執行個位數的計算,基本上就是判斷末筆資料是否小於10: delitem處理結果 資料筆數 末筆資料 判斷結果  選擇項  結果 加 總 01 1 1 1 1 1 1 1 02 十 1 1 none(0) 0 不執行 不執行 03 十|7 2 2 1 1 7 17 04 8|十|2 3 3 1 1 2 82 05 3|百 2 2 none(0) 0 不執行 不執行 06 3|百|0|9 4 4 1 1 9 309 07 3|百|4|十 4 4 none(0) 0 不執行 不執行 08 4|百|5|十|6 5 5 1 1 6 456 到這裡,計算已經完成了! 09行:觀看執行結果.... 結語:如果要計算到千位和萬位,做法都相似,多兩道判斷罷了!    而十萬位以上甚至千億位,做法就會有些不同,理論如下: 1.先做出計算到千位的轉換式子。 2.在前方加上一道程序,假設現在有一個中文段數:      九千八百七十六億五千四百三十二萬一千零九十八 3.先將零到九全改成數字,結果如下: 9|千|8|百|7|十|6|億|5|千|4|百|3|十|2|萬|1|千|0|9|十|8 4.以億與萬為中心,將上列String list切成三段: A: 9|千|8|百|7|十|6 B: 5|千|4|百|3|十|2 C: 1|千|0|9|十|8 5.分別帶入已寫好的千位數計算式子中,轉換好後帶入以下式子: A*100000000+B*10000+C 6.結果就會出來了。要再做出什麼樣的天文數字都不成問題,loop多跑幾圈罷了!