Se mi navegador

8

¡Oh, no, estoy perdido en el camino para encontrar los grandes tesoros de Marakov! Y todo lo que tengo son estas instrucciones inútiles que se parecen a S10R10D30... ¡No tengo idea de lo que significan! ¿Me puedes ayudar?

Desafío

Dadas las instrucciones que consisten en N E S W U D L R 1 2 3 4 5 6 7 8 9 0, indique qué tan lejos estaré de donde comencé cuando sigo esas direcciones (es decir, Distancia Euclidiana).

N E S W referirse a mí girando hacia el norte, este, sur y oeste;

U D L Rrefiérase a mí girando hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha (Entonces NRes lo mismo que E, y así es SL; SLLes lo mismo que N). Arriba significa seguir adelante; Abajo significa darse la vuelta.

Después de cada dirección de la letra habrá un número, que es qué tan lejos llegaré en esa dirección. N10E20significa ir hacia el norte 10 unidades, luego girar hacia el este e ir hacia el este 20 unidades.

Detalles de entrada

  • La entrada siempre comenzará con uno de NESW(por lo que no es necesario tener en cuenta la entrada en blanco).
  • Se permiten instrucciones de dos letras seguidas. NEdebe interpretarse, "Gire al norte, luego gire inmediatamente al este". Es lo mismo que solo E. SLLes "Gire al sur, luego gire inmediatamente a la izquierda dos veces". Es lo mismo que N.
  • Todos los números serán enteros (tenga en cuenta que .no está en el conjunto de caracteres)
  • La entrada solo consistirá en NESWUDLR1234567890(si necesita algo más, como '\ 0' en C; o si las funciones de entrada de su idioma tienen una nueva línea final, o algo así, está bien).

Salida

  • La norma.
  • Si utiliza una función, debe generar un tipo de datos numérico o una cadena.
  • Debe tener una precisión de 3 decimales.

Casos de prueba

  • N10: 10
  • N10E10: 14.1421
  • N10S10: 0
  • NSEWUDLR10: 10
  • N100RR20E300D40L12: 268.7452
  • ERR10LL20UN30D100: 70.71067

El programa Python poco imaginativo que solía hacer.

Victorioso

Esto es codegolf, ¡así que los bytes más bajos después de una semana ganan!

Quelklef
fuente
@AdmBorkBork Derecha. Déjame editar.
Quelklef
Relacionado
AdmBorkBork
@AdmBorkBork También esto , pero todos son ligeramente diferentes.
Quelklef
¿Podemos suponer que la entrada consiste solo NESWUDLR1234567890?
darrylyeo
@darrylyeo Claro, déjame editar.
Quelklef

Respuestas:

2

(Ir) Ruby , 111 bytes

x=0
c=1,1i,-1,-1i
gs.sc(/(\w)(\d*)/){|o,a|x+=c.ro!('URDL'.ix(o)||'NESW'.ix(o)+c.ix(1)).fs*a.toi}
p Mh::hy *x.rc

Pruébalo en línea!

Toma entrada en STDIN, la emite en STDOUT.

Básicamente, este enfoque utiliza números complejos para almacenar la posición actual, así como una pila ( c), que contiene desplazamientos para cada dirección. Si hay una dirección URDL, la pila se gira por el índice de la dirección en esa cadena; si la dirección está en NESW, se rota por el índice de la dirección en esa cadena, más el índice de 1en la pila. Esto transforma una rotación relativa a la posición actual en una rotación relativa a la posición de 1. En cualquier caso, la parte superior de la pila se multiplica por el número de pasos en la dirección y se agrega a la posición actual.

Tutleman
fuente
¿Qué es "(Go) Ruby"?
Carcigenicate
@Carcigenicate Es Ruby, donde el intérprete ha sido compilado con una bandera especial que lo hace más adecuado para el golf. Entre otros cambios, le permite abreviar nombres de métodos y cambia el comportamiento de ciertos elementos integrados. Si visita mi enlace de TiO, verá el código en el encabezado, que es la mayoría de los cambios que se realizan.
Tutleman
4

Python 3 , 137 bytes

v=n=0
d=1
for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
print(abs(v))

Pruébalo en línea!

-9 bytes gracias a Jonathan Allan

Hiperneutrino
fuente
Puede guardar seis bytes con la cláusula else: else:v+=d*n;n=0;h='NUERSDW'.find(i);d=d**(h%2)*1j**(~-h/2)tenga en cuenta que Lse puede cortar aquí al final de la cadena de búsqueda porque -1%2es igual 7%2y 1j**(-1)es igual 1j**3.
Jonathan Allan
@JonathanAllan ¡Buenos trucos! ¡Gracias!
HyperNeutrino
Ahorre otros tres al incluir:for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
Jonathan Allan
@ JonathanAllan Hola genial, gracias!
HyperNeutrino
Probé mi propia mano en una respuesta de Python, no pude llegar a menos de 179 bytes. Bravo.
Quelklef
2

JavaScript (ES6), 148 142 140 138 137 134 bytes

s=>s.replace(/\d+|./g,_=>~(i='NESW'.search(_))?d=i:~(i='URDL'.search(_))?d+=i:a[d&3]+=+_,a=[0,0,0,0])&&Math.hypot(a[1]-a[3],a[0]-a[2])

-2 bytes: usar en .search()lugar de .indexOf()( @Shaggy )

-1 byte: reorganizar el programa para eliminar los paréntesis adjuntos ( @Shaggy )

-3 bytes: uso en .replace()lugar de .match().map()( @ThePirateBay )

Darrylyeo
fuente
Estamos obteniendo diferentes respuestas para el penúltimo examen.
Quelklef
@Quelklef Fijo.
darrylyeo
¿Puedes guardar un par de bytes usando en searchlugar de indexOf?
Shaggy
Creo que también puedes guardar un byte moviéndote aal map, reemplazando el ,anterior Mathcon &&y eliminando los paréntesis.
Shaggy
@ Shaggy Awesome, gracias!
darrylyeo
0

Perl 5 , 149 + 1 (-p) = 150 bytes

while(s/(\D+)(\d+)//){$p=/N/?0:/E/?1:/S/?2:/W/?3:/L/?$p-1:/R/?$p+1:/D/?$p+2:$p for split//,$1;$m[$p%4]+=$2}$_=sqrt(($m[0]-$m[2])**2+($m[1]-$m[3])**2)

Pruébalo en línea!

Explicado:

# Each direction is assigned a number:
#
#     0     North
#     1     East
#     2     South
#     3     West
#
# Variables:
#     $p     present direction
#     @m     total movement in each direction
# Inside loop:
#     $1     a set of direction instructions
#     $2     distance

while(s/(\D+)(\d+)//)    # Remove and preserve the first direction set and distance
   for split//,$1        # Loop through individual letters to set new direction
      $p=/N/?0:          # North
         /E/?1:          # South
         /S/?2:          # East
         /W/?3:          # West
         /L/?$p-1:       # Turn left
         /R/?$p+1:       # Turn right
         /D/?$p+2:       # Turn around
         $p              # Do not change direction
   $m[$p%4]+=$2          # Add the directional movement to previous movements

   $_=sqrt(              # Calculate distance
       ($m[0]-$m[2])**2  # Net North/South movement
      +($m[1]-$m[3])**2  # Net East/West movement
      )
Xcali
fuente