您的程序通过标准输入获得以下级别(没有换行符) 然后必须打印出成功完成关卡所需的命令。
所有级别都是4行高度,每行63个字符宽。这使得每个级别总共252个字符。
> ______ ____ ________ ___ <
> C ______| | | | C __| | | | ____E<
>S______ __ ____| | | |_____| |__| |___| <
> xx xx xx <
注意: &gt;&lt;只是为了说明边界,它们 NOT 包含在程序的输入中。还要注意你的文本编辑器,因为我多次搞乱了空白
连续命令叠加在一起。
F 表示你会摔倒的地方(记住你在跌倒时不能做任何事情),
MMMF MMMF
M MMMMMMJ MMMMF M MMMMMMMMJ MMMF
M J MMMFMMMF MMMMMMJ| | | |F J MMJ| | | |F MMMMME
SMMMJMJ MJ MMMJ| | | |MMJMJ| |__| |MMJ|
xx xx xx
产生的命令序列,长度为75个字符:
MMMMJJMMJMMMMJMMMMMMJMMMMMMJMMMMMMJMMMMMMMMMJJMMJMMJMMMMMMMMJMMMMMMMMJMMMMM
希望这会产生一些有趣的结果......而不是大量的火焰:O
答案 0 :(得分:14)
<强>使用Javascript:强>
短版本( 334 280 256 240 238 <罢工> 236 233 223 207 205 196 184 182个字符)
a=prompt();j=i=0;while(a[++j*63]<(o="M"));while(++i<62){while(a[h=j*63+i]<"_")j++;if(a[h-63]>"B")o+="JJ";if(a[h+1]>"z")o+="J",j--;if(a[h+3]+a[h+1]=="_ ")o+="JMM",i+=2;o+="M"}alert(o)
注意: Javascript方法提示会在某些浏览器上删除空间(例如:Google Chrome)。对于那些浏览器,它可能无法正常工作。在其他人(例如:Firefox)上,它会正常工作。
评论版
a=prompt(); // Read the input //
j=i=0;
while(a[++j*63]<(o="M")); // Place the cursor at the "S" //
while(++i<62){ // While we are not at the end point //
while(a[h=j*63+i]<"_")j++; // If we are on a space, we fall //
if(a[h-63]>"B")o+="JJ";// We jump for coins //
if(a[h+1]>"z")o+="J",j--; // We jump when we reach a wall //
if(a[h+3]+a[h+1]=="_ ")o+="JMM",i+=2; // We jump on gap //
o+="M" // We add the movemment in the output
}
alert(o) // Output
答案 1 :(得分:10)
与HoLyVieR基本相同的方法(我想知道是否有很多完全不同的方向解决方案)。从stdin读取。
更新1 (318 - &gt; 302):请勿检查E
,但假设它位于第63位(在评论中提出)。
更新2 (302 - &gt; 300):将range(0,252,63)
更改为(0,63,126,189)
(两个完整字符)
更新3 (300 - > 284):似乎raw_input
也提取stdin
,因此可以删除import sys
等。
更新4 (284 - > 277):[y][x+3]=="_"and p[y][x+1]==" "
至p[y][x:x+4]==list("_ _")
更新5 (277 - &gt; 206):转换为字符串而不是二维列表处理,大保存...
更新6 (206 - &gt; 203):在对HoLyVieR答案的评论中实施建议(由Nabb提供)
更新7 (203 - &gt; 191):使用布尔字符串构建打破200字符限制...
更新8 (191 - > 184):小调整
欢迎所有意见或建议!
注意:我在下面的代码中添加了(不需要的)\
和newline
(EOL 5-&gt; 6)(以避免滚动条在这里)
l=raw_input()
x,y,o=0,l.index('S')//63,''
while x<62:
while l[y*63+x]==" ":y+=1
b=y*63+x;g=l[b+1]>"z";h=l[b:b+4]=="_ _";o+=(l[b-63]>"A")*"JJ"+g*"J"+h*"JMM"+\
"M";y-=g;x+=1+h*2
print o
用法: python 2dplatform.py < level.txt
答案 2 :(得分:2)
它可以处理一个字符的间隙,盲目地从悬崖上跳下来。如果试图立即将硬币放到坑的左边,就会掉下来。
l=?\s*63+gets
c=l=~/S/
r=->{c-=62;'JM'}
(print l[c-63]==?C?r[]:(l[c+1]>?\s&&l[c+1]<?x?(c+=1;?M):(l[c+1]<?C&&l[c]>?\s?(c-=61;'JMM'+(l[c+63]<?C?(c+=1;?M):?O)):r[]))
c+=63 while l[c]<?C)while l[c]!=?E
答案 3 :(得分:1)
#define A(B,C)!memcmp(p+1,B,C)
#define P printf
char*p,l[318],k=63;f(){P("M");++p;while(*p<33)p+=k;}main(){read(0,l+k,4*k);p=strchr(l+k,83);while(*p!=69)p[-k]==67?(P("JJM"),++p):(p[1-k]>94?(P("JM"),p+=1-k):(A(" _",3)?(P("JMMM"),p+=3):(A(" _",2)?(P("JMMO"),p+=2):f())));}
这适用于1-char间隙,以及玩家穿过关卡顶层的情况。如果你不关心这两种情况,你可以节省一点。