Code Golf:2D平台游戏

时间:2010-07-04 01:28:06

标签: language-agnostic code-golf rosetta-stone

挑战

  • 达到关卡的最后!
  • 如果您恰好击中每个(C)oin块2次,则会获得积分。

不允许的

  • 以任何方式对命令序列进行硬编码。
  • 你最喜欢的“一种语言”碰巧只做一件事,就是解决这个问题。

如何

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

等级

  • S 是您的起始位置。
  • E 您需要完成关卡的位置。
  • C 是一个有2个硬币的硬币块,你永远不必跳过其中一个以便能够完成关卡。
  • C _ 都算作地面,只有坚实的地面没有浮动平台。
  • | 是一面墙,为了完成关卡,你需要跳起的所有墙壁都是最高1墙高,所有更高的你可以认为是深渊你不能以任何方式离开。
  • x 是尖峰,猜猜如果你触摸会发生什么。尖峰总是比它们周围的地面低一级。

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

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

注意: &gt;&lt;只是为了说明边界,它们 NOT 包含在程序的输入中。还要注意你的文本编辑器,因为我多次搞乱了空白

命令

  • M =向右移动1,如果你身下没有地面,你会掉下来直到你击中它。当你摔倒时,无法移动
  • J =跳转,在接下来的3个命令中向上移动1或者直到你击中(C)oin Block。在那之后,你会跌倒直到你到达地面。你只能在地面上跳跃。如果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 个答案:

答案 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)

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

与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)

红宝石 - 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

答案 3 :(得分: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-char间隙,以及玩家穿过关卡顶层的情况。如果你不关心这两种情况,你可以节省一点。