Di mana saya sekarang?
Diberikan string d
, yang hanya berisi surat-surat NSWE
, menentukan koordinat yang telah saya tempuh (dari kiri ke kanan, mengonsumsi rakus) dan koordinat terakhir tempat saya tinggal.
Aturan untuk membaca koordinat dari kiri ke kanan:
- Jika karakter selanjutnya adalah
N
atauS
:- Jika karakter setelah
N
atauS
yang lainN
atauS
:- Hanya mengkonsumsi yang pertama
N
atauS
. - Output
[0,1]
untukN
- Output
[0,-1]
untukS
- Hanya mengkonsumsi yang pertama
- Jika karakter setelah
N
atauS
adalahW
atauE
:- Mengkonsumsi baik
N
atauS
danW
atauE
. - Output
[1,1]
atau[-1,1]
untukNE
danNW
, masing-masing. - Output
[1,-1]
atau[-1,-1]
untukSE
danSW
, masing-masing.
- Mengkonsumsi baik
- Jika karakter setelah
- Jika karakternya adalah
E
atauW
tidak didahului olehS
atauN
:- Mengkonsumsi
E
atauW
. - Output
[1,0]
untukE
. - Output
[-1,0]
untukW
.
- Mengkonsumsi
Contoh yang berhasil
NSWE
[0,1] (North N)
[-1,-1] (South-west SW)
[1,0] (East E)
[0,0] (N+SW+E = Didn't actually move)
Catatan ini bisa dalam format apa pun, berikut adalah contoh lain dari output yang valid:
[[0,1],[-1,-1],[1,0],[0,0]]
[[[0,1],[-1,-1],[1,0]],[0,0]]
"0,1\n0,-1\n-1,0\n1,0\n0,0"
Dll ...
Lebih banyak contoh
SWSENNESWNE
[-1,-1]
[1,-1]
[0,1]
[1,1]
[-1,-1]
[1,1]
[1,0]
NNEESESSWWNW
[0,1]
[1,1]
[1,0]
[1,-1]
[0,-1]
[-1,-1]
[-1,0]
[-1,1]
[0,0]
NENENEE
[1,1]
[1,1]
[1,1]
[1,0]
[4,3]
NEN
[1,1]
[0,1]
[1,2]
EEE
[1,0]
[1,0]
[1,0]
[3,0]
Aturan
- Anda dapat menampilkan dalam format apa pun yang nyaman yang tidak melanggar celah.
- Anda harus mengkonsumsi dengan rakus,
NWE
tidak pernahN,W,E
, selaluNW,E
.- Hal ini berlaku untuk:
SW*
,SE*
,NW*
,NE*
. - Anda mengkonsumsi dari kiri ke kanan, rakus.
- Hal ini berlaku untuk:
- Ini adalah kode-golf , byte-count terendah yang menang.
[4, 3]
atau lebih akan membuatnya sedikit lebih mudah untuk melihat apa yang terjadi pada output test.1
,-1j
,(-1+1j)
dll format output yang valid?NE
hanyaN+E
tidak itu tidak masalah?Jawaban:
Python 2 , 116 byte
Cobalah online!
Dengan output sebagai
[(3+4j), 1, -1j, …]
, 91 byteCobalah online!
Lambda ini mengembalikan daftar bilangan bulat Gaussian : yang pertama adalah koordinat terakhir, dan semua yang lain adalah langkah-langkah yang diperlukan untuk sampai di sana.
sumber
Attache , 80 byte
Cobalah online!
Ini adalah fungsi anonim yang mengambil satu argumen string.
Penjelasan
Tugas pertama adalah mengimplementasikan fase parsing dari pertanyaan ini. Saya merasa terpendek untuk menggunakan Regex sederhana untuk mengurai input (
_
):Ini cocok dengan semua kemunculan regex
[NS][WE]|.
, seperti terlihat pada banyak jawaban lainnya. Ini dengan rakus menghasilkan arah yang diminta.Sekarang, kita akan menerapkan fungsi hash untuk setiap direciton. Kami mengambil codepoint dari setiap arah dan menjumlahkannya. Ini memberikan pemetaan berikut:
Kami akan mencoba memetakan nilai-nilai ini ke domain yang lebih kecil; modulo berguna untuk ini, dan kami dapat menunjukkan bahwa modulo terkecil yang menghasilkan nilai unik untuk semua input yang diberikan adalah 11. Mengurutkan berdasarkan sisa, ini memberi kita tabel berikut:
Sekarang, kami memiliki korespondensi input, sebagai penyandian oleh
Sum@Ords=>[...]%11
. Selanjutnya, kita harus mengubah sisa ini menjadi poin. Kami akan mencoba untuk menurunkan pemetaan lain, yang berarti memasukkan "nilai pengisian jarang" ke hash yang tidak sesuai dengan arah akan berguna:Saat ini kami memiliki serangkaian poin, yang dapat memberikan daftar diindeks oleh hash:
Sekarang, kita akan mengompres ini, mengingat bagaimana ini hanya terdiri dari
-1
s,0
s, dan1
s. Karena daftar mewakili pasangan, kami dapat meratakan daftar tanpa kehilangan data. Kemudian, jika kita mengambil setiap angkax
dan menghitung1-x
, kita mendapatkan daftar berikut:Kami dapat mengonversinya menjadi nomor basis 3:
Konversi ke basis 10:
Untuk meringkas, kami telah mengambil poin kami, un-berpasangan, mengambil setiap elemen dikurangi
1
, dan dikonversi dari basis3
, memberi kami22260446188
. Kita dapat mendekompres seperti itu:ToBase[22260446188,3]
1-ToBase[22260446188,3]
Chop[1-ToBase[22260446188,3],2]
Ini memberi kita set pasangan asli kita. Kemudian, kita dapat melakukan pengindeksan yang disebutkan di atas seperti ini:
Karena, di Attache, pengindeksan oleh array mengembalikan semua elemen yang sesuai dengan indeks tersebut. (Jadi
[1,2,3,4][ [0,0,-1,1] ] = [1,1,4,2]
,.) Sekarang, kita memiliki arah jalan yang dilalui OP. Yang tersisa adalah menghitung jumlah.Jadi kami menangkap hasil ini dalam lambda
{...}
dan menempatkannya sebagai fungsi pertama dalam komposisi fungsi (a##b
), dengan yang keduaV#Sum
. Ini adalah garpu, yang, diberi inputx
, diperluas menjadi:Sum
, ketika diberi array 2D, terjadi untuk menjumlahkan setiap kolom dalam array (sebagai hasil penjumlahan vektor). Jadi, ini memasangkan arah dengan tujuan akhir, dan kami memiliki hasil akhir kami.sumber
JavaScript (ES6), 102 byte
Mengembalikan string.
Cobalah online!
sumber
MATL , 45 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan (dengan contoh)
Pertimbangkan input
'NSWE'
sebagai contoh.sumber
Java (JDK 10) , 171 byte
Cobalah online!
Penjelasan
Berkat
c=~-s[i]/6%4
, pemetaan berikut dilakukan:NS
diperiksa denganc<2
dan dipetakan ke+1
/-1
menggunakan1-c*2
;EW
diperiksa denganc>1
dan dipetakan ke+1
/-1
menggunakanc*2-5
.Kredit
sumber
Retina 0.8.2 , 93 byte
Cobalah online! Penjelasan:
Gandakan input.
Bagi salinan pertama menjadi arah.
Hapus garis kosong asing yang dibuat oleh proses di atas.
Ubah
W
menjadiJ
sedemikian rupa sehingga antaraE
danN
. (PindahE
ke antaraS
danW
juga akan bekerja.)Urutkan setiap baris ke dalam urutan.
Hapus pasangan dari arah yang berlawanan (ini hanya mempengaruhi baris terakhir saja).
Hitung jumlah gerakan horisontal dan vertikal, tambahkan tanda jika perlu.
Anda yang mengetahui perbedaan antara Retina 0.8.2 dan Retina 1 ingin menunjukkan bahwa saya dapat menyimpan 2 byte di Retina 1 karena menggunakan
*
alih-alih$*
. Sementara saya di sana saya mencoba untuk menyederhanakan proses pemisahan tetapi saya tidak dapat mengurangi jumlah byte lebih lanjut, saya hanya dapat menyamakannya dengan ini:sumber
Java 10,
269265243 byteJelas bukan bahasa yang tepat untuk tantangan ini ..
Cobalah online.
Penjelasan:
sumber
Perl 5
-n
, 94 byteCobalah online!
sumber
JavaScript (ES6), 102 byte
Mengembalikan string.
sumber
Ruby ,
7571 byteCobalah online!
-4 byte terima kasih kepada benj2240.
Karena mengembalikan bilangan kompleks tampaknya merupakan format output yang dapat diterima, saya kira itu tidak akan jauh lebih golf daripada hanya membuat port jawaban Lynn yang sangat bagus .
sumber
map
, meneruskan bloknya secara langsung kesum
: Coba online!F # (Mono) , 269 byte
Cobalah online!
sumber
NSWE
Anda saat keluaran(0,1)
,(-1,-1)
,(1,0)
, tapi output keempat harus menjadi jumlah dari koordinat, sehingga(0,0)
(karena0+-1+1 = 0
dan1+-1+0 = 0
).sed, 125
The mengambil kebebasan dengan format output versi:
Skor termasuk +1 untuk
-r
parameter untuk sed.Cobalah online .
Output adalah sebagai berikut:
A
karakter mewakili + ve integerlen(string)
a
karakter mewakili -ve integer-len(string)
0
Sebagai contoh:
,
adalah [0,0],AA
adalah [0,2]aaa,
adalah [-3,0]sed 4.2.2 termasuk ekstensi GNU exec , 147
The masuk akal format output versi:
Skor termasuk +1 untuk
-r
parameter untuk sed.Output diberikan sebagai koordinat yang dipisahkan ruang, satu per baris. Ada baris baru ekstra antara kedua dari belakang dan set akhir dari koordinat - tidak yakin apakah itu bermasalah atau tidak.
Cobalah online!
sumber
PHP, 153 byte
biarkan regex melakukan pemisahan; mengulangi pertandingan, mencetak dan meringkas hasil antara:
Jalankan sebagai pipa dengan
-nR
atau coba online .sumber
C (gcc) , 173 byte
Sangat menarik melakukan ini dalam bahasa tanpa dukungan regex!
Cobalah online!
sumber