¿Dónde estoy ahora?
Dada una cadena d
, que contiene solo las letras NSWE
, determina las coordenadas que he viajado (de izquierda a derecha, consumiendo con avidez) y la coordenada final donde resido.
Las reglas para leer las coordenadas de izquierda a derecha:
- Si el siguiente personaje es
N
oS
:- Si el personaje después de
N
oS
es otroN
oS
:- Consume solo el primero
N
oS
. - Salida
[0,1]
paraN
- Salida
[0,-1]
paraS
- Consume solo el primero
- Si el personaje después de
N
oS
esW
oE
:- Consume tanto el
N
oS
como elW
oE
. - Salida
[1,1]
o[-1,1]
paraNE
yNW
, respectivamente. - Salida
[1,-1]
o[-1,-1]
paraSE
ySW
, respectivamente.
- Consume tanto el
- Si el personaje después de
- Si el personaje está precedido
E
oW
no por unS
oN
:- Consume la
E
oW
. - Salida
[1,0]
paraE
. - Salida
[-1,0]
paraW
.
- Consume la
Ejemplo trabajado
NSWE
[0,1] (North N)
[-1,-1] (South-west SW)
[1,0] (East E)
[0,0] (N+SW+E = Didn't actually move)
Tenga en cuenta que esto puede estar en cualquier formato, aquí hay otros ejemplos de resultados válidos:
[[0,1],[-1,-1],[1,0],[0,0]]
[[[0,1],[-1,-1],[1,0]],[0,0]]
"0,1\n0,-1\n-1,0\n1,0\n0,0"
Etc ...
Más ejemplos
SWSENNESWNE
[-1,-1]
[1,-1]
[0,1]
[1,1]
[-1,-1]
[1,1]
[1,0]
NNEESESSWWNW
[0,1]
[1,1]
[1,0]
[1,-1]
[0,-1]
[-1,-1]
[-1,0]
[-1,1]
[0,0]
NENENEE
[1,1]
[1,1]
[1,1]
[1,0]
[4,3]
NEN
[1,1]
[0,1]
[1,2]
EEE
[1,0]
[1,0]
[1,0]
[3,0]
Reglas
- Puede imprimir en cualquier formato conveniente que no viole las lagunas.
- Debes consumir con avidez,
NWE
es nuncaN,W,E
, es siempreNW,E
.- Esto se aplica a:
SW*
,SE*
,NW*
,NE*
. - Estás consumiendo de izquierda a derecha, con avidez.
- Esto se aplica a:
- El es el código de golf , el menor recuento de bytes gana.
[4, 3]
o menos hará que sea un poco más fácil ver lo que está sucediendo en la salida de prueba.1
,-1j
,(-1+1j)
formato de salida válida etc una?NE
es simplementeN+E
no debería importar?Respuestas:
Python 2 , 116 bytes
Pruébalo en línea!
Con salida como
[(3+4j), 1, -1j, …]
, 91 bytesPruébalo en línea!
Esta lambda devuelve una lista de enteros gaussianos : el primero es la coordenada final, y todos los demás son los pasos necesarios para llegar allí.
fuente
Adjunto , 80 bytes
Pruébalo en línea!
Esta es una función anónima que toma un argumento de cadena.
Explicación
La primera tarea es implementar la fase de análisis de esta pregunta. Encontré que era más corto usar una expresión regular simple para analizar la entrada (
_
)Esto coincide con todas las ocurrencias de la expresión regular
[NS][WE]|.
, como se ve en muchas otras respuestas. Esto produce avariciosamente las instrucciones solicitadas.Ahora, vamos a aplicar una función hash a cada dirección. Tomamos los puntos de código de cada dirección y los sumamos. Esto proporciona la siguiente asignación:
Intentaremos asignar estos valores a un dominio más pequeño; el módulo es útil para esto, y podemos demostrar que el módulo más pequeño que da como resultado valores únicos para todas las entradas dadas es 11. Ordenando por restos, esto nos da la siguiente tabla:
Ahora, tenemos una correspondencia de entrada, como codificación por
Sum@Ords=>[...]%11
. Luego, tenemos que transformar estos residuos en puntos. Intentaremos derivar otro mapeo, lo que significa que será útil insertar "valores de relleno disperso" en hashes que no corresponden a las direcciones:Actualmente tenemos una serie de puntos, que pueden dar una lista indexable por el hash:
Ahora, comprimiremos esto, ya que solo se compone de
-1
s,0
sy1
s. Como la lista representa pares, podemos aplanar la lista sin perder datos. Luego, si tomamos cada númerox
y calculamos1-x
, obtenemos la siguiente lista:Podemos convertir esto en un número base 3:
Convirtiendo a base 10:
Para resumir, tomamos nuestros puntos, los desemparejamos, tomamos cada elemento restado de
1
, y convertimos de base3
, dándonos22260446188
. Podemos descomprimir como tal:ToBase[22260446188,3]
1-ToBase[22260446188,3]
Chop[1-ToBase[22260446188,3],2]
Esto nos da nuestro conjunto original de pares. Entonces, podemos realizar la indexación antes mencionada de esta manera:
Dado que, en Attache, la indexación por una matriz devuelve todos los elementos correspondientes a esos índices. (Entonces
[1,2,3,4][ [0,0,-1,1] ] = [1,1,4,2]
,.) Ahora, tenemos las direcciones de la ruta que recorrió el OP. Lo que queda es calcular la suma.Entonces capturamos este resultado en un lambda
{...}
y lo ponemos como la primera función en una composición de función (a##b
), con el segundo serV#Sum
. Esta es una bifurcación que, dada la entradax
, se expande para ser:Sum
, cuando se le da una matriz 2D, se suman todas las columnas de la matriz (como resultado de la suma vectorializada). Entonces, esto empareja las direcciones con el destino final, y tenemos nuestro resultado final.fuente
JavaScript (ES6), 102 bytes
Devuelve una cadena.
Pruébalo en línea!
fuente
MATL , 45 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación (con ejemplo)
Considere la entrada
'NSWE'
como un ejemplo.fuente
Java (JDK 10) , 171 bytes
Pruébalo en línea!
Explicaciones
Gracias a
c=~-s[i]/6%4
, se realiza el siguiente mapeo:NS
se verifica conc<2
y se asigna a+1
/-1
using1-c*2
;EW
se verifica conc>1
y se asigna a+1
/-1
utilizandoc*2-5
.Créditos
fuente
Retina 0.8.2 , 93 bytes
Pruébalo en línea! Explicación:
Duplicar la entrada.
Divide la primera copia en direcciones.
Elimine las líneas en blanco extrañas creadas por el proceso anterior.
Cambie
W
aJ
para que se clasifique entreE
yN
. (PasarE
a entreS
yW
también funcionaría).Ordenar cada línea en orden.
Eliminar pares de direcciones opuestas (esto solo afecta a la última línea de curso).
Cuente la cantidad de movimientos horizontales y verticales, agregando signos cuando sea necesario.
Aquellos de ustedes que conocen las diferencias entre Retina 0.8.2 y Retina 1 querrán señalar que puedo guardar 2 bytes en Retina 1 porque usa en
*
lugar de$*
. Mientras estuve allí, intenté simplificar el proceso de división, pero no pude reducir aún más el conteo de bytes, solo pude igualarlo con esto:fuente
Java 10,
269265243 bytesDefinitivamente no es el lenguaje correcto para este desafío.
Pruébalo en línea.
Explicación:
fuente
Perl 5
-n
, 94 bytesPruébalo en línea!
fuente
JavaScript (ES6), 102 bytes
Devuelve una cadena.
fuente
Ruby ,
7571 bytesPruébalo en línea!
-4 bytes gracias a benj2240.
Dado que devolver números complejos parece ser un formato de salida aceptable, supongo que no se volverá mucho más golfista que simplemente hacer un puerto de la muy buena respuesta de Lynn .
fuente
map
, pasando su bloque directamente asum
: ¡ Pruébelo en línea!F # (Mono) , 269 bytes
Pruébalo en línea!
fuente
NSWE
que está dando salida actualmente(0,1)
,(-1,-1)
,(1,0)
, pero una cuarta salida debe ser la suma de esas coordenadas, por lo que(0,0)
(debido0+-1+1 = 0
y1+-1+0 = 0
).sed, 125
Las libertades con la versión en formato de salida :
La puntuación incluye +1 para el
-r
parámetro sed.Pruébalo en línea .
La salida es la siguiente:
A
caracteres representa el entero + velen(string)
a
caracteres representa el entero -ve-len(string)
0
Por ejemplo:
,
es [0,0],AA
es [0,2]aaa,
es [-3,0]sed 4.2.2 incluyendo la extensión exec de GNU , 147
El formato de salida sensible versión del :
La puntuación incluye +1 para el
-r
parámetro sed.La salida se da como coordenadas separadas por espacios, una por línea. Hay una nueva línea adicional entre el penúltimo y último conjunto de coordenadas, no estoy seguro de si eso es problemático o no.
Pruébalo en línea!
fuente
PHP, 153 bytes
deja que una expresión regular haga la división; recorrer los partidos, imprimir y resumir los resultados intermedios:
Ejecutar como tubería
-nR
o probarlo en línea .fuente
C (gcc) , 173 bytes
¡Es interesante hacer esto en un idioma sin soporte de expresiones regulares!
Pruébalo en línea!
fuente