¡Muevamos el rover de Marte!

17

Resumen

La tarea es navegar en el rover de Marte y decir sus coordenadas y dirección finales.

Entrada:

Primera entrada:

Primero, su programa debe tomar la entrada que tendrá el siguiente formato:

[X-Coordinate],[Y-Coordinate],[Direction]

La dirección debe ser: No So Eo W(Letras iniciales de Norte, Sur, Oeste, Este)

Ejemplo: 10,20,N(x = 10, y = 20, dirección = N (Norte))

Segunda entrada:

La segunda entrada consiste en series de R, L, Mpara la derecha, izquierda y mover respectivamente.

Para Ry L(derecha e izquierda) la dirección del móvil debe cambiar en consecuencia.

Para Mel rover debe moverse 1 unidad hacia adelante en la dirección que era antes de moverse.

Reglas para calcular coordenadas:

N = Y + 1
E = X + 1
S = Y - 1
W = X - 1

Salida:

Las coordenadas finales y la dirección actual del móvil.


Ejemplo:

Enter initial data:      1,2,N

Enter the instructions:  MRMLM

Output:                  2,4,N

Las coordenadas pueden ser cualquier número entero y pueden ser negativas .

No se permiten todas las lagunas estándar. Si es posible proporcionar una demostración en sitios como http://ideone.com, etc., hágalo para que pueda verificar :)

Este es un concurso de popularidad, ¡así que sé creativo!

Siguiendo el consejo de otros, decido hacer de esto un .

Amit Joki
fuente
¿Hay límites para las coordenadas?
Teun Pronk
55
Esto podría ser más interesante como code-golf en lugar de popularidad-concurso . ¿Qué tipo de bonificación se otorga por el uso de ideona?
Kyle Kanos
@KyleKanos Vi gente que lo usaba, así que solo lo usé. Reformulado;)
Amit Joki
66
Ya sabes, si experimentas comentarios negativos sobre tus desafíos, primero intenta ejecutarlos a través del sandbox .
Martin Ender
1
@Geobits gracias. Dicho explícitamente.
Amit Joki

Respuestas:

7

Rubí ≥ 2.0, 101

E,N,W,S=*0..3
x,y,i=eval"a="+gets
gets.bytes{|c|x+=c%2*1i**i=i+1-c&3}
$><<[(x+y.i).rect,"NWSE"[i]]*?,

Esta solución se puede probar aquí: https://ideone.com/C4PLdE

Tenga en cuenta que la solución vinculada en ideone es un carácter más largo (en 1.ilugar de 1ien la línea 3). La razón de esto es que ideone solo es compatible con Ruby 1.9, que no permite la sintaxis abreviada para literales complejos.

Ventero
fuente
esperando verlo más golf :) :)
Amit Joki
Puede reemplazar x,y,i=eval"[#{gets}]"con eval"x,y,i="+getspara guardar algunos caracteres.
Afuous
@voidpigeon: No estoy seguro de que realmente funcione debido a evallas reglas de alcance: ruby -e 'eval"x=1";p x'arroja un NameErrorpara xat p x. Funciona cuando se usan constantes ( eval"X,Y,I="+gets), pero dado que modifico i, esto requeriría un adicional i=Ipara evitar advertencias sobre redefinir una constante. ¿Pero tal vez estamos hablando de diferentes versiones de Ruby?
Ventero
1
@Ventero Tienes razón. Lo probé en irb y me dio la matriz adecuada como salida, así que supuse que funcionaba. Aunque realmente me gusta el enfoque eval.
afuous
@voidpigeon Ah, tienes razón, que realmente permite una optimización ligeramente diferente: x,y,i=eval"*a="+gets. ¡Gracias!
Ventero
5

Javascript ( ES6 ) 145 141 127

Editar: eliminó la necesidad de una matriz de traducción usando el método de la solución C de edc65

[x,y,d]=(p=prompt)(s='NESW').split(','),[...p(d=s.search(d))].map(c=>c!='M'?(d+=c>'M'||3,d%=4):d%2?x-=d-2:y-=d-1),p([x,y,s[d]])

Sin golf / comentado:

s='NESW' // initialize variable for direction mapping
[x,y,d]=prompt().split(',') // get first input, split by commas, map to variables x,y,d
d=s.search(d) // get numeric value for direction
[...prompt()].map(c=> // get second input, map a function to every character in it
    c!='M'? // if char is not M
        (d+=c>'M'||3, // increment d by 1 if char greater than M, otherwise 3 
         d%=4) // modulo by 4 to wrap direction
    : // else
        d%2? // if odd direction
            x-=d-2 // move x position
        : // else
            y-=d-1 // move y position
)
prompt([x,y,s[d]]) // output result
nderscore
fuente
¡¿Puedes hacerlo?! [a, b, c] = x.split (...)
edc65
1
@ edc65 ¡Sí! Asignación de
Desestructuración
Echa un vistazo a mi respuesta C. tal vez no se necesita la matriz g
edc65
3

Java - 327

class R{public static void main(String[]a){char c,e=a[2].charAt(0),z[]={78,69,83,87};Integer x=Integer.valueOf(a[0]),y=x.valueOf(a[1]),d=e<70?1:e==83?2:e>86?3:0,i=0;for(;i<a[3].length();d=c>81?(d+1)%4:c<77?(d+3)%4:d){c=a[3].charAt(i++);if(c==77){x=d==1?x+1:d>2?x-1:x;y=d<1?y+1:d==2?y+1:y;}}System.out.print(x+","+y+","+z[d]);}}

Con espacios en blanco:

class R{
    public static void main(String[]a){
        char c,e=a[2].charAt(0),z[]={78,69,83,87};
        Integer x=Integer.valueOf(a[0]),y=x.valueOf(a[1]),d=e<70?1:e==83?2:e>86?3:0,i=0;
        for(;i<a[3].length();d=c>81?(d+1)%4:c<77?(d+3)%4:d){
            c=a[3].charAt(i++);
            if(c==77){
                x=d==1?x+1:d>2?x-1:x;
                y=d<1?y+1:d==2?y+1:y;
            }
        }
        System.out.print(x+","+y+","+z[d]);
    }
}

Como es habitual con Java, aproximadamente la mitad de esto es solo analizar la entrada y formar la salida. La lógica es bastante sencilla.

Geobits
fuente
3

Javascript (E6) 175

Editar error corregido, posiblemente fuera del rango de valor de retorno para d

139 Lógica, 36 E / S

F=(x,y,d,m,D='NESW')=>(d=D.search(d),[...m].map(s=>({M:_=>(y-=[-1,0,1,0][d],x-=[0,-1,0,1][d]),R:_=>d+=1,L:_=>d+=3}[s](),d%=4)),[x,y,D[d]]);
p=prompt,p(F(...p().split(','),p()))

Básico sin golf

function F(x,y,d,m) // In golf code use arrow sintax instead of 'function'
{
  var D='NESW';
  d = D.search(d); // map from letters to offset position 0..3
  var driver = { // driver object, each function map one of  command letters M,R,L
    M: function() { 
      y -= [-1, 0, 1, 0][d]; // subtract to be sure to have a numeric and not string result 
      x -= [0, -1, 0, 1][d]; // subtract to be sure to have a numeric and not string result 
    },
    R: function() {
       d += 1;
    },
    L: function() {
       d += 3; // with modulo 4 will be like -= 1
    }
  }
  m = [...m]; // string to array, to use iteration function 
  m.forEach(  // array scan, in golf versione use map do nearly the same and is shorter
    function (s) {
      driver[s](); // call driver function
      d = d % 4;   // restrict value to modulo 4
    }
  );  // in golf version, use comma separated expression to avoid 'return'
  return [x,y, D[d]] // return last status
}

Prueba Prueba en la consola de JavaScript en Firefox. Es más simple probar la función F evitando las ventanas emergentes.

F(1,2,'N','MRMLM')

Salida

[ 2, 4, "N" ]
edc65
fuente
Bien, esto se parece mucho a mi solución.
nderscore
3

C 164 180 186

Editar Formato de entrada fijo y strchr eliminado
Editar matriz de desplazamiento eliminada, calc utilizando bits

p,x,y;main(){char c,d,l[100];scanf("%d,%d,%c%s",&x,&y,&d,l);for(d=d<83?d&1:d>>2&1|2;c=l[p++];d&=3)c-77?d+=c+1:d&1?x+=d-2:(y+=1-d);printf("%d %d %c",x,y,"NESW"[d]);}

Sin golf

p, x, y;
main()
{
  char c, d, l[100];
  scanf("%d,%d,%c%s",&x,&y,&d,l);
  for (d = d<'S'?d&1:d>>2&1|2; c = l[p++]; d &= 3)
    c-'M'
    ? d += c+1
    : d & 1 ? x+=d-2 : (y+=1-d);
  printf("%d %d %c", x, y, "NESW"[d]);
} 
/*
M 77
R 82 0101 0010 R&3+1==3
L 76 0100 1100 L&3+1==1 
*/
edc65
fuente
2

C, 148 150 151

p,x[2];main(){char c,d,l[99],*j="%d,%d,%c%s";scanf(j,x,x+1,&d,l);for(d=d%8%5;c=l[p++];d-=c%23)x[d&1]-=c%2*~-(d&2);printf(j,*x,x[1],"ENWS"[d&3],"");}

Un retoque de la solución de @ edc65 para usar mi enfoque de abuso de valor ASCII.

Específicamente:

  • d%8%5asigna los caracteres ENWSa 0,1,2,3respectivamente
  • c%23se convierte Len 7, Men 8y Ren 13. Debido a que d(la variable de dirección) siempre se usa mod 4, esto efectivamente hace que Lagregar -1 mod 4, Magregar 0 mod 4 yR agrega 1 mod 4.
  • d&1es 1 para NSy 0 para EWdirecciones.
  • d&2es 2 para WSy 0 para NEdirecciones.
  • ~-(d&2)es 1 para WSy -1 para NEdirecciones.
  • c%2es 1 para My 0 para LR.
nneonneo
fuente
Por qué 23 y qué esc%(2*(1-(d&2)))
@tolos: se agregó alguna explicación. También acortado por 2 caracteres :)
nneonneo
2

Python 3 (con gráficos de tortuga), 251 199 bytes

Pythonistas sabios, por favor sean gentiles, porque este es mi primer intento en un programa escrito en su excelente idioma.

Tortugas en Marte!

from turtle import*
p="NESW"
mode("logo")
x,y,d=input().split(',')
setx(int(x))
sety(int(y))
seth(p.find(d)*90)
for c in input():fd(1)if c=="M"else[lt,rt][c>'L'](90)
print(pos(),p[int(heading()/90)])

Este desafío se correlaciona naturalmente con gráficos de tortuga estilo logo, para los cuales python tiene una importancia, por supuesto.

Lee la entrada de dos líneas de STDIN.

Salida:

$ { echo 1,2,N; echo MRMLM; } | python ./rover.py 
(2.00,4.00) N
$ 

Lo que más me gusta de este programa es que muestra gráficamente la ruta del móvil. Agregue exitonclick()al final del programa para que la salida gráfica persista hasta que el usuario haga clic:

ingrese la descripción de la imagen aquí

Estoy bastante seguro de que esto se puede jugar mucho más, ¡cualquier sugerencia es bienvenida! Estoy haciendo este CW, porque espero que la comunidad pueda jugar un poco más.

Cambios:

  • s ahora es una lista, en línea.
  • Ternario usado para cuerpo de bucle.
  • N en línea, eliminada rebanada innecesaria.
  • Se eliminó el espacio innecesario en la declaración de importación.
  • Se eliminó la cadena de importación para usar el método de cadena incorporado
  • Cambió a Python 3 para acortar raw_input
DigitalTrauma
fuente
@isaacg Gracias, ¡buen golf!
Trauma digital
2

GolfScript, 116 98 88 84 71

~'NESW':^@?:&;{4%[{&(4%:&;}{&[{)}{\)\}{(}{\(\}]=~}{&)4%:&;}]=~}/]`&^1/=

Esto debería obtener las coordenadas y las instrucciones como argumentos de la siguiente manera:1 2 'N' 'MRMLM' . Los argumentos se hacen en una cadena y se introducen en la pila.

Si desea probar esto en línea, vaya a web golfscript y pegue un punto y coma seguido de una cadena con los argumentos (por ejemplo ;"1 2 'N' 'MRMLM'") antes del código ( aquí hay un enlace con un ejemplo).

Ejemplos de salida:

1 2 'N' 'MRMLM'                    -> [2 4]N  
5 6 'E' 'MMLMRMRRMMML'             -> [5 7]S
1 2 'N' 'MMMMRLMRLMMRMRMLMRMRMMRM' -> [1 8]N


Mis intentos anteriores

84 caracteres:

~:i;'NESW':k\?:d;{i(\:i;4%[{d(4%:d;}{d[{)}{\)\}{(}{\(\}]=~}{d)4%:d;}]=~i}do]`d k 1/=

88 caracteres:

~:i;'NESW':k\?:d;{i(\:i;'MRL'?[{d[{)}{\)\}{(}{\(\}]=~}{d)4%:d;}{d(4%:d;}]=~i}do]`d k 1/=

98 caracteres:

 ~1/:i;:d;{'NESW'd?}:k;{k[{)}{\)\}{(}{\(\}]=~}:M;{k'ESWN'1/=:d;}:R;{k'WNES'1/=:d;}:L;{i(\:i;~i}do d

116 caracteres:

[~])\~"NESW":k 1/:d?{d(1/+:d;}:f*:y;:x;{("MRL"?[{k d 0=?[{y):y}{x):x}{y(:y}{x(:x}]=~;}{f}{d)1/\+:d;}]=~.}do x y d 0=
usuario3700847
fuente
por cierto: las versiones anteriores de la publicación se almacenan para que pueda ver cómo estaban en el pasado (simplemente haga clic en el enlace "Editado hace xxx")
masterX244
1

Delfos (819)

Cuando comencé, todavía no era . Se editará más tarde.

Sin embargo, no puedo encontrar un compilador en línea.

uses SysUtils;type TDirection = (dNorth, dEast, dSouth, dWest);var x,y:int64;dir:TDirection;input:string;c:char;function gd(C:Char):TDirection;var o:integer;begin o:=ord(dir);if C='L'then o:=o-1else if c='R'then o:=o+1else if c='N'then exit(dNorth)else if c='E'then exit(dNorth)else if c='S'then exit(dNorth)else if c='W'then exit(dNorth);if o>3 then exit(dNorth);if o<0 then exit(dWest);exit(TDirection(o))end;function DirLetter:string;begin if dir=dNorth then exit('N');if dir=dEast then exit('E');if dir=dSouth then exit('S');if dir=dWest then exit('W');end;begin Readln(x,y,input);dir := gd(Input[1]);readln(Input);Input:=UpperCase(Input);for C in Input do begin if C<>'M' then dir:=gd(C)else case dir of dNorth:y:=y+1;dEast:x:=x+1;dSouth:y:=y-1;dWest:x:=x-1;end;end;writeln(Format('%d,%d,%s',[x,y,DirLetter]));end.

Sin golf

uses
  SysUtils;
type
  TDirection = (dNorth, dEast, dSouth, dWest);

var
  x,y:int64;
  dir:TDirection;
  input:string;
  c:char;

  function gd(C:Char):TDirection;
  var
    o:integer;
  begin
    o:=ord(dir);
    if C='L' then
      o:=o-1
    else if c='R' then
      o:=o+1
    else if c='N' then
      exit(dNorth)
    else if c='E' then
      exit(dNorth)
    else if c='S' then
      exit(dNorth)
    else if c='W' then
      exit(dNorth);

    if o>3 then exit(dNorth);
    if o<0 then exit(dWest);
    exit(TDirection(o))
  end;
  function DirLetter:string;
  begin
    if dir=dNorth then exit('N');
    if dir=dEast then exit('E');
    if dir=dSouth then exit('S');
    if dir=dWest then exit('W');
  end;
begin
  Readln(x,y,input);
  dir := gd(Input[1]);
  readln(Input);
  Input:=UpperCase(Input);
  for C in Input do
  begin
    if C<>'M' then
      dir:=gd(C)
    else
      case dir of
        dNorth:y:=y+1;
        dEast:x:=x+1;
        dSouth:y:=y-1;
        dWest:x:=x-1;
      end;
  end;
  writeln(Format('%d,%d,%s',[x,y,DirLetter]));
end.
Teun Pronk
fuente
puede ser ideone y la opción es Pascal?
Amit Joki
44
"Cuando comencé, todavía no era código golf". ¿Es esa tu excusa para codificar en Delphi? ;)
Martin Ender
¿Qué pasa con los espacios alrededor =? ¿Por qué son necesarios? Además, los nombres de las variables me parecen demasiado largos
John Dvorak
@ m.buettner ssshh, no derrames los frijoles: P
Teun Pronk
@ JanDvorak Como dije, no fue etiquetado como código de golf
Teun Pronk
1

Javascript (353)

Este es mi primer intento real de golf de código, parece que funciona al menos!

var xx=[0,1,0,-1];var yy=[1,0,-1,0];var d=["N","E","S","W"];var e=0;var x,y=0;function sa(p){q=p.split(",");x=+q[0];y=+q[1];e=+d.indexOf(q[2]);}function sb(t){var g=t.split(",");for(var u=0;u<g.length;u++){if(g[u]=='R'){e++;if(e>3)e=0;}if(g[u]=='L'){e--;if(e<0)e=3;}if(g[u]=='M'){x+=+xx[e];y+=+yy[e];}}alert(x+","+y+","+d[e]);}sa(prompt());sb(prompt());
James Hunt
fuente
55
Puedo ver nombres de variables innecesariamente largos;). Además, en el código de golf, a nadie le importa el alcance variable adecuado, por lo tanto, elimine esos var s.
Martin Ender
1

Pitón (263)

input =  raw_input("Initial: ")
input2 = raw_input("Command: ")

position = [int(input[0]), int(input[2]), input[4]]

bearings = "NESW"
turns = {"L" : -1, "M": 0, "R" : 1}
move = {"N" : [0, 1], "E" : [1, 0], "S" : [0, -1], "W" : [-1, 0]}

for c in input2:
    turn = turns[c];
    if (turn == 0):
        position[0] += move[position[2]][0]
        position[1] += move[position[2]][1]
    else:
        position[2] = bearings[(bearings.index(position[2]) + turn)%4]

print "Output: ", ','.join((str(s) for s in position))

Debe haber una forma más elegante de hacer esto también, no necesita la rama después de lo contrario.

http://ideone.com/eD0FwD

La entrada es horrible, quería hacerlo con split(',') pero encontré problemas de transmisión entre las entradas y las cadenas. Idealmente, también quería agregar la posición anterior con la posición de movimiento ... oh, ahora es code-golf. Oh bueno, lo que sea, lo dejaré aquí, podría inspirarte. Otras ideas que tenía estaban usando el módulo 4 de la dirección después de mapear el rumbo inicial a un índice. También fusiona los giros y mueve las matrices a una, ya que ninguna de las teclas colisiona.

aun así, acortando nombres de variables y eliminando espacios es 263:

i=raw_input()
j=raw_input()
p=[int(i[0]),int(i[2]),i[4]]
b="NESW"
m={"N":[0,1],"E":[1,0],"S":[0,-1],"W":[-1,0],"L":-1,"M":0,"R":1}
for c in j:
    if (m[c]==0):
        p[0]+=m[p[2]][0]
        p[1]+=m[p[2]][1]
    p[2] = b[(b.index(p[2])+m[c])%4]
print ','.join(str(s) for s in p)
Mardoxx
fuente
1

Python 2.7 - 197 192 bytes

q='NESW';x,y,d=raw_input().split(',');x=int(x);y=int(y);d=q.find(d);v={0:'y+',1:'x+',2:'y-',3:'x-'}
for c in raw_input():exec['d+','d-',v[d]]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]

De hecho, estoy súper orgulloso de este.

Explicación

Primero, limpiemos este desastre. Usé puntos y comas en lugar de saltos de línea en muchos lugares porque creo que me hace genial. Aquí está normalmente (esto sigue siendo 197 bytes, no ha sido descartado). Sí, todavía hay un punto y coma, pero ese realmente guarda un byte.

q='NESW'
x,y,d=raw_input().split(',')
x=int(x)
y=int(y)
d=q.find(d)
v={0:'y+',1:'x+',2:'y-',3:'x-'}
for c in raw_input():m=v[d];exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]

¡Vamos a empezar!

q='NESW'

Primero definimos qcomo la cadena 'NESW'. Lo usamos dos veces más tarde y len("q='NESW';qq") < len("'NESW''NESW'").

x,y,d=raw_input().split(',')

Aquí dividimos la primera línea de inpupt en cada coma. Nuestra x coord se almacena en x, y en y, y la primera letra de nuestra dirección en d.

x=int(x)
y=int(y)

Luego solo hacemos las entradas de los coords. (Me sorprendió que no se me ocurriera una mejor manera de convertir dos cadenas en ints. Lo intenté x,y=map(int,(x,y))pero resulta ser más largo).

d=q.find(d)

Esto convierte nuestra dirección en un número entero. 0 es norte, 1 es este, 2 es sur y 3 es oeste.

v={0:'y+',1:'x+',2:'y-',3:'x-'}

Aquí es donde comienza la diversión.

Cuando vamos hacia el norte, Y aumenta en 1. Entonces este diccionario toma 0 y da la cadena 'y+', para "aumentar y". Da resultados similares para otras direcciones: y o x seguido de + o -.

Volveremos a esto.

for c in raw_input():
    m=v[d]
    exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'

Me he tomado la libertad de desanimar a este un poco.

Para cada personaje en la segunda línea de entrada, hacemos dos cosas. Primero, configuramos la variable ma lo que nuestro diccionario de antes nos da para nuestra dirección actual. No hay ninguna razón por la que necesitemos que esto suceda siempre, pero es más fácil que simplemente hacer que suceda cuando lo necesitamos.

A continuación, vamos a crear una lista con tres elementos: 'd+', 'd-', y m. NOTA DEL EDITOR: Creo que puedo escapar sin usar la variable men absoluto. Creo que puedo ponerlo v[d]directamente en la lista. Eso me ahorrará un par de bytes si funciona, pero no tengo ganas de probarlo hasta que termine esta explicación para que puedan lidiar. (Sí, funcionó).

Buscamos el carácter actual de la entrada en la cadena 'RL'. str.finddevuelve -1 si no encuentra el carácter, por lo que esto convierte una R en un 0, una L en un 1 y cualquier otra cosa en -1. Por supuesto, la única otra entrada que podemos tener es M, pero son menos caracteres para que funcione para todo.

Usamos ese número como índice para la lista que creamos. Los índices de la lista de Python comienzan al final si son negativos, por lo que obtenemos el primer elemento si la entrada es R, el segundo si es L y el último si es M. Por conveniencia, estoy a punto de suponer que estamos mirando hacia el norte, pero se aplica un principio similar para otras direcciones.

Los posibles valores con los que estamos trabajando son 'd+'para R, 'd-'para L y 'y+'para M. Luego, los adjuntamos '=1;d=d%4'al final de cada uno. Eso significa que nuestros valores posibles son ...

d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4

¡Ese es el código válido de Python! ¡Es un código válido de Python que hace exactamente lo que queremos hacer para cada uno de esos caracteres de entrada! (La d=d%4parte solo mantiene nuestras instrucciones sensatas. Nuevamente, no es necesario que lo haga siempre, pero son menos caracteres).

Todo lo que tenemos que hacer es ejecutar el código que obtenemos para cada carácter, imprimirlo (convirtiendo nuestra dirección de nuevo en una cadena), ¡y listo!

monorraíl subterráneo
fuente
1

C - 350

Guardar como rover.c:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){char c,*C="NWSE-WN";float x,y,d,k=M_PI/2;scanf("%f,%f,%c",&x,&y,&c);d=(strchr(C,c)-C)*k;do{switch(getchar()){case'R':d+=k;break;case'L':d-=k;break;case'M':x+=sin(d);y+=cos(d);break;case EOF:printf("%g,%g,%c\n",x,y,C[(int)(sin(d)+2*cos(d)+4.5)]);}}while(!feof(stdin));return 0;}

Compilar:

gcc -o rover rover.c -lm

Ejecución de muestra:

$ echo 1,2,N MRMLM | ./rover
2,4,N

Ideona

Sin golf:

#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{
    /* String is used for input and output, pi/2 == 90 degrees */
    char c, *C = "NWSE-WN";
    float x, y, d, k = M_PI/2;

    /* Get starting parameters */
    scanf("%f,%f,%c", &x, &y, &c);

    /* Convert the direction NWSE into radians */
    d = (strchr(C, c) - C) * k;

    /* Process each character */
    do
    {
        /* Recognize R(ight), L(eft), M(ove) or EOF */
        switch (getchar())
        {
            case 'R':
                /* Turn right 90 degrees */
                d += k;
                break;

            case 'L':
                /* Turn left 90 degrees */
                d -= k;
                break;

            case 'M':
                /* Advance 1 unit in the direction specified */
                x += sin(d);
                y += cos(d);
                break;

            case EOF:
                /* Output - formula is specially crafted so that S,E,W,N
                    map to indices 2,3,5,6 to reuse part of string */
                printf("%g,%g,%c\n", x, y, C[(int)(sin(d) + 2*cos(d) + 4.5)]);
        }
    }
    while (!feof(stdin));

    return 0;
}

fuente
1

Haskell - 412 bytes

import Text.Parsec
import Text.Parsec.String
n='N'
s='S'
e='E'
w='W'
d(x,y,c)'M'|c==n=(x,y+1,c)|c==s=(x,y-1,c)|c==e=(x+1,y,c)|c==w=(x-1,y,c)
d(x,y,c)e=(x,y,i c e)
i 'N''R'=e
i 'N''L'=w
i 'S''R'=w
i 'S''L'=e
i 'E''R'=s
i 'E''L'=n
i 'W''R'=n
i 'W''L'=s
f=many digit
g=char ','
o=oneOf
main=interact(\s->show$parse(do x<-f;g;y<-f;g;c<-o"NSEW";newline;b<-many$o"MRL";return$foldl(\x c->d x c)(read x,read y,c)b)""s)

Probado con:

$ printf "1,2,N\nMRMLM" | ./rv
Right (2,4,'N')
gxtaillon
fuente
Ja ja ja! Es genial ver a Haskell tan lejos detrás de la manada, para variar: D
GreenAsJade
1
f=many digit MUCHO LOL - TAN GUAU
TAN
Dividir la entrada y usar readvarias veces tomó más caracteres que usar parsec ...
gxtaillon
1

Bash + coreutils, 159 bytes

t()(tr $2 0-3 $1<<<$d)
IFS=, read x y d
d=`t '' NESW`
for s in `fold -1`;{
[ $s = M ]&&((`t yxyx;t ++-`=1))||d=$[(d`tr LR -+<<<$s`1+4)%4]
}
echo $x,$y,`t NESW`

La entrada se lee desde 2 líneas de STDIN.

Salida:

$ { echo 1,2,N; echo MRMLM; } | ./rover.sh
2,4,N
$
Trauma digital
fuente
1

Potencia Shell, 170 167 166

[int]$x,[int]$y,$e,$m="$input"-split'\W'
$d='NESW'.indexof($e)
switch([char[]]$m){'R'{$d++}'L'{$d--}'M'{iex(-split'$y++ $x++ $y-- $x--')[$d%4]}}
"$x,$y,"+'NESW'[$d%4]

Parece que no puede jugar más golf, lo cual es un poco vergonzoso. Pero todos los hacks obvios realmente no funcionan aquí.

No puedo iexla entrada porque a) N, S,E y Wtendría que ser funciones para las que al trabajo (o que había necesidad de prefijo que con $yb) 1,2,Nhabría que analizar el Nen modo de expresión, no ser capaz de ejecutar un comando .

El switchparece ser el camino más corto de hacer el movimiento. La tabla hash con bloques de secuencia de comandos o cadenas no es más corta, y para cualquier otra forma, aparte de la switchque tendría la sobrecarga del bucle explícito.

No puedo deshacerme de él IndexOfporque una tubería con ?es aún más larga.

Tampoco puedo deshacerme de los tipos explícitos en la declaración inicial porque tengo tipos mixtos allí, por lo que un simple |%{+$_}no ayuda y cualquier otra opción es más larga.

A veces odio el manejo de entradas en PowerShell.

Joey
fuente
1

Python, 135 137 138

S,W,N,E=0,1,2,3;a,b,d=input();v=[b,a]
for c in map(ord,raw_input()):d+=c%23;v[d&1]+=c%2*~-(d&2)
print'%d,%d,%s'%(v[1],v[0],'SWNE'[d&3])

Abusos de los valores ASCII de L, MyR para evitar el uso de declaraciones condicionales.

Pruébalo en ideone .

nneonneo
fuente
1

Python 2.7, 170 149

N,E,S,W=q='NESW'
x,y,d=input()
d=q.find(d)
for c in raw_input():exec['d+','d-','yx'[d%2]+'+-'[d/2]]['RL'.find(c)]+'=1;d%=4'
print`x`+','+`y`+','+q[d]

Cosas que cambié del original:

Raw_input con alias, cambió el diccionario v [d], que de todos modos debería haber sido una lista, a alguna selección de cadena utilizada %=.

Editar: utiliza el desempaquetado de tuplas y eval (raw_input ()) == input () para guardar 21 caracteres.

Muy prestado de @undergroundmonorail, pero con muchas mejoras.

isaacg
fuente
¡Agradable! Me gusta esto muchisimo.
undergroundmonorail
0

Bash / SHELF ,243 235

" SHE ll go LF " es una biblioteca de golf para Bash que proporciona algunos alias útiles. Esta es una respuesta válida ya que la biblioteca existía y estaba en GitHub antes de que se publicara el desafío.

Lo siento, no puedo hacer que esto funcione en ideone.

Como correr

Esto toma la posición inicial (separada por comas como se especifica; esto agrega muchos caracteres al código) como su primer argumento, y las instrucciones sobre la entrada estándar.

source shelf.sh #you must load SHELF first
source rover.sh 1,2,N<<<MRMLM #now run the script via source so it has access to SHELF

Salida de muestra

2,4,N

Código

o=$1
D(){ o=`y NESW $1<<<$o`;}
for x in `Y . '& '`;{
d $x R&&D ESWN
d $x L&&D WNES
d $x M&&z=(`y , \ <<<$o`)&&case ${z[2]} in N) z[1]=$[z[1]+1];;S) z[1]=$[z[1]-1];;W) z[0]=$[z[0]-1];;E) z[0]=$[z[0]+1];;esac&&o=`P ${z[@]}|y \  ,`
}
p $o

Explicación

des para comparación; devuelve 0 si sus dos argumentos son iguales y 1 de lo contrario, puede tener otros comandos encadenados con &&y ||.

yes como tr(pero hecho sed).

YEs como sed 's/.../.../g'por sus dos argumentos.

Pes echo -e -n; pes justo echo -e.

o=$1 #save first argument to variable
D(){ o=`y NESW $1<<<$o`;} #define an alias to turn R or L
for x in `Y . '& '`;{ #add a space after every character on stdin and loop for each one
d $x R&&D ESWN #turn R using alias
d $x L&&D WNES #turn L using alias

El siguiente bit es profundamente feo, con alrededor de 145 caracteres en una línea. Si el comando actual es M, convierta las comas en $ o en espacios, conviértalas en matriz y guárdelas en $ z. Luego, haga un cambio ... bloque de mayúsculas y minúsculas para el último elemento de $ z (la dirección que apunta el móvil. Cambie las coordenadas en consecuencia, luego convierta $ z nuevamente en una cadena separada por comas y guárdelo en $ o.

d $x M&&z=(`y , \ <<<$o`)&&case ${z[2]} in N) z[1]=$[z[1]+1];;S) z[1]=$[z[1]-1];;W) z[0]=$[z[0]-1];;E) z[0]=$[z[0]+1];;esac&&o=`P ${z[@]}|y \  ,`
} #end loop
p $o #print output

fuente
1
¿No debería el abastecimiento shelf.shser parte de la solución? Como si tuviera que usar requireciertos paquetes en Ruby o importtambién en Python si los necesita.
Joey
@Joey buen punto, pero no creo que las personas importPYG cuando escriben un programa Python con él, o Rebmu (AFAIK) cuando escriben un programa Rebol con él
0

Haskell, 291

data D=W|S|E|N deriving(Show,Read,Enum)
main=interact$(\(x,y)->tail$map show y++[show(toEnum x::D)]>>=(',':)).(\(a:b:_)->foldl(\(f,j@[g,h])i->case i of 'M'->(f,[g+rem(f-1)2,h+rem(f-2)2]);'L'->(mod(f+1)4,j);'R'->(mod(f-1)4,j))((\(c,d,e)->(fromEnum(e::D),[c::Int,d]))$read('(':a++")"))b).lines

No estaba seguro de cuán flexible era el formato de cadena de entrada y salida, así que me aseguré de que se viera exactamente como el ejemplo (menos las indicaciones, por supuesto), pero eso agregó muchos caracteres adicionales. Enlace de ideona

YawarRaza7349
fuente
0

PHP - 224

Bueno, lo intenté.

$n=explode(",",$argv[1]);$d=($e=$n[2])==W?0:($e==N?1:($e==E?2:3));for(;$i<strlen($n[3]);)if(($o=$n[3][$i++])==M)$n[$d%2]+=$d>1?-1:1;else$d=$o==R?($d+1)%4:($d==0?3:$d-1);echo"{$n[0]},{$n[1]},".($d==1?N:($d==2?E:($d==3?S:W)));

Entrada en STDIN, por ejemplo:

$ php mars_rover.php 1,2,N,MMMRRRRRMM
-1,5,E
$ php mars_rover.php 1,2,N,MMMMRLMRLMMRMRMLMRMRMMRM
1,8,N
$ php mars_rover.php 3,-2,W,MMMMLM
7,-3,S
Aurel Bílý
fuente
0

Python3 (288)

Implementación con uso intensivo de ifs ternarios.

m=['N','E','S','W']
cords=[int(n) for n in input().split()] + [input()] #Convert first inputs to integers and retrieve third
for n in input(): #Get instructions
    if n=='M':
        i=[1,0][cords[2] in m[1:3]] #See if vertical or horizontal
        j=[-1,1][cords[2] in m[0:2]] #See if negative or positive
        cords[i]+=j
    else:
        i=[-1,1][n=='R'] #Translate turn to numerals
        cords[2]=m[m.index(cords[2])+i] #Change direction relative to current orientation
print(cords)

Omitir las quejas de entrada obvias, dar a las cadenas de dirección valores intrínsecos puede haber beneficiado el tamaño del script. Sin embargo, el enfoque aquí es perfectamente funcional (así que creo)

idiot.py
fuente
Bienvenido a PPCG. Este es el código de golf, por lo que gana la respuesta más corta. Puede comenzar haciendo que sus nombres de variables tengan un carácter largo.
Trauma digital
0

Pitón 3 (143)

I=input
a,b,D=I().split(',')
w='ENWS'
d=w.find(D)
x=int(a)+int(b)*1j
for c in I():x+=(c=='M')*1j**d;d+='ML'.find(c)
print(x.real,x.imag,w[d%4])

http://ideone.com/wYvt7J

Utilizamos el tipo de número complejo incorporado de Python para almacenar el par de coordenadas. La dirección se calcula llevando la unidad imaginaria 1ja la potencia de d, que almacena la dirección mod 4. La rotación se realiza aumentando o disminuyendo d. La expresión 'ML'.find(c)da la cantidad que queremos cambiar d: 1para L, 0para My -1(el valor predeterminado para no encontrado) para R.

Python no tiene una forma corta de convertir un número complejo en una tupla, por lo que tenemos que hacer llamadas costosas a .realy .imag.

xnor
fuente