Python 2.7 - 197 192 bayt
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]
Aslında bununla gurur duyuyorum.
açıklama
İlk olarak, bu pisliği temizleyelim. Birçok yerde satır sonları yerine noktalı virgül kullandım çünkü bence beni serinletti Burada normalde (bu hala 197 bayt, hiç çözülmemiş). Evet, hala noktalı virgül var, ama aslında bir bayt kaydediliyor.
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]
Hadi başlayalım!
q='NESW'
Önce q
dize olarak tanımlarız 'NESW'
. İki kez sonra kullanıyoruz ve len("q='NESW';qq") < len("'NESW''NESW'")
.
x,y,d=raw_input().split(',')
Burada her virgüldeki ilk giriş hattını ayırıyoruz. Bizim x koordinatımız x
y içinde y
ve yönümüzün ilk harfinde saklanır d
.
x=int(x)
y=int(y)
O zaman sadece koordinatları ints yapıyoruz. (İki dizeyi ints'e dönüştürmenin daha iyi bir yolunu düşünemediğim için şok oldum. Denedim x,y=map(int,(x,y))
ama bu daha uzun çıkıyor.)
d=q.find(d)
Bu, yönümüzü bir tamsayıya dönüştürür. 0 kuzey, 1 doğu, 2 güney ve 3 batıdır.
v={0:'y+',1:'x+',2:'y-',3:'x-'}
Eğlence burada başlıyor.
Kuzeye gittiğimizde Y 1 artar. Bu yüzden bu sözlük 0 alır ve 'y+'
" y'yi arttırır " için dizeyi verir . Diğer yönler için benzer sonuçlar verir: y veya x ardından + veya -.
Buna geri döneceğiz.
for c in raw_input():
m=v[d]
exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
Bunu hafifçe çözme özgürlüğüne gittim.
İkinci girdi satırındaki her karakter için iki şey yaparız. İlk olarak, değişkeni m
sözlüğümüzden daha önce verdiğimiz şeye ayarlıyoruz . Bunun her seferinde gerçekleşmesi için bir neden yok, ama ihtiyacımız olduğunda bunu yapmaktan daha kolay.
Sonra, üç elemanlı bir liste oluşturmak: 'd+'
, 'd-'
, vem
. EDİTÖRÜN NOTU: Değişkeni hiç kullanmamaktan kurtulabileceğimi düşünüyorum m
. Sanırım v[d]
listeye doğrudan girebiliyorum . Çalışırsa bu bana birkaç bayt kazandıracak, ancak bu açıklamayı yapana kadar test etmek istemiyorum, böylece hepiniz başa çıkabilirsiniz. (Evet, işe yaradı.)
'RL' dizesindeki girişin geçerli karakterini ararız. str.find
karakteri bulamazsa -1 değerini döndürür, böylece bu R'yi 0'a, L'yi 1'e ve başka bir şeyi -1'e dönüştürür. Tabii ki, sahip olabileceğimiz diğer tek girdi M'dir, ancak her şey için çalışmasını sağlamak daha az karakterdir.
Bu sayıyı, oluşturduğumuz liste için dizin olarak kullanırız. Python listesi indeksleri negatifse sonunda başlar, bu yüzden giriş R ise ilk öğeyi, L ise ikincisini ve M ise sonuncusunu alırız. kuzeye bakıyoruz ancak diğer yönler için de benzer bir ilke geçerlidir.
Çalıştığımız olası değerler 'd+'
R, 'd-'
L ve 'y+'
M içindir. Sonra, '=1;d=d%4'
her birinin sonuna bağlarız . Bu, olası değerlerimizin ...
d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4
Bu geçerli bir python kodu! Bu, giriş karakterlerinin her biri için tam olarak ne yapmak istediğimizi yapan geçerli bir python kodu! ( d=d%4
Parça sadece yönlerimizi aklı başında tutar. Yine, her seferinde yapmanıza gerek yok, ama daha az karakter.)
Tek yapmamız gereken, her karakter için aldığımız kodu çalıştırmak, yazdırmak (yönümüzü bir dizgeye dönüştürmek) ve işimiz bitti!