26

挑战

  • 到达关卡的尽头!
  • 如果您准确地击中每个 (C)oin 块 2 次,则可获得奖励积分。

不允许

  • 以任何方式对命令序列进行硬编码。
  • 你最喜欢的“一个字符语言”恰好做了一件事,那就是解决这个高尔夫问题。

如何

您的程序通过标准输入接收以下级别(没有换行符)。
然后它必须打印出成功完成关卡所需的命令。

等级

  • S是你的起始位置。
  • E完成关卡所需的位置。
  • C是一个硬币块,里面有 2 个硬币,你永远不必跳过其中一个才能完成关卡。
  • C_算地,只有实地没有浮动平台。
  • | 是一堵墙,为了完成关卡,你需要跳上的所有墙最多只有 1 堵墙高,所有更高的墙都可以认为是你无法以任何方式摆脱的深渊。
  • x是尖峰,猜猜如果你触摸它们会发生什么。尖峰总是在它们周围的地面以下一层。

所有级别都是 4 行高,每行 63 个字符宽。这使得每个级别总共有 252 个字符。

>                       ______  ____       ________  ___        <
>    C            ______|    |  |  |  C  __|      |  | |   ____E<
>S______  __  ____|          |  |  |_____|        |__| |___|    <
>       xx  xx                xx                                <

注意: >< 只是为了说明边界,它们包含在程序的输入中。还要注意你的文本编辑器,因为我的空格多次搞砸了

命令

  • M = 将你向右移动 1,如果你下方没有地面,你会跌倒直到你撞到它。坠落时 不能移动。
  • J = 跳跃,在接下来的 3 个命令中将您向上移动 1 或直到您击中 (C)oin 块。在那之后,你会跌倒直到你到达地面。你只能在地面上跳跃。如果 M 将您带到与地面相同的高度,则跳跃将被取消。
  • O = NOP,会让你等待/什么都不做。这样你就可以跳过只有 1 个街区宽的洞和尖峰(你不需要这个对于上面的水平,但如果你能解决需要这个的水平,你会获得额外的积分)。

解决方案(带硬币块)

连续的命令堆叠在一起。
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

编辑

好的,有比我最初想象的更多的可能性,我为所有的编辑道歉。

4

4 回答 4

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 方法提示倾向于删除某些浏览器上的空间(例如:谷歌浏览器)。由于这些浏览器的原因,它可能无法按预期工作。在其他人(例如: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
于 2010-07-04T03:16:21.013 回答
10

Python 2.6 318 - 302 - 300 - 284 - 277 - 206 - 203 - 191 - 184 个字符

基本上与HoLyVieR相同的方法(我想知道解决方案是否可以有很多完全不同的方向)。从标准输入读取。

更新 1(318 -> 302):不检查E但假设它在位置 63(如评论中所要求)。
更新 2(302 -> 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 -> 206):使用字符串而不是二维列表处理,大保存...
更新 6 (206 -> 203):在评论中实施建议HoLyVieR 的回答(由 Nabb 提供) 更新 7 (203 -> 191):通过使用布尔字符串构建打破 200 字符限制...
更新 8 (191 -> 184):小调整

欢迎大家提出意见或建议!

注意:我在下面的代码中添加了一个(不需要的)\newline(EOL 5->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

于 2010-07-04T07:50:05.613 回答
2

红宝石 - 231 226 218 198 197 个字符

它可以处理一个字符的间隙并盲目地跳下任何悬崖。如果它试图在坑的左侧立即获得一枚硬币,它就会掉下来。

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
于 2010-07-04T21:24:10.647 回答
1

C - 275 字节(DOS 行结尾)

#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 个字符的间隙,以及玩家走过关卡最顶线的情况。如果您不关心这两种情况,您可以节省一点。

于 2010-07-04T22:49:52.727 回答