Python 2.7 - 197 192 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():exec['d+','d-',v[d]]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]
Tôi thực sự siêu tự hào về điều này.
Giải trình
Đầu tiên, hãy dọn dẹp mớ hỗn độn này. Tôi đã sử dụng dấu chấm phẩy thay vì ngắt dòng ở nhiều nơi vì tôi nghĩ nó làm tôi mát mẻ. Ở đây là bình thường (đây vẫn là 197 byte, nó hoàn toàn không được xử lý). Vâng, vẫn còn một dấu chấm phẩy, nhưng cái đó thực sự tiết kiệm một 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]
Hãy bắt đầu nào!
q='NESW'
Đầu tiên chúng ta định nghĩa q
là chuỗi 'NESW'
. Chúng tôi sử dụng nó hai lần sau đó, và len("q='NESW';qq") < len("'NESW''NESW'")
.
x,y,d=raw_input().split(',')
Ở đây chúng tôi chia dòng đầu tiên của mỗi dấu phẩy ở mỗi dấu phẩy. Tọa độ x của chúng tôi được lưu trữ trong x
, y trong y
và chữ cái đầu tiên của hướng của chúng tôi trong d
.
x=int(x)
y=int(y)
Sau đó, chúng tôi chỉ làm cho các coords ints. (Tôi đã bị sốc khi tôi không thể nghĩ ra cách nào tốt hơn để chuyển đổi hai chuỗi thành int. Tôi đã thử x,y=map(int,(x,y))
nhưng hóa ra là dài hơn.)
d=q.find(d)
Điều này chuyển đổi hướng của chúng tôi thành một số nguyên. 0 là hướng bắc, 1 là hướng đông, 2 là hướng nam và 3 là hướng tây.
v={0:'y+',1:'x+',2:'y-',3:'x-'}
Đây là nơi niềm vui bắt đầu.
Khi chúng ta đi lên phía bắc, Y tăng thêm 1. Vì vậy, từ điển này lấy 0 và đưa ra chuỗi 'y+'
, cho "tăng y". Nó cho kết quả tương tự cho các hướng khác: y hoặc x theo sau là + hoặc -.
Chúng tôi sẽ trở lại với điều này.
for c in raw_input():
m=v[d]
exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
Tôi đã đi đến tự do của việc vô ý hóa điều này một chút.
Đối với mỗi ký tự trong dòng đầu vào thứ hai, chúng tôi làm hai việc. Đầu tiên, chúng tôi đặt biến m
thành bất cứ từ điển nào từ trước cho chúng tôi hướng đi hiện tại. Không có lý do gì chúng ta cần điều này xảy ra mọi lúc, nhưng nó dễ hơn là làm cho nó xảy ra khi chúng ta cần nó.
Tiếp theo, chúng ta tạo ra một danh sách với ba yếu tố: 'd+'
, 'd-'
, và m
. LƯU Ý CỦA EDITOR: Tôi nghĩ rằng tôi có thể thoát khỏi việc không sử dụng biến m
. Tôi nghĩ rằng tôi chỉ có thể đưa v[d]
vào danh sách trực tiếp. Điều đó sẽ tiết kiệm cho tôi một vài byte nếu nó hoạt động, nhưng tôi không muốn thử nghiệm nó cho đến khi tôi thực hiện giải thích này để bạn có thể giải quyết. (Đúng, nó đã hoạt động.)
Chúng tôi tìm ký tự hiện tại của đầu vào trong chuỗi 'RL'. str.find
trả về -1 nếu nó không tìm thấy ký tự, vì vậy, điều này chuyển đổi R thành 0, L thành 1 và bất cứ điều gì khác thành -1. Tất nhiên, đầu vào duy nhất khác mà chúng ta có thể có là M, nhưng nó ít ký tự hơn để làm cho nó hoạt động cho mọi thứ.
Chúng tôi sử dụng số đó làm chỉ mục cho danh sách chúng tôi đã tạo. Các chỉ số danh sách Python bắt đầu ở cuối nếu chúng âm tính, vì vậy chúng tôi nhận được phần tử đầu tiên nếu đầu vào là R, thứ hai nếu là L và cuối cùng nếu đó là M. Để thuận tiện, tôi sẽ giả định rằng chúng ta đang hướng về phía bắc, nhưng một nguyên tắc tương tự được áp dụng cho các hướng khác.
Các giá trị có thể chúng tôi làm việc là 'd+'
cho R, 'd-'
cho L và 'y+'
cho M. Sau đó, chúng tôi đính kèm '=1;d=d%4'
vào cuối của mỗi giá trị. Điều đó có nghĩa là các giá trị có thể của chúng tôi là ...
d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4
Đó là mã trăn hợp lệ! Đó là mã python hợp lệ thực hiện chính xác những gì chúng ta muốn làm cho mỗi ký tự đầu vào đó! (Phần này d=d%4
chỉ giữ cho hướng đi của chúng ta lành mạnh. Một lần nữa, không cần phải làm điều đó mỗi lần, nhưng đó là ít ký tự hơn.)
Tất cả những gì chúng ta phải làm là thực thi mã chúng ta nhận được cho mỗi ký tự, in nó ra (chuyển hướng của chúng ta trở lại thành một chuỗi) và chúng ta đã hoàn thành!