Dada una cadena que representa una serie de señales manuales de clasificación de aeronaves , escriba una función o programa para calcular la posición final de una aeronave después de estas señales.
NB: las coordenadas en este reto se representan como un par de coordenadas cartesianas, además de un encabezado de dirección de la brújula: (x, y, h)
donde x
es la coordenada x, y
es la coordenada y, y h
es uno de N
, E
, S
, o W
.
Comienzas con un avión en (0, 0, N)
una grilla imaginaria, con los motores apagados. Su entrada es una cadena que contiene pares de caracteres delimitados por comas, donde cada par representa una señal de clasificación. Debe seguir cada señal de clasificación por turnos y generar las coordenadas en (x, y, h)
forma de la posición final de la aeronave.
Si una señal requiere que su avión se mueva, suponga que mueve una unidad en la dirección requerida para cada señal de ese tipo que recibe. Si una señal requiere que su avión gire, suponga que gira 90 grados en la dirección requerida para cada señal de ese tipo que recibe.
Un avión no puede moverse si sus motores están apagados. Si los motores de su avión están apagados y recibe una señal de movimiento / giro, no aplique el movimiento / giro.
Señales
Cada señal de clasificación está representada por un par de caracteres. El primero del par representa la posición del brazo izquierdo del mariscal, desde el punto de vista del avión , y el segundo el brazo derecho desde el mismo punto de vista . Este útil cuadro de señales puede ayudar.
o/ — START ENGINES (no movement, no turn)
-/ — CUT ENGINES (no movement, no turn)
-~ — TURN LEFT (no movement, left turn)
~- — TURN RIGHT (no movement, right turn)
~~ — COME FORWARD (forward movement, no turn)
:: — MOVE BACK (backward movement, no turn)
/\ — NORMAL STOP (no movement, no turn)
Esta no es la lista completa de señales de clasificación, pero es todo lo que debe admitir.
Entrada
La entrada es una cadena delimitada por comas que contiene pares de caracteres. Esta cadena siempre será válida; no es necesario que valide la entrada.
Salida
La salida es un conjunto de coordenadas como se describe anteriormente. Puede devolverlo en cualquier formato conveniente: si su idioma admite múltiples valores de retorno, puede usarlo; alternativamente, puede usar una cadena (los corchetes que rodean las coordenadas no son obligatorios), matriz, tupla, lista o cualquier otra cosa que le resulte conveniente. La única regla es que debe contener x
, y
y h
los valores, en ese orden.
Casos de prueba
Input — Output
o/,~~,~~,~-,:: — (-1, 2, E)
::,~-,o/,/\,~~,-~,~~,~~,~~ — (-3, 1, W)
o/,::,-/,~~,o/,~-,~~,~~,~- — (2, -1, S)
o/,~-,~-,::,::,~-,~~,-~ — (-1, 2, S)
~-,~-,o/,::,::,-/,~~,-~ — (0, -2, N)
Respuestas:
Java 8, 505 bytes
Golfizado (con la ayuda de @ masterX244 para afeitarse una gran parte)
Más legible
fuente
class f{static boolean T(String u,String v){return u.equals(v);}public static void main(String[]a){java.util.Scanner q=new java.util.Scanner(System.in);String s=q.nextLine();int x=0;int y=0;int d=0;int[][]v={{0,1},{-1,0},{0,-1},{1,0}};int b=1;for(String r:s.split(",")){if(T(r,"o/")||T(r,"-/"))b*=-1;if(b<0){if(T(r,"~-"))d=(d+3)%4;if(T(r,"-~"))d=(d+1)%4;if(T(r,"~~")){x+=v[d][0];y+=v[d][1];}if(T(r,"::")){x-=v[d][0];y-=v[d][1];}}}System.out.print("("+x+","+y+","+"NWSE".charAt(d)+")");}}
Befunge,
201185 bytesPruébalo en línea!
Befunge no tiene un tipo de cadena como tal, por lo que para hacer que las señales sean más fáciles de comparar, cada par de caracteres se convierte en un entero utilizando la fórmula
(c1 - 45)/3 + c2 - 47
. Esto puede significar que obtendremos coincidencias falsas en una entrada no válida, pero eso no importa si se garantiza que la entrada sea válida.El resto del código se basa en la manipulación de cuatro "variables": el estado del motor (1 o 0), el encabezado (0 a 3 para NESW) y las posiciones x e y . Los cálculos para cada señal son los siguientes:
Arranque el motor:
engine = 1
corte el motor:
engine = 0
gire a la izquierda:
heading = (heading - engine + 4) % 4
gire a la derecha:
heading = (heading + engine) % 4
movimiento: (donde dir es 1 para adelante y -1 para atrás)
y += dir*engine*(1-heading)*!(heading%2)
x += dir*engine*(2-heading)*(heading%2)
Una vez que llegamos al final de la secuencia de entrada, es solo una cuestión de generar el x , y y el encabezado (convertido a un carácter con una simple búsqueda en la tabla).
fuente
Python 2.7.12, 295 bytes
El primer nivel de sangría después
for
usa un solo\s
. La sangría del segundo nivel utiliza una sola\t
. (el wysiwyg reemplaza\t
con múltiples espacios, así que tenga esto en cuenta cuando pruebe el tamaño)fuente
raw_input()
.TypeError: Argument to map() must support iteration
(estoy usando Python 2.7.12).Python 2, 142 bytes
Ejemplo:
Esto imprime números complejos, lo que debería estar bien, creo. El
x
,y
,h
el fin es todavía allí, y el'j'
no causa ninguna confusión. Dime si debería cambiarlo.fuente