分数
输入提交内容后,将填写此部分。
正常
1. bopjesvla Perl 54
2. edc65 Javascript (ES6) 91
3. name language score
4. name language score
5. name language score
奖金回合
1. name language score
2. name language score
3. name language score
4. name language score
5. name language score
Karel J.AlphaBot
背景
Java的热门入门课程是Karel J. Robot(我自己在使用它)。机器人与街道(正整数y坐标)和大道(正整数x坐标)以及蜂鸣器交互,可以将其放置并存储在网格上(请注意,卡雷尔和任何蜂鸣器只能存在于网格上)点)。卡雷尔(机器人)只能执行五个动作:向前移动1个,向左转,放下蜂鸣器,拾起蜂鸣器,然后自行关闭。
在我的计算机科学课上,我们的第一个任务是对Karel进行编程,以学习如何向右转,转弯以及执行前进1并放下蜂鸣器的组合动作。几天后的一项任务是使用这些方法并编写新方法以产生字母。
自然,完成任务后,我写了更多的方法来制作字母表中的每个字母以及十个数字,并且我打算弄清楚如何用机器人制作一种文字处理器,其中一个字符串输入到STDIN,机器人会将蜂鸣器以类似于字母的方式放置在网格上。
每次private void draw#为每个字符编写代码时#,我都会在其后添加注释,以告诉我所需命令序列的缩写。
我可以使用以下命令(用伪代码编写)(澄清-这些是唯一有用的命令)。
Turn Left
Rotate the robot 90˚ counterclockwise
Abbreviated as "l"
Turn Right
Rotate the robot 90˚ clockwise
Abbreviated as "r"
Move
Move one space forwards
Abbreviated as "m"
Put Beeper
Put a beeper on the spot that Karel is on
Abbreviated as "p"
Drop Beeper
Move, then Put Beeper
Abbreviated as "d"
Turn Around
Turn Left, then Turn Left
Abbreviated as "a"
条件
机器人必须按以下顺序进行。
- 机械手从5xN矩形的左下角开始,该矩形的最小面积是绘制字母的位置。
- 机器人绘制字母。
- 机器人将移动到矩形的右下角。
- 机器人向右移动两个空间,并且必须朝北/朝上
让我们来看一个例子。假设我们要画画A。机器人的位置是指示其方向(北,南,东,西)的字母。如果机器人位于带有蜂鸣器的位置,则大写字母;如果机器人位于没有蜂鸣器的位置,则小写字母。o代表带有蜂鸣器的斑点,.代表没有蜂鸣器的斑点。
正如我们稍后将看到的那样A。
.ooo.
o...o
ooooo
o...o
o...o
这是一种可能的解决方案。
Grids ..... ..... ..... ..... ..... ..... ..... ..... .....
..... ..... ..... ..... ..... ..... ..... ..... .....
..... ..... ..... N.... E.... oE... ooE.. oooE. oooW.
..... ..... N.... o.... o.... o.... o.... o.... o....
n.... N.... o.... o.... o.... o.... o.... o.... o....
Letters p d d r d d d a
..... ..... ..... ..... ..... n.... e.... .E... .oE..
..... ..... ..... ..... N.... o.... o.... o.... o....
ooWo. oWoo. Wooo. Nooo. oooo. oooo. oooo. oooo. oooo.
o.... o.... o.... o.... o.... o.... o.... o.... o....
o.... o.... o.... o.... o.... o.... o.... o.... o....
m m m r d m r d d
.ooE. .oooe .ooos .ooo. .ooo. .ooo. .ooo. .ooo.
o.... o.... o.... o...S o...o o...o o...o o...o
oooo. oooo. oooo. oooo. ooooS ooooo ooooo ooooo
o.... o.... o.... o.... o.... o...S o...o o...o
o.... o.... o.... o.... o.... o.... o...S o...E
d m r d d d d l
mml完成第四个项目符号的最后一步是隐含的,因为它出现在每个字母中,并且因为我不想回过头来在上述建议的解决方案中的所有内容中添加另外两列。
因此,一种解决方案A是pddrdddammmrdmrdddmrddddlmml。
请注意,这不一定是您的解决方案。您的算法可以遍历每一列,将蜂鸣器放置在适当的位置,而不必依赖于已放置或将要放置其他蜂鸣器的位置。无论您使用哪种算法,机器人都只能在网格上每个空间放置一个蜂鸣器。
该程序
您的程序将以字母的网格为5xN的网格作为输入。请注意,输入上没有机器人。假定该机器人位于左下角(西南),朝北。
输出将是字母序列,该字母序列是该序列的简写。
样本输入
.ooo.
o...o
ooooo
o...o
o...o
o...o.ooooo
o...o...o..
ooooo...o..
o...o...o..
o...o.ooooo
样本输出
pddrdddammmrdmrdddmrddddlmml
prmmmlmlmmdrdrdddlmlmmdrdrmmmdrddddlmmlprdddlmldmmrmrmdmlmldmmrdrddddrmmmdlmml
这是代码高尔夫,伙计们。适用标准CG规则。以字节为单位的最短代码获胜。
奖金回合
规则
如果您想参加奖金回合,请确保您的代码移动效率高!以下是我的程序在运行时创建的所有5x5字母的库。奖金回合的目的是编写一个程序,为该程序打印ABCDEFGHIJKLMNOPQRSTUVWXYZ包含尽可能少的动作的序列。STDIN没有输入。代码的分级不是根据代码的长度,而是根据其“移动得分”。移动分数旨在阻止扫描程序算法访问矩形中的每个点。
d: 1
l: 1
m: 4
p: 1
r: 1
字母
.ooo. oooo. ooooo oooo. ooooo ooooo .oooo o...o
o...o o...o o.... o...o o.... o.... o.... o...o
ooooo oooo. o.... o...o oooo oooo. o.ooo ooooo
o...o o...o o.... o...o o.... o.... o...o o...o
o...o oooo. ooooo oooo. ooooo o.... oooo. o...o
ooooo ....o o...o o.... ooooo o...o ooooo oooo.
..o.. ....o o..o. o.... o.o.o oo..o o...o o...o
..o.. ....o oo... o.... o.o.o o.o.o o...o oooo.
..o.. o...o o..o. o.... o...o o..oo o...o o....
ooooo .ooo. o...o ooooo o...o o...o ooooo o....
oooo. oooo. ooooo ooooo o...o o...o o...o o...o
o..o. o...o o.... ..o.. o...o o...o o...o .o.o.
o..o. oooo. ooooo ..o.. o...o .o.o. o.o.o ..o..
oooo. o..o. ....o ..o.. o...o .o.o. o.o.o .o.o.
....o o...o ooooo ..o.. ooooo ..o.. ooooo o...o
o...o ooooo
.o.o. ...o.
..o.. ..o..
.o... .o...
o.... ooooo
必须遵循与原始挑战相同的步骤:必须一次绘制一个字母,每个字母之间要有空格。
适用标准CG规则。得分最低的参赛者将获胜。
总而言之,两个代码本质上将执行相同的操作。第一个代码中的字节数应最少,第二个代码中的移动数应最少。