Herbert
参加2006年的Imagine cup的预选赛时,时间已经不多了,第一轮结束就不能再登陆Herbert了,非常遗憾没有解决掉所有的关,不过当时留了个心眼,把Herbert登陆时与服务器通讯的原始tcp包抓了下来,一直想分析一下,然后让herbert直接读取包中的内容来启动。花了三天时间,终于整完了:Herbert
我破解完的Herbert有几个小bug:
1. 每个小关我以前写的解决方案都在,但是换行符变成了“..”,得把..去掉并回车才能运行。
2. 每个小关机器人的初始位置不对,必须按一下开始(Ctrl+G)才能显示正确的位置。
3. 暂时不能保存写的解决方案。
4. 计分好像有差错。
破解过程:
1. 分析tcp包,过滤掉无用的,错误的包,把错位的包根据seq、ack和len码排好顺序。
2. 提取出Data,发现是个xml。
3. 原先Herbert通过webservices获得一个dataset,现在“override”这个过程,直接从xml得到dataset。
想法:
1. 做成web版本的,加上AJAX,注册了以后直接在网页上玩,然后来个积分榜……,注册用户还可以自己建关让大家玩
Note:
1. 用户密码随意。
2. Dotnet framework1.1
3. 玩的时候把下方的speed调到最高比较舒服,要不然Herbert走得太慢。
4. 开始的loadingdata过程较长,是正常的。
5. 一定要注意herbert的初始位置可能不对,按一下开始(Ctrl+G)才能显示正确的位置。
第一关的解决方案是:
a(A):rArAa(Ass)
a()
Herbert 玩法:
官方规则(英语),翻译了几条主要部分:
1. 使用h语言对机器人进行编程
2. 目标是机器人按到所有的“button”(白色),并且需要避让开灰色的“button”和“wall”
3. 按到灰色按钮将重置所有已经被按到的白色按钮,“wall”将阻挡机器人的前进。
4. h语言:
a) 有着一般高级语言的元素:statements, procedures, parameters, arguments, and recursion
b) h语言的指令只有三个:s(前进一步), r (右转), l (左转)。
c) 过程的定义:x[(P1,P2,...,Pk)]:y1y2y3...yn ,x 是除了s,r,l的任何小写字母, Pi 是参数, yi 是任何指令, 0 <=k <=15, and n >= 0. If k = 0 说明该过程没有参数。
d) 参数可以是数字,也可以是指令组合
e) 多说也说不清楚,看几个例子,可以在Herbert客户端的level0里面练习练习:
i. a(a):sa(A-1)
a
ii. b:sssrb
b
iii. a:ssssra
sssa
iv. a(A,B):f(B)ra(A-1,B)
f(A):sf(A-1)
a(4,5)
v. a(A,B,C):f(B)Ca(A-1,B,C)
f(A):sf(A-1)
a(4,5,r)
f) 每个字母和数字算1个byte,符号不算
5. 计分规则:
设:
Points:根据难度设置的关卡分值
TotalButtons :每关的白色按钮
Buttons:按到的白色按钮
MaxBytes :每关的最大允许bytes
Bytes :实际使用的bytes
a) If Buttons = TotalButtons and Bytes <= MaxBytes
score = (Points*MaxBytes)/Bytes.
b) If Buttons < TotalButtons or Bytes > MaxBytes, you have not solved the level. Score = Buttons*PointsPerButton
PointsPerButton is determined as follows:
i. If Bytes <= MaxBytes, PointsPerButton = (Points/(2*TotalButtons)).
ii. If MaxBytes < Bytes <= 2*MaxBytes, PointsPerButton = (Points*(2*MaxBytes -Bytes)/(2*MaxBytes*TotalButtons)).
iii. If 2*MaxBytes < Bytes, PointsPerButton = 0
Ecogiser's Blog