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]
Saya sebenarnya sangat bangga dengan yang ini.
Penjelasan
Pertama, mari kita bersihkan kekacauan ini. Saya menggunakan titik koma alih-alih jeda baris di banyak tempat karena saya pikir itu membuat saya keren. Ini biasanya (ini masih 197 byte, itu belum ungolfed sama sekali). Ya, masih ada tanda titik koma, tetapi yang sebenarnya menyimpan 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]
Mari kita mulai!
q='NESW'
Pertama kita mendefinisikan q
sebagai string 'NESW'
. Kami menggunakannya dua kali kemudian, danlen("q='NESW';qq") < len("'NESW''NESW'")
.
x,y,d=raw_input().split(',')
Di sini kita membagi baris pertama dari inpupt pada setiap koma. Koord x kami disimpan di x
, y di y
, dan huruf pertama dari arah kami did
.
x=int(x)
y=int(y)
Kemudian kita hanya membuat ints coords. (Saya terkejut bahwa saya tidak bisa memikirkan cara yang lebih baik untuk mengubah dua string menjadi int. Saya mencobax,y=map(int,(x,y))
tetapi ternyata lebih lama.)
d=q.find(d)
Ini mengubah arah kami menjadi bilangan bulat. 0 di utara, 1 di timur, 2 di selatan dan 3 di barat.
v={0:'y+',1:'x+',2:'y-',3:'x-'}
Di sinilah kesenangan dimulai.
Ketika kita pergi ke utara, Y bertambah 1. Jadi kamus ini mengambil 0 dan memberikan string 'y+'
, untuk "tambah y". Ini memberikan hasil yang serupa untuk arah lain: y atau x diikuti oleh + atau -.
Kami akan kembali ke sini.
for c in raw_input():
m=v[d]
exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
Saya sudah pergi sedikit kebebasan untuk tidak mengasingkan yang satu ini.
Untuk setiap karakter pada input baris kedua, kami melakukan dua hal. Pertama, kita atur variabelnyam
ke kamus apa pun dari sebelumnya memberi kita untuk arah kita saat ini. Tidak ada alasan kita membutuhkan ini terjadi setiap saat, tetapi itu lebih mudah daripada mewujudkannya ketika kita membutuhkannya.
Berikutnya, kami membuat daftar dengan tiga elemen: 'd+'
, 'd-'
, dan m
. CATATAN EDITOR: Saya pikir saya bisa lolos dengan tidak menggunakan variabel m
sama sekali. Saya pikir saya bisa langsung memasukkannya ke v[d]
dalam daftar. Itu akan menyelamatkan saya beberapa byte jika berhasil, tapi saya tidak ingin mengujinya sampai saya selesai penjelasan ini sehingga kalian semua bisa berurusan.(Yap, itu berhasil.)
Kami mencari karakter input saat ini di string 'RL'. str.find
mengembalikan -1 jika tidak menemukan karakter, jadi ini mengubah R ke 0, L ke 1 dan apa pun ke -1. Tentu saja, satu-satunya input lain yang dapat kita miliki adalah M, tetapi lebih sedikit karakter untuk membuatnya bekerja untuk semuanya.
Kami menggunakan nomor itu sebagai indeks untuk daftar yang kami buat. Indeks daftar python dimulai pada akhirnya jika negatif, jadi kita mendapatkan elemen pertama jika inputnya adalah R, yang kedua jika itu adalah L, dan yang terakhir jika itu adalah M. Demi kenyamanan, saya akan berasumsi bahwa kita menghadap ke utara, tetapi prinsip serupa berlaku untuk arah lain.
Nilai-nilai yang mungkin kami kerjakan adalah 'd+'
untuk R, 'd-'
untuk L dan 'y+'
untuk M. Kemudian, kami lampirkan '=1;d=d%4'
di akhir masing-masing. Itu berarti kemungkinan nilai kami adalah ...
d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4
Itu kode python yang valid! Itu kode python valid yang melakukan persis apa yang ingin kita lakukan untuk masing-masing karakter input! (Bagian ini d=d%4
membuat arahan kita tetap waras. Lagi-lagi, tidak perlu melakukannya setiap saat, tapi itu kurang karakter.)
Yang harus kita lakukan adalah mengeksekusi kode yang kita dapatkan untuk setiap karakter, mencetaknya (mengubah arah kita kembali ke string), dan kita selesai!