作者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://webptt.com/cn.aspx?n=man/C_Chat/DE98/DFF5/D799/M.1403423300.A.8C0.html
// 投票结果统计文例子
https://webptt.com/cn.aspx?n=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://webptt.com/cn.aspx?n=bbs/mud/M.1432782679.A.29F.html
※ laechan:转录至看板 mud_sanc 05/28 11:15
目前以新的推投做实验中
┌─────────────────────────────────────┐
│ 文章代码(AID):
#1LP-GWn2 (C_Chat) [ptt.cc] [推投] 魔法科的劣等生女角人气 │
│ 文章网址:
https://webptt.com/cn.aspx?n=bbs/C_Chat/M.1432871968.A.C42.html │
└─────────────────────────────────────┘
开票结果在这一篇,试验结果良好
┌─────────────────────────────────────┐
│ 文章代码(AID):
#1LQLCuBo (C_Chat) [ptt.cc] Re: [推投] 魔法科的劣等生女角 │
│ 文章网址:
https://webptt.com/cn.aspx?n=bbs/C_Chat/M.1432965944.A.2F2.html │
└─────────────────────────────────────┘
正式的大规模推投
┌─────────────────────────────────────┐
│ 文章代码(AID):
#1LRcd9OP (C_Chat) [ptt.cc] [推投] 第二届希洽盃黑长直女角 │
│ 文章网址:
https://webptt.com/cn.aspx?n=bbs/C_Chat/M.1433299401.A.619.html │
│ 这一篇文章值 90 Ptt币 │
└─────────────────────────────────────┘
※ 编辑: laechan (210.61.157.53), 06/03/2015 13:35:50
1F:推 newmax : 推一个 114.45.16.241 06/03 23:58