欢迎回来!我很高兴提出第三个CodeBots挑战。这已经花了很长时间了。这项挑战将分为3个部分:简短版本,详细版本和其他详细信息。
短版
每个参赛者将编写一个24命令程序。这些bot会在世界各地移动并将其代码复制到其他bot中,同时试图阻止其他bot这样做。可能的命令之一是no-op Flag
。如果一个机器人拥有Flag
比其他任何一个机器人更多的东西Flag
,那么您将获得积分。您可以通过获得最多的积分来获胜。
以上所有这些对于过去的两个挑战都是正确的。这次,机器人将能够同时运行多行代码。
长版
API
每个漫游器将精确地有24行,每行采用以下格式:
$label command parameters //comments
标签和注释是可选的,并且每个命令具有不同数量的参数。一切都不区分大小写。
参量
输入的参数可以是以下格式:
- 介于0到23之间的值。
- 一个变量:
A
,B
,C
,D
- 使用加法的值:
A+3
或2+C
- 用
#
符号指定的一行代码(#4
代表第5行,而#C+2
代表由计算得出的行C+2
)。 - 您可以使用
$label
而不是指定一行代码。 - 对手的变量或代码行,由指定
*
。您的对手是您面对的方形机器人。(*B
代表对手的B
价值,而*#9
代表对手的第十行)。如果那个方格中没有人,则不执行该命令。
指令
移动V
移动机器人North+(V*90 degrees clockwise)
。运动不会改变方向。
转V
V*90 degrees
顺时针旋转机器人。
复制大众
将任何内容复制V
到中W
。如果V
是行号,则W
必须是行号。如果V
是变量或值,则W
必须是变量。
旗
什么也没做。
星空卫视
启动附加到变量的新线程V
。立即,在以后的每个回合中,线程将在line上执行命令V
。
如果V
已经连接到线程,则此命令为无操作。如果V
是对手的变量,那么对手将启动附加到该变量的线程。
停止V
V
在此回合结束时停止附加到变量的线程。
锁V
防止V
以任何方式使用该行或变量,除非被称为的线程使用Lock
。随后Lock
由同一线程进行的调用将解锁V
。不能在对手的变量或行上调用锁。
如果康德大众
这将测试Cond
。如果条件为true,则它将线程指针移至行号V
,否则移至行号W
。该行将立即执行。
条件句可以X=Y
,X<Y
,!X
,或?X
:
X=Y
测试两条线是否属于同一类型且来自同一机器人的行,或者测试两条值是否等于相同数量。X<Y
测试的值X
是否小于Y
。!X
测试变量或行X
是否被锁定(如果锁定,则返回true)?X
测试给定变量是否附加了线程
额外细节
多线程交互
相同类型的动作将同时执行。操作按以下顺序执行:
锁。如果多个线程试图锁定一个变量,它们将全部失败。如果一个线程正在解锁变量而另一个线程正在尝试锁定它,则该变量将保持解锁状态。
开始。如果多个线程试图在一个变量上启动一个线程,它将被视为一次启动。
复制。如果两个线程都复制到同一个变量,则该变量将最终成为一个随机值。如果它们都复制到同一行,则两者都不起作用。如果一个线程复制到另一个线程正在复制的同一变量,则后者将复制一个随机值。如果两个线程都从同一个变量复制,则它们都将正常工作。
如果。所有条件将同时进行测试,然后将在之后更新线程变量。执行
If
可以导致添加具有更高优先级的操作。具有较高优先级的操作将在继续通过之前执行If
,而具有较低优先级的操作将在之后执行If
。移动。同一机器人上的多次移动将使该机器人进行所有移动的总和。如果多个漫游器最终出现在同一位置,它们将返回到其起始位置。
转。同一机器人多次旋转求和。
停止。同一变量上的多个停止命令将被视为一次停止。
其他详情
您的初始线程开始附加到D
变量
重复执行If
(具有If
指向自身的语句)将导致您的机器人不执行任何操作
如果线程在锁定后停止,则这些锁将被解锁
使用锁定的变量或行的操作将无效。
如果漫游器的行数少于24行,则其余行将被填充 Flag
在还连接到启动线程的变量上执行写操作实际上将使线程在新值开始时执行该线程,因为该线程将启动下一轮。
机器人按以下方式放置在环形世界中:
B...B...B...
..B...B...B.
B...B...B...
控制器位于此处。我已经为此工作了很长时间,但它可能仍然存在错误。当规格与控制器矛盾时,说明是正确的。
计分板
1. 771 LockedScannerBot
2. 297 CopyAndSelfFlag
3. 289 DoubleTapBot
4. 197 ThreadCutterBot
5. 191 TripleThread
6. 180 ThickShelled
7. 155 Attacker
8. 99 RandomMover
9. 90 BananaBot
10. 56 LockedStationaryDoubleTap