标题: [数值计算] CWHGN比赛来啦!可以用任何语言任何算法来猜数哦! [打印本页]
作者: tiger999 时间: 2017-7-25 15:23 标题: CWHGN比赛来啦!可以用任何语言任何算法来猜数哦!
本帖最后由 tiger999 于 2017-7-26 23:23 编辑
首先感谢 bbaa在排行版上面的制作和index的纠正
其次是这游戏
首先这游戏的灵感是来自于bbaa的猜数游戏
这个游戏和bbaa的猜数游戏有一点不一样
bbaa的游戏是反馈大和小,我的则是反馈A和B的数量
主页是
http://www.codetiger.win/extra/index.php
什么是A和B的数量呢?请看下面
这个游戏是著名的猜数字游戏
百度百科介绍,里面还有一些算法可以帮你!
是一个4位数用10个数字0-9(也就是5040种排列,PS不能有重复)
如果位置对了数字也对了那么就是一个A
如果数字对了但是位置错了那么就是一个B
举个例子答案是9124
我猜了9042
9是A 那就是1A
2是B 4是B 那就是2B
那么这个答案就是1A2B
现在说API端口
http://www.codetiger.win/extra/API.php (可能还没开放)
POST和GET都可以(我用的是request 2333)
参数:
passwordstring)
username:(string)
number:(int)
send:answer (必须只能是answer)
返回的是
Content-type: application/json
tokens:(int)
A:(int)
B:(int)
count:(int)
code:(int)
code的意义:
100对了!你是胜利者!
150全部符合要求,可是答案错了
200参数残缺!
300密码都错了,你还弄啥
400参数number的位数不是4位数
500参数number有重复数字
这里PS一下 tokens可以被理解为这一局的编号,如果tokens变了,证明有其他人做出来了
而count是自己目前的积分
还有请务必加群,因为这其实本身是群内的比赛,人不太够,并且这个比赛有奖品,所以如果你不加群我也不知道去哪里找你
对!这个比赛有奖品哦!参加过上次群里的比赛的人可能知道,这奖品奖金还挺多的哦!
作者: 老刘1号 时间: 2017-7-25 16:24
本帖最后由 老刘1号 于 2017-7-25 16:30 编辑
HASH的话,可以试试挖矿……
先求出指定长度的所有组合,然后求每个组合对应的HASH,这算挖矿完成
然后根据HASH倒退出组合的话,应该会比较快
小于6位可以试试
大于的话……工程量有些大……
我这段看起来和一楼没什么联系,楼主别介意哈……
作者: 3518228042 时间: 2017-7-25 18:08
本帖最后由 3518228042 于 2017-7-25 19:11 编辑
有能力的话搞个众算币吧,这个我没能力搞,比如光子叠加态算法,让巨量电脑帮忙挖矿,叠加到360度任意纬度多次叠加,成果可以是你的,
还有比如色谱叠加算法,三原色、六基色或五色激光、七色的都可以,四色的貌似有人搞DNA算法了,数据错误能自动纠错,
多色激光在光纤传输的话,可以多次释放以数万倍的压缩率在电脑与设备之间传输,别人说可以数万倍,我通过我的计算可以万倍压缩传输,我不懂纠错码不能确保准确率,还得解码芯片就更搞不定了。
上次看文章说中国、德国已经能用多色激光以3百多倍压缩率远距离传输(具体几色不知道,而且具体倍数也忘记了),由于光纤传输过程中的损失不可能做太大,但是短距可以。
5色激光,红、绿、蓝、红外线、紫外线分割成1024极亮度或更大,每个脉冲颜色的激光代表的不是1bit,而是一个数值及前后的数值,
传输可以是16进制的,计算可以是6进展的,这样损失了相邻的就会立刻被发现,而多个bit的激光才是每次完整的一次传输,
纠错码及多次解码公式同步传输,这样可以传输给别人的是一个计算题,而别人得到的是一个一个计算题+结果。
说明下,这个还真没群,以前在一个比特币群一些人就讨论过,比特币开发者可能用分布式计算,让众多完成图形叠加算法或池化,当时还是什么也不知道的。
我是在2008年过年的时候别人教我挖比特币的,挖了很多,最多一天能十几个,少的几个,我都不去看我挖了多少,
由于我连续挖矿电脑死机坏了,电脑以前放片被我爸发现,结果送修被我爸格式化了,还是给重新分区给安装win7x64的,分区表都被替换的,比特币数据被覆盖,
原先备份的光盘是和盗版XP混一起的,结果后来花了读不了,没想到现在比特币涨那么多,如果国家数据中心能帮忙找回数据就好了,他们自己搞去算捐献了
作者: 老刘1号 时间: 2017-7-25 18:19
回复 5# 523066680
哈哈哈好像确实没群号,笑抽
作者: a2002 时间: 2017-7-25 18:59
同上
还有这么加PB
作者: 老刘1号 时间: 2017-7-25 21:55
回复 7# a2002
首先你需要混成斑竹或者技术组成员
作者: 老刘1号 时间: 2017-7-25 21:56
回复 4# 3518228042
哈哈,那太可惜了啊
作者: codegay 时间: 2017-7-25 22:51
tiger999 是a2002的小号吗?
刚上高中?也这么厉害的。
作者: a2002 时间: 2017-7-25 23:03
这...这...这不关我的事呀
作者: happy886rr 时间: 2017-7-25 23:09
回复 10# codegay
他们是来自bat吧的。bat吧是批处理自由技术的发源地,而批处理之家更倾向于批处理学术教学。这群小伙伴都是小学、初中的在校生,但技术很厉害的。
作者: codegay 时间: 2017-7-26 11:14
沿着这个思路扩展,各种九宫格,魔方之类的也可以放上比赛了。
作者: a2002 时间: 2017-7-26 11:23
九宫格是数独么
作者: a2002 时间: 2017-7-26 11:43
回复 15# 523066680
lz已经忘了这件事了?
作者: 523066680 时间: 2017-7-26 11:46
本帖最后由 523066680 于 2017-7-26 11:47 编辑
回复 16# a2002
其实这并不妨碍我们线下测试和比较计算机的运算能力。
当然,还是线上更吸引人,更有去写算法的动力,bbaa完全可以在原有的网站基础上搞起。
作者: a2002 时间: 2017-7-26 11:48
回复 17# 523066680
话说这几天都没有看见bbaa了
作者: tiger999 时间: 2017-7-26 11:57
回复 2# 523066680
第一次在bathome发帖。。
作者: tiger999 时间: 2017-7-26 11:58
回复 5# 523066680
点击链接啊。。蓝色字体。。
作者: tiger999 时间: 2017-7-26 11:58
回复 6# 老刘1号
有啊。。
作者: tiger999 时间: 2017-7-26 11:59
回复 10# codegay
不是啊,我才小学六年级,快初一了。。
作者: tiger999 时间: 2017-7-26 11:59
回复 12# happy886rr
。。。。。我是 “编程我可是第一”
作者: a2002 时间: 2017-7-26 12:00
终于。。。。。。。。。。。。。。。。。。。。很多人等着你的
作者: a2002 时间: 2017-7-26 12:02
回复 20# tiger999
蓝色字体不是百度百科吗
作者: tiger999 时间: 2017-7-26 12:08
回复 3# 老刘1号
恩。。
作者: codegay 时间: 2017-7-26 12:53
回复 14# a2002
就是数独。
作者: tiger999 时间: 2017-7-26 15:13
回复 25# a2002
一开始的地方有一个蓝色字体,而且文字就是群号啊。。。。
作者: tiger999 时间: 2017-7-26 15:15
回复 18# a2002
啊,他在弄他的算法和群里的一些其他事情。。
作者: a2002 时间: 2017-7-26 15:31
回复 29# tiger999
原来你们是一起的啊,是小学同学吗
作者: a2002 时间: 2017-7-26 16:00
本帖最后由 a2002 于 2017-7-26 16:04 编辑
回复 any# everyone
Look at the title
我感觉我们跑题了
作者: 老刘1号 时间: 2017-7-26 18:07
回复 31# 523066680
淡定淡定,小孩子哪能想到这么多
那俩个逻辑推理基本不成立
用大字体也许是觉得默认的有些小,不好看清
至于没放群号,应该是复制的时候忘记弄了
作者: tiger999 时间: 2017-7-26 20:24
回复 33# codegay
蛤?我只是在把东西复制过去了。。。。群号在那里有啊。。。。而且如果不参加其实加不加都没啥问题,而且scallop也已经百分百赢了。。。所以加不加也没啥太大的问题。。
作者: tiger999 时间: 2017-7-26 20:26
回复 31# 523066680
TAT版主理解一下,只是感觉原字体太小了,以前在Mcbbs发帖也是五号,没想到这里怎么大,至于群号,除非是超级大佬,否则也没啥意思了,现在scallop已经8000多了和第二名bbaa相差很多,所以奖品应该是给scallop了。。
作者: tiger999 时间: 2017-7-26 20:27
回复 30# a2002
不是啊。。他比我大一个年级。。而且是深圳,他似乎是壮族自治区?
作者: a2002 时间: 2017-7-26 20:56
回复 38# 523066680
对啊,“技术”分嘛,也不耗你什么
作者: a2002 时间: 2017-7-26 21:12
我们对不起PB二字,用“技术”代替了
作者: 老刘1号 时间: 2017-7-26 21:18
回复 38# 523066680
问题是,不是人人都是斑竹啊
作者: a2002 时间: 2017-7-26 21:18
本帖最后由 a2002 于 2017-7-26 21:20 编辑
呃~~~~~~~~~~~~
手贱又想加分
掏出荷包发现没有了
作者: a2002 时间: 2017-7-26 21:21
回复 44# 523066680
反正我没找到
作者: a2002 时间: 2017-7-26 21:23
呵呵 以假乱真的评分框
作者: 老刘1号 时间: 2017-7-26 21:24
回复 44# 523066680
Infact,现在不是斑竹的话只能加技术分
作者: a2002 时间: 2017-7-26 21:40
回复 47# 老刘
老刘你咋知道?
出公告了?
作者: 老刘1号 时间: 2017-7-26 22:17
本帖最后由 老刘1号 于 2017-7-26 22:19 编辑
回复 49# a2002
以前……好像在论坛的某个帖子里看到过
好像是"pb评分现只对管理团队和技术组成员开放"
作者: tiger999 时间: 2017-7-26 22:56
回复 37# 523066680
版主我惹你了吗。。。。群号就在网站里面,并且你看看scallop现在40000多,我不管是谁,反正目前玩我网站的scallop是最高,而且比我想的要高非常多,还有请不要随便说别人小学生,这是很不礼貌的,而且就算我的逻辑不合逻辑,有必要去骂一个人吗?自己有自己的观点,群号在哪里有什么关系吗?
作者: tiger999 时间: 2017-7-26 22:57
回复 46# a2002
哪里以真乱假了?
作者: tiger999 时间: 2017-7-26 22:59
回复 37# 523066680
并且数据不开放?你自己打开网站看看吧,里面有排行榜,很清楚,假如你觉得他不厉害,那就超越他呗
作者: a2002 时间: 2017-7-26 23:00
本帖最后由 a2002 于 2017-7-26 23:01 编辑
回复 52# tiger999
晕死~~我是说上楼的图片
作者: bbaa 时间: 2017-7-26 23:02
回复 37# 523066680
13次每分钟 非多线程
作者: bbaa 时间: 2017-7-26 23:03
回复 53# tiger999
比数量没意义
作者: a2002 时间: 2017-7-26 23:06
回复 any# everyone
恍然大悟,网站是一楼的网址删去"API.php"
http://www.codetiger.win/extra
作者: bbaa 时间: 2017-7-26 23:08
回复 55# bbaa
他延迟低
作者: 老刘1号 时间: 2017-7-26 23:23
回复 57# a2002
emmm,网站确实靠猜
作者: a2002 时间: 2017-7-26 23:25
呵呵,都晚了
作者: a2002 时间: 2017-7-26 23:28
这网址居然让我猜中了,居然啊
作者: a2002 时间: 2017-7-26 23:35
原来这么多误会来源于一个"API.php"
作者: a2002 时间: 2017-7-26 23:37
怎么回事
可以进入了http://www.codetiger.win/extra/index.php
作者: 523066680 时间: 2017-7-27 07:27
回复 57# a2002
这就尴尬了。
作者: a2002 时间: 2017-7-27 07:38
这应该叫猜网址游戏
作者: tiger999 时间: 2017-7-27 11:49
回复 54# a2002
哦。。。。。sorry
作者: tiger999 时间: 2017-7-27 11:50
回复 57# a2002
>.<原来是这样的
作者: tiger999 时间: 2017-7-27 11:56
回复 59# 老刘1号
2333333333333333333333333333333333
作者: a20150604 时间: 2017-7-27 19:50
http://slovesnov.users.sourceforge.net/bullscows/bullscows.pdf
http://slovesnov.users.sourceforge.net/index.php?bullscows,english
作者: PakTC 时间: 2017-7-28 23:24
本帖最后由 PakTC 于 2017-7-28 23:30 编辑
提供一点资料
www.cs.nccu.edu.tw/~chaolin/papers/science3203.pdf
这个文档是中文的,讲了两个数字游戏,关于这次的游戏的分析和解法在后半部分。
另外给准备做这道题但是还未实践的小伙伴提一些建议:
服务器响应蛮快的,不要让程序在运算和筛选上面过多耗时,
尽量使用速度更快的语言,如果一定要用脚本,空间换时间吧。
作者: codegay 时间: 2017-7-29 02:46
回复 70# PakTC
最大的时间消耗应该都是网络IO上,直觉用什么语言差异都不大。算法和方法才有影响。
作者: 523066680 时间: 2017-7-29 05:27 标题: 一点分析
本帖最后由 523066680 于 2017-7-29 08:55 编辑
前面是个误会,链接的问题实在不应该,我们反复问楼主群号,他反复回答是在主题蓝色的链接里,
而楼主发的网站链接恰恰没有打上 url 标签,所以不是蓝色的,只有百度百科是蓝色的。
大写的懵(每一次看回复都是黑人问号脸)!
知道链接后就去试了,游戏规则之一是,post 4位不重复的数字测试结果。数字少了不行。
试了一阵子发现可以用字母做占位符,这个时候还不知道筛选法。
多线程?
第一个思路,跑10个线程,"0ABC","1ABC","2ABC" ... "9ABC",等10个线程返回,
会得到1个 A1B0 和 3个A0B1 。也就是这10个里必然有一个位置正确,3个数字正确但位置不正确。
将3个B1取出,可以排6种情况,A1在开头,6个线程出去就有结果了。
优化空间
如果提前得到1个A1 和3个B1,线程可以提前kill掉。
第二轮6个排列出去,如果提前出现A4B0,可以提前kill线程,进入下个回合。
结果
刚开始 Scallop 没在跑,这方法大概是20/min的抢答速度。当他的程序跑起来的时候,
线程严重阻塞,10个线程都返回的时候 tokens 变了 3 到 4 次
筛选法
后面才搞清楚百科提到的筛选法,比较固执没去看,多亏happy66r指教。
先派出"0123"去试探,假设返回是A0B1,用5040个排列情况去和这个0123做比较,找出也是 A0B1 的排列,
这个时候缩小到 1440 种排列(可参考PAKTC提供的文档),答案就在这里面。
从1440中挑选一个去试探,假设是3987, 返回A0B2;再用1439个元素(去掉了3987)和 3987碰撞,筛选出
结果为A0B2的组合,这个有多少就交给程序了~
重复这个过程,备用组合不断缩小,最后得到A4B0。
这种方法需要自己写一个测试函数,返回AB数值。
试过所有情况,平均5.5次猜中一次,有优化空间,参考百度。
效率
用的Perl脚本,反复的数组操作和测试函数的调用消耗较大。假设post来回0.1秒,第一轮5040个测试
跑了0.3秒,别人已经三个post来回了。做了一些修改,
目前 Scallop 和 vic3 的猜题速度大概是 4:1 到 5:1,有空继续优化。
- Scallop 77453 + 38 226.2/min
- vic3 20333 + 13 77.4/min
- bbaa 238 + 0 0.0/min
- TJUGERKFER 21 + 0 0.0/min
-
- Scallop 77453 + 79 235.5/min
- vic3 20333 + 19 56.6/min
- bbaa 238 + 0 0.0/min
- TJUGERKFER 21 + 0 0.0/min
复制代码
其他优化
tokens 变化的时候,可以用当前反馈的数据更新筛选数组,接着跑;重置的话基本错过一个回合。
是否还考虑多线程?
由于现在服务端的处理机制(据说现在是文本存数据),我发现排队发送阻塞还少一点,多线程阻塞严重。
如果一定要多线程,参考前面提到的,单线程平均5.x次就能猜中一个。所以多线程不要超过5。假设是5线程,
第二回合你就该算出结果,不要超过两回合,别人已经刷了几个答案了。
当然了,如果服务端改了方案,多线程的利弊会有所改变。
Edit by 523066680[Finished in 0.2s]
作者: avgBullsCows 时间: 2017-7-29 10:32
本帖最后由 avgBullsCows 于 2017-7-29 10:33 编辑
我想试试这棵树
http://slovesnov.users.sourceforge.net/index.php?bullscows_tree,english,avgBullsCows
这棵树的生成脚本
http://slovesnov.users.sourceforge.net/scripts/bullscows.js复制代码
作者: 523066680 时间: 2017-7-29 12:27
本帖最后由 523066680 于 2017-7-29 14:33 编辑
回复 73# avgBullsCows
avgBullsCows 好像是跑可重复数字的,平均速度4.x, crusBullsCows 是不可重复4位数字的,平均速率 5.25 和百度提到的一样
http://slovesnov.users.sourcefor ... lish,crushBullsCows
更新一下现在的情况,还是 JAVA 对 PERL- Scallop 208598 + 1351 172.0/min
- vic3 45021 + 722 91.9/min
- bbaa 238 + 0 0.0/min
- TJUGERKFER 55 + 0 0.0/min
- adad 27 + 0 0.0/min
复制代码
差不多是2:1
另一个对比,分别 POST 网站 1000次,java 耗时大约52秒,perl 耗时大约64秒。
作者: avgBullsCows 时间: 2017-7-29 13:00
回复 74# 523066680 - An secret number for bulls-cows game can be four-place decimal with different
- digits from 0 to 9. Total amount of secret numbers is 10!/6! = 5040. For
- mastermind secret number is four-place digital with digits from 0 to 5. Digits
- can repeat. So total amount of secret numbers is 6^4 = 1296. In common case
- such games have three parameters - number of positions, number of different
- digits and repeatability (1 - yes, 0 -no). From this point of view bulls-cows game
- has parameters (4, 10, 0), mastermind has parameters (4, 6, 1). Optimization
- of two game types has two directions.
复制代码
我的理解是 bulls-cows 游戏是 参数描述(4, 10, 0) 4个位置, 10个符号, 符号不可重复
mastermind 参数描述(4, 6, 1) 4个位置, 6个符号, 符号可重复
不论哪种游戏, 算法优化有两个目标方向- The goal is to find algorithm which minimizes amount of secret numbers which algorithm can guess ...
复制代码
crush 算法的优化目标, 搜索树空间回合总数最小化- The second criterion is minimize average amount of turns for guess arbitrary secret number - minimal average game length
复制代码
avg 算法的优化目标, 平均搜索回合数(平均游戏长度)最小化
作者: 523066680 时间: 2017-7-31 15:48
观察比赛各玩家猜题速度的脚本。- =info
- Auth: 523066680
- Date: 2017-07
- =cut
-
- use JSON;
- use Encode;
- use Data::Dumper;
- use Try::Tiny;
- use Time::HiRes qw/time sleep/;
- use IO::Handle;
- STDOUT->autoflush(1);
-
- use LWP::Simple;
- use LWP::UserAgent;
-
- our $user = "vic3";
- our $pass = "tempcode";
- our $website = 'http://www.codetiger.win/extra/score.json';
- our $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0', timeout => 3 );
-
- my %ever;
- my %current;
- getData( \%ever );
-
- my $count = 0;
- my $delta;
- my $speed;
- my $time_a = time();
-
- while (1)
- {
- getData(\%current);
-
- $count = 0;
- for my $k (reverse sort { $ever{$a} <=> $ever{$b} } keys %ever)
- {
- $delta = $current{$k} - $ever{$k};
- $speed = $delta / (time() - $time_a) * 60.0;
-
- printf "%-10s %5d + %-5d %.1f/min\n",
- encode('gbk', $k),
- $ever{$k},
- $delta,
- $speed
- ;
-
- last if ($count++ > 5);
- }
- print "\n";
-
- sleep 10.0;
- }
-
- sub getData
- {
- my $href = shift;
- my $res;
- my $data;
-
- while (1)
- {
- $res = $ua->get( $website );
- try { $data = decode_json( $res->content ); last; }
- catch { sleep 2.0; printf "repeat\n" }
- }
-
- for my $name ( keys %$data )
- {
- $href->{$name} = $data->{$name};
- }
- }
复制代码
作者: 523066680 时间: 2017-8-4 22:11
本帖最后由 523066680 于 2017-8-4 22:30 编辑
回复 64# avgBullsCows
感谢neo提供的最优搜索树,省去了筛选+处理数组的过程,本地效率大大提升。(后来我发现这个问题即使运行时效率提高了,网络不熟悉的话还是要吃大亏啊)
读取 JSON 进行刷题的 Perl 代码:- =info
- 523066680 2017-08
- =cut
-
- use JSON;
- use IO::Handle;
- use File::Slurp;
- use LWP::UserAgent;
- use Data::Dumper;
- use Time::HiRes qw/sleep/;
- STDOUT->autoflush(1);
-
- our $user = "vic3";
- our $pass = "tempcode";
- our $website = 'http://www.codetiger.win/extra/API.php';
- our $ua = LWP::UserAgent->new( keep_alive=>1, agent => 'Mozilla/5.0', timeout => 0.2 );
-
- my $json;
- my $tree;
- $json = read_file("crushBullsCows.json");
- $json=~s/\'/\"/g;
- $tree = decode_json($json);
-
- AGAIN:
- my $ref = $tree;
- my $guess = $ref->{'xx'};
- my $AB;
- my ($curr, $prev) = (undef, undef);
-
- while (1)
- {
- ($AB, $curr) = post_num( $guess );
- print " [$AB] [ $guess ] $curr\n";
-
- if ( $AB eq "40" ) {
- print "Success $guess\n\n";
- last;
- }
-
- if (defined $prev and ($curr ne $prev) )
- {
- print "Tokens changed\n [$AB] [ @$guess ] $curr\n";
- goto AGAIN;
- }
-
- #update guess number, and $ref
- for my $e ( @{$ref->{'c'}})
- {
- if ( exists $e->{$AB} )
- {
- #print $e->{$AB};
- $guess = $e->{$AB};
- $ref = $e;
- last;
- }
- }
- $prev = $curr;
- }
-
- goto AGAIN;
-
- sub post_num
- {
- our($ua, $website, $user, $pass);
- my $n = shift;
- my $res;
- my $data;
- my $text;
-
- while (1)
- {
- $res =
- $ua->post(
- $website,
- [ username=>$user, password =>$pass, number=>$n, send=>'answer' ]
- );
- $text = $res->content();
- if ( $text =~/"A":\d,"B":\d/ ) { last }
- print ".";
- sleep 0.01;
- }
-
- #print $res->content(), " - $n\n";
- $data = decode_json( $res->content() );
- return $data->{A} . $data->{B}, $data->{tokens};
- }
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |