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!