能力值:
(RANK:1130 )
|
-
-
|
能力值:
(RANK:1130 )
|
-
-
[原创]腾讯2010竞赛第三阶段题目思路+代码
1,大家都知道这个是赌博题,大家的答案都不是完美的,只是缺陷不一样而已
2,代码发出来是以技术交流为目的的,难道大家喜欢某数字公司的竞赛,src也归主办方所有?
3,如果觉得代码有用,就学习一下,如果觉得没用,shift+del删除即可
4,如果觉得自己的答案也很不错,可以发出来,让大家学习一下
|
能力值:
(RANK:1130 )
|
-
-
[原创]腾讯2010竞赛第三阶段题目思路+代码
你的f1是kernel32.dll里面的还是tmp.dll里面的?
如果是tmp.dll里面我是获取不到的
如果是kernel32.dll,你先把kernel32.dll卸载掉,然后在load进来?
|
能力值:
(RANK:1130 )
|
-
-
[原创]腾讯2010竞赛第三阶段题目思路+代码
1,2 算我题目理解错了吧
1,我理解成测试程序只有一个bin,所以两个文件,要释放tmp.dll dll.dll,这样,我的程序是无法事先获取f1的地址,没有这个api地址,走的是SearchAll流程
3,你写一个试一试呢?
|
能力值:
(RANK:1130 )
|
-
-
[原创]腾讯2010竞赛第三阶段题目思路+代码
1,非系统的dll一样可以检测,不信,你可以试试,api获取失败,会进入SearchAll的状态,每次都去尝试搜索第一个api的
2,多线程懒得搞了
3,题目说明里面写了, 都是由exe主程序调用的
4,这个机制问题,没法解决
5,再大也可以处理,除非程序本身运行就会超时
我只赌了2点,1,单线程,2,不检查单步
多线程可以解决的,只是懒得弄了,我觉得,测试用例有多线程会更复杂,时间误差更大(线程切换是需要时间的)
单步无法解决,所以不解决了
|
能力值:
(RANK:1130 )
|
-
-
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
我把我的程序,和我测试的结果发上来给大家看看
testlbr.exe和提交的答案,仅仅是打印信息的格式从两行变成了1行
1.txt,是我在一台xp机器上面,每个样本跑了20遍的结果
2.txt,是我在我自己电脑上跑A0.exe,跑了20遍的结果(我的电脑是win7系统,a1-a4本身就不能执行)
大家再对比一下评委里面我测试程序的结果,看看误差有多可怕吧把附件解压到同一目录,运行test.bat > test.txt 来获得结果
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
对啊,那你来设计一套计量方法避免误差啊。。。
假设误差是15ms,如果成绩是16ms和21ms,你认为误差可以忽略吗?
假设误差是15ms,如果成绩是1016ms和1030ms,你认为误差可以忽略吗?
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
当误差时间和实际时间几乎差不多的情况下,增加测试次数是无法避免的
这里只能改进计量方法,那你来设计一套避免误差的计量方法,让评委重新测试一次?
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
a0 a1 a2增加1000ms是为了避免误差给结果带来的不公平
20楼的代码已经很明显说明了,GetTickCount计算时间在很短的时候,是不精确的,有误差的
48楼的兄弟说了评委在测试方法上面所带来的误差
所以, 在程序本身运行时间很短的情况下,这些误差是不能忽略的
加1000ms,这些误差基本上可以忽略,让结果相对公平些
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
1,实不相瞒,我就是用Debug方式做的,没有Hook 进程的一行代码
2,你可以解释一下20楼的现象
|
能力值:
(RANK:1130 )
|
-
-
|
能力值:
(RANK:1130 )
|
-
-
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
赌博题其实无所谓,我的答案,兼容性相当好,只有极少的anti能灭掉
重新制定规则,重新出样本,我还是这份答案,但是输在GetTickCount的精度上面,我觉得很不公平
|
能力值:
(RANK:1130 )
|
-
-
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
加10000ms的话,后面两个也要加上9000ms
后两个减1000ms是不公平的,理由我前面说了,GetTickCount是不精确的,小于20ms的都不是其真实时间
看下面的code
#include <windows.h>
#include <stdio.h>
int main()
{
DWORD t = GetTickCount();
Sleep(1);
DWORD t1 = GetTickCount();
printf("time: %d\n", t1 - t);
return 0;
}
我这里运行,有时候是15,有时候是0,精确吗?
再看下面的code
#include <windows.h>
#include <stdio.h>
int main()
{
DWORD t = GetTickCount();
Sleep(1000);
DWORD t1 = GetTickCount();
printf("time: %d\n", t1 - t);
return 0;
}
我这里运行,每次都是998,精确度比上面高多了
再看下面的code
#include <windows.h>
#include <stdio.h>
int main()
{
DWORD t = GetTickCount();
Sleep(10000);
DWORD t1 = GetTickCount();
printf("time: %d\n", t1 - t);
return 0;
}
每次都是10000
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
我给评委一个简单建议: 将前3条,每人的时间都加1000ms,然后重新算分
理由很简单,GetTickCount精度不够,加上与最后2条的Sleep(1000); 统一
|
能力值:
(RANK:1130 )
|
-
-
[成绩][第三阶段成绩]
我对评分标准有些质疑
看A1成绩,16ms和21ms相差5ms,分数相差5分
看A3成绩,1094ms和1130ms相差36ms,分数却相差0.64分
也许你会说A3的基数大了,但是我想说的是,A3题目里面有个Sleep(1000),这个完全不是我们程序所消耗的时间,能把这个因素算作基数里面吗?
另外,我的A1自测情况,有时候是16ms,有时候是8ms,用GetTickCount计算时间,在30ms以下都是不精确的,能否将这两个分数拉出一倍的差距吗?
极端例子请看这个帖子的A1:
http://bbs.pediy.com/showpost.php?p=890231&postcount=25请看第4名和第5名,第4名做对5条,而第5名只做对3条,分数却只相差2分,仔细研究会发现,是前两条测试用例,相差了52ms所导致的,这个公平吗?
这题基本属于猜题类型的,个人觉得,不应该完全用时间来评分
|
能力值:
(RANK:1130 )
|
-
-
|