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]
Na verdade, estou super orgulhosa desse.
Explicação
Primeiro, vamos limpar essa bagunça. Usei ponto e vírgula em vez de quebras de linha em muitos lugares porque acho que isso me deixa legal. Aqui está normalmente (ainda são 197 bytes, não foi totalmente destruído). Sim, ainda há um ponto e vírgula, mas esse realmente salva um 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 começar!
q='NESW'
Primeiro, definimos q
como a string 'NESW'
. Nós o usamos duas vezes depois, e len("q='NESW';qq") < len("'NESW''NESW'")
.
x,y,d=raw_input().split(',')
Aqui, dividimos a primeira linha de entrada em cada vírgula. Nosso x coord é armazenado em x
, y in y
e a primeira letra de nossa direção em d
.
x=int(x)
y=int(y)
Então nós apenas fazemos os coords ints. (Fiquei chocado por não conseguir pensar em uma maneira melhor de converter duas seqüências de caracteres em ints. Tentei, x,y=map(int,(x,y))
mas isso acabou sendo mais longo.)
d=q.find(d)
Isso converte nossa direção em um número inteiro. 0 é norte, 1 é leste, 2 é sul e 3 é oeste.
v={0:'y+',1:'x+',2:'y-',3:'x-'}
Aqui é onde a diversão começa.
Quando vamos para o norte, Y aumenta em 1. Portanto, este dicionário recebe 0 e fornece a string 'y+'
para "aumentar y". Ele fornece resultados semelhantes para outras direções: y ou x seguido de + ou -.
Voltaremos a isso.
for c in raw_input():
m=v[d]
exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
Eu tenho a liberdade de desenterrar este aqui um pouco.
Para cada caractere na segunda linha de entrada, fazemos duas coisas. Primeiro, definimos a variável m
como qualquer que seja o nosso dicionário anterior nos fornece a nossa direção atual. Não há razão para que isso aconteça sempre, mas é mais fácil do que fazer acontecer quando precisamos.
Em seguida, criamos uma lista com três elementos: 'd+'
, 'd-'
, e m
. NOTA DO EDITOR: Eu acho que posso me safar de não usar a variável m
. Eu acho que posso simplesmente colocar v[d]
na lista diretamente. Isso me poupará alguns bytes, se funcionar, mas não sinto vontade de testá-lo até concluir esta explicação para que vocês possam lidar. (Sim, funcionou.)
Procuramos o caractere atual da entrada na string 'RL'. str.find
retorna -1 se não encontrar o caractere; portanto, isso converte um R em 0, um L em 1 e qualquer outra coisa em -1. Obviamente, a única outra entrada que podemos ter é M, mas são menos caracteres para fazê-lo funcionar para tudo.
Usamos esse número como índice da lista que criamos. Os índices da lista Python começam no final se forem negativos, então obtemos o primeiro elemento se a entrada for R, o segundo se for L e o último se for M. Por uma questão de conveniência, estou prestes a assumir que estamos voltados para o norte, mas um princípio semelhante se aplica a outras direções.
Os possíveis valores com os quais trabalhamos são 'd+'
para R, 'd-'
para L e 'y+'
para M. Em seguida, anexamos '=1;d=d%4'
ao final de cada um. Isso significa que nossos possíveis valores são ...
d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4
Esse é um código python válido! Esse é um código python válido que faz exatamente o que queremos fazer para cada um desses caracteres de entrada! (A d=d%4
parte apenas mantém nossas orientações sãs. Novamente, não é necessário fazer isso todas as vezes, mas são menos caracteres.)
Tudo o que precisamos fazer é executar o código que obtemos para cada caractere, imprimi-lo (convertendo nossa direção de volta para uma string) e pronto!