Fw: [閒聊] 推投統計程式

作者: laechan (揮淚斬馬雲)   2015-05-28 11:15:22
※ [本文轉錄自 mud 看板 #1LPeTNAV ]
作者: laechan (小太保) 看板: mud
標題: [閒聊] 推投統計程式
時間: Thu May 28 11:11:15 2015
在 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
以上一點心得分享。最近有打算再辦一次推投,正在改程式中。

Links booklink

Contact Us: admin [ a t ] ucptt.com