[闲聊] 推投统计程式

楼主: laechan (挥泪斩马云)   2015-05-28 11:11:15
在 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