Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[求助] 给各位插件作者出点编程小题目……

[复制链接]
sw08 发表于 2011-7-7 23:01:51 | 显示全部楼层 |阅读模式
本帖最后由 sw08 于 2011-7-13 23:03 编辑

以下的若干小问题来源于我这几年编写插件的实战经历,基本上都花了我不少时间来处理。现在换作你们,看看你们有没有什么好方法解决这些问题。其实我想说的是,做单一的功能插件简单,但是做个涉及复杂数据处理的插件那真是浪费脑力的。也希望大家能多关注下这方面的学习,对优化插件算法都是有很大的帮助的。

编程语言:PHP
数据库:SQL
以下问题均允许使用Discuz!定义的函数或模块功能

注意,不允许用下面的操作来处理:加额外的数据库字段来存储,使用单独的数据文件来读写

问题1:
在一个数据表中存放有uid,typeid,value,action
uid是用户的uid;typeid是分类标识(类型为整数型);value是对应的值;action是操作行为标识

假设有下面的数据
uid typeid action value
1      1        buy     20
1      1        buy     5
1      2        sell       20
2      1        buy     30
3      1        buy     40
3      2        sell       50
4      1        buy     35
4      2        sell       15

我想要下面的结果
做个排行榜,根据不同的typeid来分行为(buy,sell)来对同一用户的value求和,并对用户的value降序排列

例如是下面的结果
排名  typeid 用户UID 行为 总和
1          1        3           buy  40
2          1        1           buy  35
3          1        4           buy  35
4          1        2           buy  30

排名  typeid 用户UID 行为 总和
1          2        3           sell  50
2          2        1           sell  20
3          2        4           sell  15
问题来源于开发积分交易市场排行榜

问题2:
请编程输出下面的矩阵,要求体现出来对循环语句的使用技巧。for循环最多允许使用两次。
其中n由用户给定。

n=2
XXOO
XXOO
OOXX
OOXX

n=3
XXXOOOXXX
XXXOOOXXX
XXXOOOXXX
OOOXXXOOO
OOOXXXOOO
OOOXXXOOO
XXXOOOXXX
XXXOOOXXX
XXXOOOXXX

问题来源于开发数独插件的时候

问题3:
Discuz! X2.0把附件信息分了10个表,分别是forum_attachment_0 ~ forum_attachment_9来存放论坛附件信息,我现在想统计用户在某一天累计上传的附件的流量,但是直接查10个数据表是肯定会让系统不负重堪的。

现在问你,怎么合理的处理这个问题,既不用查10个表浪费大量系统资源,但又可以得到比较好的结果。

问题来源于开发工资插件的时候

问题4:
假设有个多选题,选项的个数由用户设定(未知),各个选项的值分别是1,2,3,4...n

我希望对于某种特定的表单提交结果给予特定的分数

例如说,问题是 你最喜欢的字母是:
选项从 A到E
完整的答案是A,C,D,E
好的,我要求全选对的得10分,选错的没有分数,少选但选对的,少选一个减2分,扣完为止。例如我选了A,D,E,可以得到8分。

选项个数由用户给出,假设用变量$n给出,标准答案保存在变量$answer中,标准格式是 A,B,D,E(中间用逗号隔开)

问题来源于开发问卷插件的时候

问题5:
计划任务延迟执行是很讨厌的事情,不过在不得不接受这个事实的前提下,如何用计划任务准确统计出相对于执行的时间,用户在昨天的发帖量?
提示,这个问题有个陷阱,是以前一直被人忽视的问题。希望作者在编写插件的时候能注意到类似这样的问题。

问题来源于开发工资插件的时候

评分

3

查看全部评分

hkcn 发表于 2011-7-7 23:04:48 | 显示全部楼层
本帖最后由 hkcn 于 2011-7-7 23:07 编辑

我是路过的~!
第一个问题,可以参考 我的大赛作品:亮点回复

(不过个人认为,那段SQL 是有问题的,加个索引 应该可能就无事了!)

其他问题,阿门~!
回复

使用道具 举报

魔焰男孩 发表于 2011-7-7 23:13:10 | 显示全部楼层
楼主,好久不见哈 {:soso_e144:}
回复

使用道具 举报

hkcn 发表于 2011-7-7 23:14:46 | 显示全部楼层
LZ,睡觉了!
我们可以八卦下LZ 睡觉的动作
回复

使用道具 举报

pchhh 发表于 2011-7-7 23:17:48 | 显示全部楼层
我只是参观下~~~~~~~~

楼主可以拿着插件到腾讯公司去应聘了
回复

使用道具 举报

魔焰男孩 发表于 2011-7-8 00:45:14 | 显示全部楼层
本帖最后由 魔焰男孩 于 2011-7-8 00:54 编辑

最近比较无聊,尝试一下回答楼主的问题吧。

给问题2矩阵写了一段代码:

  1. function matrix($n) {

  2.         $return = '';
  3.         $newline = "<br />";

  4.         $x = pow($n, 2);
  5.         $y = pow($n, 4);

  6.         $j = $k = 0;
  7.         $char = $first = 'X';

  8.         for($i = 0; $i < $y; $i++) {
  9.                 $return .= $char;
  10.                 if((++$j) == $x) {
  11.                         $return .= $newline;
  12.                         $j = 0;
  13.                         if(((++$k) % $n) == 0) {
  14.                                 $first = $char = ($first == 'X' ? 'O' : 'X');
  15.                         } else {
  16.                                 $char = $first;
  17.                         }
  18.                 } else if(($j % $n) == 0) {
  19.                         $char = $char == 'X' ? 'O' : 'X';
  20.                 }
  21.         }

  22.         return $return;

  23. }

  24. /* n=2 */
  25. echo matrix(2);

  26. /* n=3 */
  27. echo matrix(3);
复制代码
问题4不太明白。

问题5,用时间戳判断总可以吧?被人忽视的问题是指时差吗?时差又分系统时差和用户自定义时差,无论楼主指的是不是这个,这点都很值得各位注意。

评分

2

查看全部评分

回复

使用道具 举报

魔焰男孩 发表于 2011-7-8 00:46:57 | 显示全部楼层
另外,我喜欢这种学术性的帖子,希望插件区也多一些讨论,少一些功利性的东西。
回复

使用道具 举报

 楼主| sw08 发表于 2011-7-8 07:05:54 | 显示全部楼层
魔焰男孩 发表于 2011-7-8 00:45
最近比较无聊,尝试一下回答楼主的问题吧。

给问题2矩阵写了一段代码:问题4不太明白。

问题2:基本没问题了,但是我的原意是希望n是任意给的。例如n=4,也按照这个规律输出矩阵

问题5:对的,用时间戳解决,但是要考虑时差的问题,例如说我设置计划任务在0点执行,其实这个0点指的是服务器的零点而不是东八区的零点,所以执行下来,查询的结果会有8小时的偏差。这个时候在查询的时候就要把此时的时间戳加时区偏移。

有时候插件不考虑时区是个问题,例如说签到插件,如果忽视了时区,那么用户就可能出现在非指定的时段签到的情况。
回复

使用道具 举报

 楼主| sw08 发表于 2011-7-8 07:27:19 | 显示全部楼层
魔焰男孩 发表于 2011-7-8 00:45
最近比较无聊,尝试一下回答楼主的问题吧。

给问题2矩阵写了一段代码:问题4不太明白。

问题3牵扯到一个随机查询的思想在里面,以前我的老师说,如果效率和数据不得不取一舍一的话,那我们就选择更重要的。这里我要统计附件流量,如果说用户上传了大量附件,而附件信息落在任何一个数据表的概率是均等的(取决于帖子ID除10的余数,所以说可以视为等概率随机)。那我生成个随机数,随机查一个个表,然后乘10就可以了。也许牺牲了部分数据精度(从一个假设的实际情况来说,抽查统计得到100KB,和精确统计得到的101KB,这个误差对一般使用者来说是几乎可以忽视的),但是却换来了大量的系统资源。
下面的一段查询就是这个思想的体现:
  1. $query = DB::query("SELECT * FROM ".DB::table('forum_attachment_'.rand(0,9))." WHERE uid IN ($uidlist) ORDER BY aid DESC");
  2. while($result_c5 = DB::fetch($query)){
  3.            $usercheck[$result_c5['uid']][9] += abs($result_c5['filesize']*10/1024);
  4. }
复制代码
问题4:就是少选给分,选错不给分这类问题,以前在学校考试都做过吧。
回复

使用道具 举报

drfdxr 发表于 2011-7-8 10:05:22 | 显示全部楼层
支持。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-6-2 13:16 , Processed in 0.114564 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表