En la versión arcade del juego, Pac-Man come pac-dots. Sin embargo, en este desafío, tiene hambre de caracteres alfanuméricos y puntuación en una cadena.
Su tarea es crear una función que alimente a Pac-Man con una cadena, evalúe si puede comerla o no, y devuelve la cadena con la ubicación de Pac-Man en ella.
Pac-Man ( <
) come personajes de izquierda a derecha, dejando un guión bajo o espacio para cada personaje a medida que avanza, y su objetivo es pasar de la primera posición-1 a la última posición + 1:
1. <Pac
2. _<ac
3. __<c
4. ___<
Sin embargo, el enemigo natural de Pac-Man, el fantasma, lo detendrá si encuentra una de las letras de la palabra "FANTASMA" (no distingue entre mayúsculas y minúsculas). Su función debe devolver la cadena con la ubicación de Pac-Man cuando se encuentra con el ghost
personaje:
1. <No!
2. _<o!
Lo único que puede derrotar a un fantasma es un perdigón de poder. Si Pac-Man llega a una letra en la palabra "PELLET" (que tampoco distingue entre mayúsculas y minúsculas) antes de llegar a un fantasma, se comerá al fantasma y seguirá moviéndose, y esa pastilla se agotará. Los pellets de poder pueden acumularse (es decir, en ppgg
ambos fantasmas se comerían). El carácter T existe tanto como un fantasma como una bolita, por lo que puede ignorarse (tratarse como cualquier otra letra, como a
).
1. <Pop
2. _<op
3. __<p
4. ___<
Para aclarar aún más, en la cadena "Pac-Man pierde aquí", se producen las siguientes operaciones:
P <P, +1 Pellet (1 pellet)
a <a
c <c
- <-
M <M
a <a
n <n
<[space]
l <l, +1 Pellet (2 pellets)
o <o, -1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
e <e, +1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
<[space]
h <h, ghost wins, returns
e
r
e
Ejemplos
Input: Pacman wins!
Output: ____________<
Input: Pacman loses wah-wah :(
Output: _______________<h-wah :(
Input: PELLET PELLET GHOST
Output: ___________________<
Input: Hello World!
Output: <Hello World!
Input: <_!@12<_<_<
Output: ___________<
Este es el código de golf: gana la puntuación más baja en bytes.
fuente
<
símbolo ...Respuestas:
Jalea,
3433 bytesPruébalo en línea!
Creo que finalmente estoy empezando a entender a Jelly. Siente un poco de miedo.
fuente
Retina ,
5538 bytesPruébalo en línea! (La primera línea solo permite ejecutar varios casos de prueba a la vez).
Explicación
El problema es esencialmente encontrar el prefijo más largo que no tenga un paréntesis de cierre sin igual. Salvo que podemos utilizar
e
,l
op
en lugar de(
y, o bieng
,h
,o
os
en lugar de)
.Por lo tanto, esta solución es casi un ejemplo de libro de texto de grupos de equilibrio. No entraré en demasiados detalles sobre cómo funcionan, ya que este código es esencialmente el mismo que el ejemplo estándar que puede leer en mi respuesta SO sobre grupos de equilibrio .
Todo el programa es, por lo tanto, una única sustitución de expresiones regulares. El
i
activa mayúsculas y minúsculas. Luego emparejamos un pellet con[elp]
e incrementamos el contador de profundidad (en la forma de la pila de captura del grupo2
), o emparejamos algo con lo que no es un fantasma[ghos]
o emparejamos un fantasma.
y disminuimos el contador de profundidad haciendo estallar desde la pila2
. Por supuesto, en principio esto permite hacer coincidir una pastilla con la[^ghos]
sección o un no fantasma con la.
sección, pero gracias a la coincidencia codiciosa y la forma en que se remonta la expresión regular, el motor de expresiones regulares nunca intenta estas posibilidades.La sustitución luego usa dos características específicas de Retina:
$*
repite el personaje a su derecha tantas veces como lo especifique el token a su izquierda. Esa ficha es$.&
la duración de todo el partido. Esto solo significa que reemplazamos cada personaje en el partido con a_
. Y luego también agregamos un<
a esos guiones bajos. La parte de la entrada que no se come simplemente no se ve afectada por la sustitución.fuente
Python 2,
114113108 bytesfuente
None
, no la respuesta. ¿Y cómo cuentas 107? Cuento 110.Python 2, 89 bytes
A veces, mi obstinada determinación de hacer de Python un lenguaje funcional tiene sus beneficios.
(Ligeramente) sin golf:
Construye la cadena de resultados usando recursividad. La actualización de
l
(for "lives") agrega 1 para pellets (True - False == 1
), resta 1 para ghosts (False - True == -1
) y agrega 0 para cualquier otro personaje. También agrega 0 cuandos
es la cadena vacía, gracias al corte de Python y al hecho de que'' in any_str == True
, de modo que el pellet y el fantasma se cancelan.La declaración de devolución se utiliza
test and b or a
en lugar dea if test else b
guardar un byte. El caso base de recursión ocurre cuando la cuerda termina o Pac-Man se queda sin gránulos, representado sucintamente comos*p
, lo que es igual''
(y por lo tanto se evalúa como falso) cuandos == ''
o bienp == 0
.fuente
C #,
269256232212211 BytesPrimero publica aquí, por lo que probablemente sea mucho más largo de lo que podría ser (y probablemente porque está en C #). ¡Algún consejo sobre dónde podría acortarlo sería genial!
¡Gracias a todos en los comentarios que me ayudaron!
Versión de golf
Versión sin golf
fuente
else
guardar 5 caracteres más. Y al iniciar el ciclo eni = 1
, debería poder eliminar el último si, ya que el código se puede ejecutar cada vez.s[i]
acceso para 5 caracteres.P="PELpel"
yG="GHOSghos"
? Solo los usas una vez cada uno. ¿Me estoy perdiendo algo o son solo 4 caracteres adicionales? Además, ¿necesitas elelse
?"PELpel".Contains(c)
y"GHOSghos".Contains(c)
debe ser mutuamente excluyente.Pyth,
534844 bytes4 bytes gracias a @ Pietu1998 por el truco
!!@
->}
(que solo las personas que conocen Pyth pueden entender)Banco de pruebas.
fuente
!!@
es solo un trigrafo}
, ¿verdad? : pMATL ,
373635 bytesPruébalo en línea!
Explicación
fuente
JavaScript (ES6), 98 bytes
Explicación:
p
mantiene el número actual de pellets. Si ya es negativo, simplemente devolvemos el carácter y seguimos adelante, para que el resto de la cadena no se toque. De lo contrario, examinamos el carácter actual y, si eso sep
vuelve negativo, insertamos el<
carácter; de lo contrario, reemplazamos el carácter actual con_
. Finalmente, sip
nunca se vuelve negativo, sufijamos<
a en la cadena.fuente
Pyth,
474644 bytesPruébalo en línea. Banco de pruebas.
Un enfoque bastante diferente al de Leaky Nun, y estoy bastante seguro de que esto se puede jugar más.
fuente
Z
lugar deG
y cambiarf!
af!h
t
de"ghost"
debe quitarLua,
198190184185163 BytesOk, lo admito, esto es largo. Muy largo. Lua tiene algunas herramientas para jugar con cuerdas, pero es limitado, lo mismo ocurre con los condicionales que ocupan muchos espacios.
Editar: gracias @LeakyNun por salvarme 9 bytes :) Perdí algunos bytes para corregir un error
Edición 2: solución de 163 bytes encontrada por @LeakyNun
Viejo 185
Sin golf
fuente
d=c:lower()
y busque también los caracteres en mayúsculaand 1or s and 1or s
s and s
print(('').rep('_',i)..','..z:sub(i+1))
i
puede sernil
Python 3,
176157150149134133124 bytesDefina una función llamada
f
que tome la cadena como argumentoProbablemente se pueda jugar más al golf
Gracias a todos los que comentaron: D
fuente
x=c.upper()
y buscar coincidencias en minúsculas;
lugar de tener cada una en su propia línea. También puede usar Python 2, que le permite usar espacios como primer nivel de intendación y pestañas como segundo.n=i=0
, non=0
yi=0
.t[i]="_"
en lugar det[i] = "_"
, lo mismo parat[i] = "<"
.return''.join(t)
, quita ese espacio."GgHhOoSs"
y"PpEeLl"
.Python 3,
114110 bytesMi primer código de golf.
Gracias al Dr. Green Eggs y Iron Man por guardar 4 bytes.
Utiliza la evaluación de booleanos a uno y cero para condensar un AND lógico a una multiplicación. (0 * 0 = 0, 1 * 0 = 0, 1 * 1 = 1). Espero que este sea un buen primer intento.
fuente
while s[x:]*l
sacar 4 bytes.Powershell, 185
Sin golf:
fuente
Python3,
211184 bytesEl argumento 's' es una cadena
Agradecería cualquier consejo de golf ya que este es mi primer intento de golf de código
Gracias por comentar :)
fuente
return "_"*c + "<" + s[c:]
con solo unbreak
código que se ejecutará después del ciclo for de todos modos.Haskell
119113 bytesGracias a Daniel Wagner por 6 bytes menos.
Llámalo como
p "Hello World!"
.El
1then
es un caso de borde que se interpreta correctamente en mi GHC (7.10), pero arroja la mayoría de los resaltadores de sintaxis. Por lo tanto, podría interpretarse de manera diferente en su compilador también.Sin golf:
fuente
n!(c:s)|elem c"blah"=blah|elem c"blah"=blah|0<1=blah
.C, 237 bytes
fuente
C ++,
315373327 Bytes(Nota: sigue jugando al golf)
fuente
if()
, y la eliminación de los espacios alrededor!=
,||
,=
,-
, y<=
. Además, ¿nocin>>input
funciona en lugar degetline
? También puedes condensar alrededor;
.Ruby, (119 bytes)
Probablemente hay algunas cosas que me estoy perdiendo, ya que soy nuevo en esto ...
Ruby es mi amiga :)
fuente
Perl, 54 (52 + 2) bytes
Debe
-p
especificarse en las opciones de línea de comandos.Explicación:
La
-p
opción hace que la declaración se envuelva en un ciclo de lectura-modificación-impresión, donde durante cada iteración del ciclo,$_
contiene una línea de entrada, incluido el delimitador de línea.La expresión regular es en gran medida la misma idea que en la respuesta Retina.
Llame al patrón de búsqueda
([pel](?1)*[ghos]|[^ghos ])*
"aceptable". Entonces se puede definir recursivamente como:Una cadena es "aceptable" si:
PELLET
exceptoT
, seguido de una cadena aceptable, seguido de un carácter enGHOST
exceptoT
.GHOST
exceptoT
que no es un personaje de nueva línea.Esta definición permite más pellets que fantasmas: un
PEL
personaje puede ser emparejado como un personaje de pellet o un personaje no fantasma.La cadena vacía se considera aceptable, por lo tanto, se garantiza que la expresión regular coincida en la posición 0, donde se emparejará la subcadena más larga aceptable.
Esta subcadena más larga aceptable se corresponde con guiones bajos de igual longitud, seguidos de
<
.fuente
-p
ya utilizada-
, por ejemplo,perl -e
->perl -pe
, entonces el-
es libre. Pero creo que laperl -e
versión es más larga debido a las citas, así que creo que no puedo usar eso aquí.