Python 2.7 - 197 192 octets
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]
Je suis en fait super fier de celui-ci.
Explication
Tout d'abord, nettoyons ce gâchis. J'ai utilisé des points-virgules au lieu des sauts de ligne dans beaucoup d'endroits parce que je pense que ça me rend cool. Ici, il est normalement (c'est toujours 197 octets, il n'a pas été du tout golfé). Oui, il y a toujours un point-virgule, mais celui-ci enregistre en fait un octet.
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]
Commençons!
q='NESW'
Nous définissons q
d'abord la chaîne 'NESW'
. Nous l'utilisons deux fois plus tard, etlen("q='NESW';qq") < len("'NESW''NESW'")
.
x,y,d=raw_input().split(',')
Ici, nous séparons la première ligne d'inpupt à chaque virgule. Notre coordonnée x est stockée dans x
, y dans y
, et la première lettre de notre direction dansd
.
x=int(x)
y=int(y)
Ensuite, nous faisons juste les coords ints. (J'ai été choqué de ne pas pouvoir penser à une meilleure façon de convertir deux cordes en pouces. J'ai essayéx,y=map(int,(x,y))
mais cela s'avère plus long.)
d=q.find(d)
Cela convertit notre direction en un entier. 0 est au nord, 1 à l'est, 2 au sud et 3 à l'ouest.
v={0:'y+',1:'x+',2:'y-',3:'x-'}
C'est là que le plaisir commence.
Lorsque nous allons vers le nord, Y augmente de 1. Donc, ce dictionnaire prend 0 et donne la chaîne 'y+'
, pour "augmenter y". Il donne des résultats similaires pour d'autres directions: y ou x suivi de + ou -.
Nous y reviendrons.
for c in raw_input():
m=v[d]
exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
Je suis allé à la liberté de dégrader légèrement celui-ci.
Pour chaque caractère de la deuxième ligne d'entrée, nous faisons deux choses. Tout d'abord, nous définissons la variablem
sur tout ce que notre dictionnaire d'avant nous donne pour notre direction actuelle. Il n'y a aucune raison pour que cela se produise à chaque fois, mais c'est plus facile que de le faire quand nous en avons besoin.
Ensuite, nous créons une liste avec trois éléments: 'd+'
, 'd-'
et m
. NOTE DE LA RÉDACTION: Je pense que je peux m'en tirer sans utiliser la variable m
du tout. Je pense que je peux simplement mettre v[d]
la liste directement. Cela me fera économiser quelques octets si cela fonctionne, mais je n'ai pas envie de le tester avant d'avoir terminé cette explication pour que vous puissiez tous vous en occuper. (Oui, ça a marché.)
Nous recherchons le caractère actuel de l'entrée dans la chaîne «RL». str.find
renvoie -1 s'il ne trouve pas le caractère, donc cela convertit un R en 0, un L en 1 et tout le reste en -1. Bien sûr, la seule autre entrée que nous pouvons avoir est M, mais il y a moins de caractères pour le faire fonctionner pour tout.
Nous utilisons ce numéro comme index pour la liste que nous avons créée. Les indices de liste Python commencent à la fin s'ils sont négatifs, nous obtenons donc le premier élément si l'entrée est R, le second si c'est L et le dernier si c'est M. Par souci de commodité, je suis sur le point de supposer que nous sommes face au nord, mais un principe similaire s'applique pour d'autres directions.
Les valeurs possibles avec lesquelles nous travaillons sont 'd+'
pour R, 'd-'
pour L et 'y+'
pour M. Ensuite, nous attachons '=1;d=d%4'
à la fin de chacun. Cela signifie que nos valeurs possibles sont ...
d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4
C'est du code python valide! C'est du code python valide qui fait exactement ce que nous voulons faire pour chacun de ces caractères d'entrée! (La d=d%4
partie garde nos directions saines. Encore une fois, pas besoin de le faire à chaque fois, mais ce sont moins de personnages.)
Tout ce que nous avons à faire est d'exécuter le code que nous obtenons pour chaque caractère, de l'imprimer (reconvertir notre direction en chaîne), et nous avons terminé!