跳跃和奔跑


18

马修喜欢解决难题。每当他设法解决一个问题时,他都会开心地跳来跳去。最近,他真的要这样做,因为流星雨在他不想掉入的地面上开了坑和洞。

您将获得Matthew想要穿越的风景的一部分,希望最终健康。地面以米为单位,每个米要么是普通地面,要么是一个洞。当他跑步时,他设法跨过每一米。另一种选择是跳跃,每步跨越四米。Matthew从第一个地面电表的最左端开始,想要到达最后一个地面电表(不过,不要超出它-想象一下在景观中给出的最后一个电表以外的无尽洞口)。

输入值

输入在标准输入上以单行形式给出,并以换行符终止。该线由短划线(-)或下划线(_)组成,分别表示地面或孔距计。输入示例可以是:

----__--___---

给定的景观至少为一处,最长为30米,且始终从地面开始。

输出量

输出是在标准输出上给出的,表示对Matthew的一系列运动命令,即runR)或jumpJ)。如上所述, 奔跑命令使马修奔跑一米,而跳跃则使马修正向前进四米。对于上面给出的示例,可以进行以下移动:

RRJRJRR

大致如下所示:

机芯RRJRJRR的图示

如果没有通过景观的安全路径,!则应打印一个感叹号()。

样本输入

--------
----__--___---
-_______
-_-_-_-_-_-
-

样本输出

JRRR
RRJRJRR
!
!

(最后的输出为空白,因为没有必要进行任何移动,但是我想Markdown无法解析它)

注意

只需一条可能的路径,因此程序输出不必与样本输出完全一致。只要给出解决方案(如果存在)并且每个移动命令都移动到地面并最终到达最后一个仪表,则输出有效。

标准错误的附加输出将被忽略。

获奖条件

最短的代码胜出,这是高尔夫界的惯例。如果出现平局,则以较早的解决方案为准。

测试用例

有两个测试脚本,包含相同的测试用例:

在这两种情况下都调用:<test script> <my program> [arguments]例如./test ruby jumprun.rb./test.ps1 ./jumprun.exe

另一个注意

该任务是2011-W24期间在我的大学举行的高尔夫比赛的一部分。参赛者的成绩和语言如下:

  • 104 –哈斯克尔
  • 131 –哈斯克尔
  • 154 – C
  • 170 – C
  • 275 – VB.NET
  • 286 –普通Lisp

我们自己的解决方案是

  •   92 –红宝石
  • 124 – PowerShell

@Joey我得到一个错误尝试运行与test.sh ./test.sh perl jump.pl- ./test.sh: line 42: syntax error near unexpected token 'done'在bash 3.2.48,
swilliams

@Joey我清除了缓存,重新下载了,现在效果很好。谢谢。
swilliams

看看解决方案,这显然太琐碎了。道歉。
乔伊(Joey)

1
我认为不允许向后运行/跳跃吗?如果是这样,它将使景观希望- - -可解。
基思·兰德尔

基思:我想现在改变任务有点为时已晚。
乔伊,

Answers:


7

Perl,53个字符

s/-...(?=(-|-...)*-$)/J/g;y/-/R/;/_/?$_="!":s/.$//

使用运行perl -p jumpnrun.pl。我为该-p选项计算了3个字符,这是perl jumpnrun.pl和之间的长度差perl -p jumpnrun.pl

我对Perl的了解不那么流利,所以我很确定可以将其进一步缩短。这使用类似于Howard解决方案的正则表达式。


3

Ruby,93 90 79 70个字符

我认为正则表达式解决方案会非常好且紧凑(让匹配器来做)。不幸的是,所有的边缘情况和特殊处理都使这一曲子变得如此之长-至少我没有触及100 ;-)。

puts gets.gsub(/-...(?=(-|-...)*-$)/,?J).tr(?-,?R)=~/^([JR]*)R$/?$1:?!

它通过了所提供脚本的所有测试用例。

与以前的脚本相比,保存了几个字符(现在只需一个调用gsub就足够了)。

编辑1:在测试脚本不允许测试用例1的输出之后,更改puts z!=?-??!:''z!=?-&&$><<?!

编辑2:以前的版本是

z=gets.chop
z.chars{z.sub!(/^(-|-...)((-|-...)*-)$/){$><<($1==?-??R:?J);$2}}
z!=?-&&$><<?!

我最初的想法是通过使用类似以下的先后查找策略来替换字符:模式为^(?<=[RJ]*)(-|-...)(?=(-|-...)*-$),然后我将'-'替换为'R',否则将替换为'J'。不幸的是,Ruby不允许进行变长后视,并且第一部分的另一个捕获组使代码更长。

所以然后我做了一个迭代的方法:如果我可以先执行一个步骤或跳转,^(-|-...)然后执行一系列其他步骤或跳转,直到最后一个平台,(-|-...)*-$然后打印相应的字母,删除前一个/四个字符,然后重新开始。On甚至可以通过切换表达式内的选项来调整RJ与JR的优先级(当前它更喜欢RJ)。

编辑3: 拆分单个替换

puts (z=gets.chop.gsub(/(-...|-)(?=(-|-...)*-$)/){$1==?-??R:?J})=~/_/??!:z.chop

一分为二

puts (z=gets.chop.gsub(/-...(?=(-|-...)*-$)/,?J).tr(?-,?R))=~/_/??!:z.chop

又给了几个字符。最终,我设法摆脱了这个行尾问题,但付出了代价:失败检测会花费更多的字符。


您可以通过将最后一行更改为来保存3个字符z!=?-&&$><<?!。除此之外,很棒的解决方案,+ 1!
Ventero 2011年

@Ventero我以为第一个测试失败了,因为“-”根本没有输出;-)
Howard

嗯,看来我的PowerShell脚本有一个小错误。它显然接受任何测试2输入,并且不会接受它的测试1.那是......奇怪,至少可以这样说。我会尝试修复。
乔伊(Joey)

好的,应该修复测试脚本,并且不再拒绝测试1的实际空结果。好的,现在应该修复它。
乔伊(Joey)

@乔伊·丹克 Nun sind es 90 ;-)
霍华德

1

Perl- 71 60

$_=<>;y/-/R/;s/R...(?=(R(...)?)*R$)/J/g;print/_/?"!":s/.$//r

现在通过所有测试用例。:)事实证明我太快删除了最后一个字符...而我原来的正则表达式的一半完全是多余的。

$ _ = $ ARGV [0]; y /-/ R /; s /(R ...(?= R))(R *(?= R))/ J $ 2 / g;印章;打印/ /? “!”:$,$ /

另一个正则表达式解决方案,通过了5个测试用例。

可以通过使用-Esay代替运行单行代码来缩短print,但是perl尝试将输入解释为开关...(Unrecognized switch: -_-_-_-_-_-


问题指出输入是在stdin上给出的。当将解决方案更改为从stdin读取而不是使用时$ARGV,它仍然无法通过测试脚本执行108个测试用例。
Ventero 2011年

@Ventero哦,哎呀...我想我知道为什么会这样,我会尽快修复...这就是我没有经历所有测试用例的结果...> _>
swilliams

好吧,脚本的目的是使人们可以轻松地检查其有效性和对规范的遵守:-)
Joey

@Joey问题是我以某种方式设法将“测试脚本”与“引用实现”混淆,直到Ventero发表他的评论:) ...脚本现在几乎已修复,尽管目前仅失败20个,所有错误否定
swilliams

1

Python- 89 93 97 93个字符

只是因为。

import re;i=re.sub('...(?<!---)-','J',input()[1:]);print('!'if'_'in i else re.sub('-','R',i))

现在仅使十个测试用例失败(考虑到存在多个有效解决方案的情况)。我待会会完全解决。


借用其中一个工作正则表达式,结果为

import re;i=re.sub('-...(?=(-|-...)*-$)','J',input());print('!'if'_'in i else re.sub('-','R',i))

具有96个字符。


1
仅通过728个测试用例。实际上,我将测试脚本放在那里是有原因的。
乔伊(Joey)

@Joey:好像我忘了剪掉输入中的主角。傻我 现在已更正。
JAB

仍然只能通过766/849测试用例。
Ventero 2011年

1

Haskell,90个字符:

我的第一个解决方案-很长,但是可以使用动态编程在线性时间内工作。:) 150个字符

x!y="!"
q '-'=max
q c=(!)
s i=r where r=zipWith3 q i(0&'R')$3&'J';n&c="":replicate n"!"++map(c#)r
c#"!"="!"
c#s=c:s
main=interact$reverse.last.s.init

第二种解决方案-慢得多(指数时间),但短得多:90个字符

s"-\n"=""
s('-':t)=max('R'#s t)$'J'#s(drop 3 t)
s _="!"
c#"!"="!"
c#s=c:s
main=interact s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.