Python 2.7 - 197 192 байти
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]
Я насправді супер гордий цим.
Пояснення
Спочатку давайте приберемо цей безлад. Я використовував крапки з комою замість розривів рядків у багатьох місцях, бо думаю, що це робить мене крутим. Ось це нормально (це все-таки 197 байт, він взагалі не був знятий з вогню). Так, все ще є крапка з комою, але цей фактично зберігає байт.
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]
Давайте почнемо!
q='NESW'
Спочатку визначаємо q
як рядок 'NESW'
. Ми використовуємо його двічі пізніше і len("q='NESW';qq") < len("'NESW''NESW'")
.
x,y,d=raw_input().split(',')
Тут ми розділили перший рядок inpupt у кожній комі. Наша координата x зберігається в x
, y в y
, і перша літера нашого напрямку в d
.
x=int(x)
y=int(y)
Тоді ми просто робимо коорди вставки. (Я був шокований, що не міг придумати кращого способу перетворення двох рядків у ints. Я спробував, x,y=map(int,(x,y))
але це виявляється довше.)
d=q.find(d)
Це перетворює наш напрямок у ціле число. 0 - північ, 1 - схід, 2 - південь і 3 - захід.
v={0:'y+',1:'x+',2:'y-',3:'x-'}
Ось тут починаються веселощі.
Коли ми йдемо на північ, Y збільшується на 1. Отже, цей словник приймає 0 і дає рядок 'y+'
для "збільшення y". Це дає аналогічні результати для інших напрямків: y або x, а потім + або -.
Ми повернемося до цього.
for c in raw_input():
m=v[d]
exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
Я трохи пішов на волю, щоб зняти гольф.
Для кожного символу у другому рядку введення робимо дві речі. По-перше, ми встановлюємо змінну m
до того, що наш словник до цього дає нам для нашого поточного напрямку. Немає причини, щоб нам це було щоразу, але це простіше, ніж просто робити це, коли нам це потрібно.
Далі ми створюємо список з трьох елементів: 'd+'
, 'd-'
, і m
. Примітка редактора: Я думаю, що я можу піти з того, що не використовую змінну m
взагалі. Я думаю, що я можу просто внести v[d]
в список безпосередньо. Це врятує мені пару байтів, якщо це працює, але мені не здається тестувати його, поки я не закінчу це пояснення, щоб ви могли розібратися. (Так, це спрацювало.)
Шукаємо поточний символ введення в рядку 'RL'. str.find
повертає -1, якщо він не знаходить символу, тому це перетворює R в 0, L в 1 і все інше в -1. Звичайно, єдиний інший внесок, який ми можемо мати, - це M, але це менше символів, щоб змусити його працювати на все.
Ми використовуємо це число як індекс для списку, який ми створили. Індекси списку Python починаються в кінці, якщо вони негативні, тому ми отримуємо перший елемент, якщо вхід R, другий, якщо він L, і останній, якщо це M. Для зручності я збираюся припустити, що ми стикаємося на північ, але подібний принцип застосовується і для інших напрямків.
Можливі значення, з якими ми працюємо, є 'd+'
для R, 'd-'
для L і 'y+'
для M. Потім додаємо '=1;d=d%4'
до кінця кожного. Це означає, що наші можливі цінності:
d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4
Це дійсний код python! Це дійсний код python, який робить саме те, що ми хочемо зробити для кожного з цих вхідних символів! ( d=d%4
Частина просто підтримує наші вказівки здоровими. Знову ж таки, не потрібно робити це кожен раз, але це менше символів.)
Все, що нам потрібно зробити, - це виконати код, який ми отримуємо для кожного символу, роздрукувати його (перетворивши наш напрямок назад у рядок), і ми закінчили!