[閒聊] 推投統計程式

看板mud (網路地下城/文字遊戲)作者 (小太保)時間10年前 (2015/05/28 11:11), 10年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
在 C_Chat 板有一種活動叫推投,範例如下 棋靈王人氣男角推投(每個人可投三票): 進藤光@ 塔矢亮@ 藤原佐為@ 筒井公宏@ 加賀鐵男@ 三谷祐輝@ . . 一般來說,推投的格式如下: 推 laechan:進藤光@ 塔矢亮@ 藤原佐為@ 三大男主角 05/28 10:17 ^^^^^^^^^^^^^^^^^^^^^^^^ 應援敘述區 有些中文字含有 "@" 這個字元,但因為 "@ " 也就是 @ 之後的空白是 被要求必須要有的,因此在做 explode 時就可以用 "@ " 來分隔。 也就是說,基本的程式段如下.. // 1.先將推投檔分行處理 tmps = explode(推投檔,"\n"); foreach(tmp in tmps) { // 如果每一行長度不符推文長度就跳過 if(strlen(tmp)<tmp_len) continue; // 如果每一行的格式不符推文格式就跳過 if(sscanf(tmp,"%s %s:%s %d/%d %d:%d",t1,t2,t3,n1,n2,n3,n4)!=7) continue; // t2 = "laechan" // t3 = "進藤光@ 塔矢亮@ 藤原佐為@ 三大男主角 " // 對 t2 這個投票者的資料做初始化 if(undefinedp(data["voters"][t2])) data["voters"][t2]=({}); tmps3=explode(t3,"@ "); // tmps3 = ({"進藤光","塔矢亮","藤原佐為","三大男主角 "}) // 開始對每一行的推投做處理 foreach(t3 in tmps3) { // 先比對每一個 t3 有沒有在可投名單內 if(member_array(t3,legal_terms)==-1) continue; // 再判斷 t2 這個投票者有沒有投過 t3 if(member_array(t3,data["voters"][t2]) continue; // 再判斷 t2 這個投票者是否已投滿 3 票了 if(sizeof(data["voters"][t2])>=legal_num) continue; // 通過上述判斷代表 t2 這個投票者投 t3 是有效的 data["voters"][t2]+=({t3}); } } // 處理完畢後,data["voters"] 就儲存了所有的投票資訊 將程式寫在 mud 裡面的缺點,就是「推投檔」這個東西是要另外建立的, 不過它並不困難,只要複製 C_Chat 板裡面的推投文到 mud 裡頭即可,一 次可複製 2x 行,而且已複製過的就不用再複製,而且就算不這麼做,例 如透過程式去讀 ptt 該文的網址資料,將內容抓到 mud 內處理,也是可 以的(或者整頁複製也辦得到)。 另一個缺點就是投票者無法即時取得投票結果,因為它必須依賴舉辦者自 己跑程式後去公布結果。 不過,除了這兩個缺點以外,就通通都是優點: 一、可隨自己制定的推投規則,來撰寫相對應的推投處理程式。例如說我 們允許投票者可以三票都投同一人、或者允許 進藤光x2@ 這樣的推投 方式,或是 進藤光@ 進藤光@ 這樣,而不必受限於既有的推投程式。 二、可自己增加許多推投統計。例如第一優先順位被推投項目第一名這類 的,例如說 100 位投票者裡面有 50 個人第一票都投 進藤光@ 這樣 ,那進藤光的「第一優先順位被推投」票數就是 50 票。 三、得票率統計的多樣性。例如一般是統計得票數的多寡,但同時還能統 計同一個推投項目的人氣第一名之類的,例如說進藤光得票數 100票 ,可能輸給塔矢亮的 105 票,但是 150 個推投者裡面有 80 個人把 票投給近藤光,可能比只有 75 個人投給塔矢亮還多。 (有些人可能投近藤光x2,有些投塔矢亮x3) 我之前有試寫一個試作版本,並用它來處理我所舉辦的兩項推投,其中黑 長直推投的部份證明了 fluffos + tmi2-mudlib 在純文字處理上的優越性 ,當然,能直接對網頁處理是更簡便的,不過我還是習慣用自己熟的東西 來寫。 一、黑長直 // 推投文例子 http://disp.cc/b/21-7Gfi // 投票結果統計文例子 http://disp.cc/b/21-7HgE 當時使用的程式 程式(LPC 程式語言) http://sanclaechan.myweb.hinet.net/black_code.txt 樣本(複製 bbs 這邊符合 @@ 格式的推文,於工作站上用 vi 貼上後存檔) http://sanclaechan.myweb.hinet.net/black.txt 結果(全部的票選結果,按角色名字順序排列) http://sanclaechan.myweb.hinet.net/black_vote.txt 二、K-ON輕音部 // 推投文範例 https://www.ptt.cc/man/C_Chat/DE98/DFF5/D799/M.1403423300.A.8C0.html // 投票結果統計文例子 https://www.ptt.cc/man/C_Chat/DE98/DFF5/D799/M.1403429108.A.040.html 當時使用的程式 程式 http://sanclaechan.myweb.hinet.net/code.txt 樣本 http://sanclaechan.myweb.hinet.net/k-on.txt 結果 http://sanclaechan.myweb.hinet.net/k-on_vote.txt 以上一點心得分享。最近有打算再辦一次推投,正在改程式中。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.157.53 ※ 文章網址: https://www.ptt.cc/bbs/mud/M.1432782679.A.29F.htmllaechan:轉錄至看板 mud_sanc 05/28 11:15 目前以新的推投做實驗中 ┌─────────────────────────────────────┐ │ 文章代碼(AID): #1LP-GWn2 (C_Chat) [ptt.cc] [推投] 魔法科的劣等生女角人氣 │ │ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1432871968.A.C42.html │ └─────────────────────────────────────┘ 開票結果在這一篇,試驗結果良好 ┌─────────────────────────────────────┐ │ 文章代碼(AID): #1LQLCuBo (C_Chat) [ptt.cc] Re: [推投] 魔法科的劣等生女角 │ │ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1432965944.A.2F2.html │ └─────────────────────────────────────┘ 正式的大規模推投 ┌─────────────────────────────────────┐ │ 文章代碼(AID): #1LRcd9OP (C_Chat) [ptt.cc] [推投] 第二屆希洽盃黑長直女角 │ │ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1433299401.A.619.html │ │ 這一篇文章值 90 Ptt幣 │ └─────────────────────────────────────┘ ※ 編輯: laechan (210.61.157.53), 06/03/2015 13:35:50

06/03 23:58, , 1F
推一個
06/03 23:58, 1F
文章代碼(AID): #1LPeTNAV (mud)
文章代碼(AID): #1LPeTNAV (mud)