language agnostic - when - Code Golf: 2D Platformer
when is the next gdq (4)
El reto
- ¡Alcanza el final del nivel!
- Puntos de bonificación si golpeas cada uno de los bloques (C) oin exactamente 2 veces.
Desestimado
- Hard codificar la secuencia de comandos de cualquier manera.
- Tu "lenguaje de un personaje" favorito que hace exactamente una cosa, que es resolver este golf.
Cómo
Su programa recibe el nivel inferior ( sin saltos de línea ) a través de la entrada estándar.
Luego tiene que imprimir los comandos necesarios para completar con éxito el nivel.
El nivel
- S es tu posición inicial.
- E la posición en la que necesitas estar para completar el nivel.
- C es un bloque de monedas con 2 monedas en él, nunca tendrás que saltear una de estas para poder completar el nivel.
- Tanto C como _ cuentan como terreno, solo hay suelo sólido sin plataformas flotantes.
- | es una pared, todas las paredes que necesitarás para saltar para completar el nivel tienen una altura máxima de 1 pared, todo lo que sea más alto puedes considerar un abismo del que no puedes salir de ninguna manera.
- x son picos, adivina qué pasa si los tocas. Los picos siempre estarán un nivel por debajo del suelo que los rodea.
Todos los niveles son 4 líneas de altura, con cada una de las líneas de 63 caracteres de ancho. Eso hace un total de 252 caracteres por nivel.
> ______ ____ ________ ___ <
> C ______| | | | C __| | | | ____E<
>S______ __ ____| | | |_____| |__| |___| <
> xx xx xx <
Notas: > <son solo para ilustrar los bordes, NO se incluyen en la entrada de su programa. También tenga cuidado con su editor de texto, ya que el mío arruinó el espacio en blanco varias veces
Los comandos
- M = Te mueve 1 a la derecha, si no hay terreno debajo de ti, caerás hasta que lo golpees. No puedes moverte mientras caes.
- J = Saltar, te mueve hacia arriba en 1 para los siguientes 3 comandos o hasta que llegues a un bloque (C) oin. Después de eso, caerás hasta llegar al suelo. Solo puedes saltar cuando estás en el suelo. Si una M te lleva al mismo nivel que el suelo, el salto se cancela.
- O = NOP, te hará esperar / no hacer nada. De esta manera, puedes saltar hoyos y picos que solo tienen un bloque de ancho (no necesitas esto para el nivel superior, pero ganarás puntos extra si puedes resolver los niveles que lo necesitan).
La solución (con bloques de monedas)
Los comandos sucesivos se apilan uno encima del otro.
F indica dónde caerás (recuerda que no puedes hacer nada mientras caes),
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
Secuencia de comandos resultante, 75 caracteres de longitud:
MMMMJJMMJMMMMJMMMMMMJMMMMMMJMMMMMMJMMMMMMMMMJJMMJMMJMMMMMMMMJMMMMMMMMJMMMMM
Espero que esto produzca algunos resultados interesantes ... y no toneladas de llamas: O
EDITAR
OK, hay muchas más posibilidades de las que pensé inicialmente, me disculpo por todas las ediciones.
C - 275 bytes (finales de línea de 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())));}
Esto satisface las brechas de 1 carácter, y el caso en el que el jugador camina por la línea superior del nivel. Podrías ahorrar un poco si no te importaran esos 2 casos.
Python 2.6 318 - 302 - 300 - 284 - 277 - 206 - 203 - 191 - 184 caracteres
Básicamente, el mismo enfoque que HoLyVieR (me pregunto si puede haber muchas direcciones radicalmente diferentes en cuanto a la solución). Lee de stdin.
Actualización 1 (318 -> 302): no verifique E
pero suponga que está en la posición 63 (tal como se solicita en un comentario).
Actualización 2 (302 -> 300): range(0,252,63)
cambiado range(0,252,63)
a (0,63,126,189)
(dos caracteres completos) Actualización 3 (300 -> 284): parece que raw_input
también obtiene stdin
para que se pueda eliminar el sistema de import sys
etc. Actualización 4 (284 -> 277): [y][x+3]=="_"and p[y][x+1]==" "
a p[y][x:x+4]==list("_ _")
Actualización 5 (277 -> 206): fue para la cadena en lugar del procesamiento de listas bidimensionales, gran guardado ...
Actualización 6 (206 -> 203): se implementaron sugerencias en un comentario sobre la respuesta de HoLyVieR (por Nabb) Actualización 7 (203 -> 191): se rompió el límite de 200 caracteres mediante la creación de cadenas booleanas ...
Actualización 8 (191 -> 184): pequeños ajustes
Todos los comentarios o sugerencias son bienvenidos!
Nota: Agregué un (innecesario) y una newline
en el código a continuación (EOL 5-> 6) (para evitar las barras de desplazamiento aquí)
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
Uso: python 2dplatform.py < level.txt
Ruby - 231 226 218 198 197 caracteres
Puede manejar huecos de un personaje y saltar a ciegas desde cualquier acantilado. Se cae si intenta conseguir una moneda inmediatamente a la izquierda de un hoyo.
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
Javascript:
Versión corta ( 334 280 256 240 238 236 233 223 207 205 196 184 182 caracteres)
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)
Nota: el indicador del método de Javascript tiende a eliminar espacio en algunos navegadores (por ejemplo, Google Chrome). Puede que no funcione como se esperaba por esa razón para esos navegadores. En otros (ej .: Firefox), funcionará bien.
Versión comentada
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