Jadilah Navigator Saya

8

Oh tidak, saya tersesat dalam perjalanan untuk menemukan harta karun besar Marakov! Dan yang saya miliki hanyalah instruksi tidak berguna ini yang terlihat seperti S10R10D30... Saya tidak tahu apa artinya! Bisakah kamu membantuku?

Tantangan

Diberikan arahan yang terdiri dari N E S W U D L R 1 2 3 4 5 6 7 8 9 0, output seberapa jauh saya akan berasal dari tempat saya mulai ketika saya mengikuti arahan itu (yaitu Euclidean Distance).

N E S W lihat saya berbelok ke Utara, Timur, Selatan, dan Barat;

U D L Rlihat saya memutar Atas, Bawah, Kiri, dan Kanan (Jadi NRsama dengan E, dan begitu juga SL; SLLsama dengan N). Naik berarti terus maju; Turun berarti berbalik.

Setelah setiap arah huruf akan menjadi angka, yang sejauh mana saya akan pergi ke arah itu. N10E20berarti pergi ke Utara 10 unit, lalu berbelok ke Timur, dan pergi ke Timur 20 unit.

Detail Input

  • Input akan selalu dimulai dengan salah satu NESW(jadi input kosong tidak perlu dipertanggungjawabkan).
  • Dua instruksi surat berturut-turut diizinkan. NEharus ditafsirkan, "Belok Utara, lalu segera belok Timur". Itu sama dengan adil E. SLLadalah "Belok Selatan, lalu segera belok Kiri dua kali". Itu sama dengan N.
  • Semua angka akan berupa bilangan bulat (perhatikan bagaimana .tidak ada dalam rangkaian karakter)
  • Input hanya akan terdiri dari NESWUDLR1234567890(Jika perlu sesuatu yang lain, seperti '\ 0' dalam C; atau jika fungsi input bahasa Anda memiliki baris tambahan, atau sesuatu, itu bagus.)

Keluaran

  • Norma.
  • Jika menggunakan fungsi, harus menampilkan data numerik atau string.
  • Harus akurat hingga 3 tempat desimal.

Uji Kasus

  • N10: 10
  • N10E10: 14.1421
  • N10S10: 0
  • NSEWUDLR10: 10
  • N100RR20E300D40L12: 268.7452
  • ERR10LL20UN30D100: 70.71067

Program Python yang tidak imajinatif yang saya gunakan untuk membuat ini.

Kemenangan

Ini codegolf, byte terendah setelah seminggu menang!

Quelklef
sumber
@ AdmBorkBork Right. Biar saya edit.
Quelklef
Terkait
AdmBorkBork
@ AdmBorkBork Juga ini , tetapi semua sedikit berbeda.
Quelklef
Bisakah kita menganggap input hanya terdiri dari NESWUDLR1234567890?
darrylyeo
@ Darrylyeo Tentu, izinkan saya mengedit.
Quelklef

Jawaban:

2

(Pergi) Ruby , 111 byte

x=0
c=1,1i,-1,-1i
gs.sc(/(\w)(\d*)/){|o,a|x+=c.ro!('URDL'.ix(o)||'NESW'.ix(o)+c.ix(1)).fs*a.toi}
p Mh::hy *x.rc

Cobalah online!

Mengambil input pada STDIN, mengeluarkannya pada STDOUT.

Pada dasarnya, pendekatan ini menggunakan bilangan kompleks untuk menyimpan posisi saat ini, serta tumpukan ( c), yang mengandung offset untuk setiap arah. Jika arah dalam URDL, tumpukan diputar oleh indeks arah dalam string itu; jika arah dalam NESW, itu diputar oleh indeks arah dalam string itu, ditambah indeks 1dalam tumpukan. Ini mengubah rotasi relatif ke posisi saat ini menjadi rotasi relatif ke posisi 1. Dalam keadaan apa pun, bagian atas tumpukan dikalikan dengan jumlah langkah dalam arah dan ditambahkan ke posisi saat ini.

Pengawas
sumber
Apa itu "(Pergi) Ruby"?
Carcigenicate
@Carcigenicate Ini Ruby, di mana penerjemah telah dikompilasi dengan bendera khusus yang membuatnya lebih cocok untuk bermain golf. Di antara perubahan lain, ini memungkinkan Anda untuk menyingkat nama metode, dan mengubah perilaku bawaan tertentu. Jika Anda mengunjungi tautan TiO saya, Anda akan melihat kode di header, yang merupakan sebagian besar perubahan yang dilakukan.
Tutleman
4

Python 3 , 137 byte

v=n=0
d=1
for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
print(abs(v))

Cobalah online!

-9 byte terima kasih kepada Jonathan Allan

HyperNeutrino
sumber
Anda dapat menyimpan enam byte dengan klausa lain: else:v+=d*n;n=0;h='NUERSDW'.find(i);d=d**(h%2)*1j**(~-h/2)- catatan yang Ldapat dipotong dari ujung string yang ditemukan di sini karena -1%2sama dengan 7%2dan 1j**(-1)sama dengan 1j**3.
Jonathan Allan
@Jonathan Allan Trik yang bagus! Terima kasih!
HyperNeutrino
Simpan tiga lainnya dengan menguraikan untuk:for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
Jonathan Allan
@ JonathanAllan Hei keren, terima kasih!
HyperNeutrino
Mencoba sendiri dengan jawaban Python, tidak bisa mencapai di bawah 179 byte. Bravo.
Quelklef
2

JavaScript (ES6), 148 142 140 138 137 134 byte

s=>s.replace(/\d+|./g,_=>~(i='NESW'.search(_))?d=i:~(i='URDL'.search(_))?d+=i:a[d&3]+=+_,a=[0,0,0,0])&&Math.hypot(a[1]-a[3],a[0]-a[2])

-2 byte: Gunakan .search()alih-alih .indexOf()( @Shaggy )

-1 byte: Atur ulang program untuk menghapus tanda kurung terlampir ( @Shaggy )

-3 byte: Gunakan .replace()sebagai ganti .match().map()( @ThePirateBay )

Darrylyeo
sumber
Kami mendapatkan jawaban berbeda untuk tes kedua hingga terakhir.
Quelklef
@Quelklef Diperbaiki.
darrylyeo
Bisakah Anda menyimpan beberapa byte menggunakan searchbukan indexOf?
Shaggy
Saya pikir Anda juga dapat menyimpan byte dengan pindah ake map, mengganti ,sebelumnya Mathdengan &&dan menghapus tanda kurung terlampir.
Shaggy
@Shaggy Luar Biasa, terima kasih!
darrylyeo
0

Perl 5 , 149 + 1 (-p) = 150 byte

while(s/(\D+)(\d+)//){$p=/N/?0:/E/?1:/S/?2:/W/?3:/L/?$p-1:/R/?$p+1:/D/?$p+2:$p for split//,$1;$m[$p%4]+=$2}$_=sqrt(($m[0]-$m[2])**2+($m[1]-$m[3])**2)

Cobalah online!

Dijelaskan:

# Each direction is assigned a number:
#
#     0     North
#     1     East
#     2     South
#     3     West
#
# Variables:
#     $p     present direction
#     @m     total movement in each direction
# Inside loop:
#     $1     a set of direction instructions
#     $2     distance

while(s/(\D+)(\d+)//)    # Remove and preserve the first direction set and distance
   for split//,$1        # Loop through individual letters to set new direction
      $p=/N/?0:          # North
         /E/?1:          # South
         /S/?2:          # East
         /W/?3:          # West
         /L/?$p-1:       # Turn left
         /R/?$p+1:       # Turn right
         /D/?$p+2:       # Turn around
         $p              # Do not change direction
   $m[$p%4]+=$2          # Add the directional movement to previous movements

   $_=sqrt(              # Calculate distance
       ($m[0]-$m[2])**2  # Net North/South movement
      +($m[1]-$m[3])**2  # Net East/West movement
      )
Xcali
sumber