Hãy là người dẫn đường của tôi


8

Ôi không, tôi đang lạc lối trên con đường tìm kiếm kho báu vĩ đại của Marakov! Và tất cả những gì tôi có là những hướng dẫn vô dụng này trông giống như S10R10D30... tôi không biết ý nghĩa của chúng! Bạn có thể giúp tôi được không?

Thử thách

Đưa ra các hướng bao gồm N E S W U D L R 1 2 3 4 5 6 7 8 9 0, đầu ra tôi sẽ đi được bao xa từ nơi tôi bắt đầu khi tôi đi theo các hướng đó (tức là Khoảng cách Euclide).

N E S W đề cập đến tôi quay về hướng Bắc, Đông, Nam và Tây;

U D L Rđề cập đến tôi lần lượt lên, xuống, trái và phải ( NRCũng giống như vậy E, và cũng vậy SL; SLLgiống như N). Lên có nghĩa là tiếp tục tiến lên; Xuống có nghĩa là quay lại.

Sau mỗi hướng chữ cái sẽ là một con số, đó là khoảng cách tôi sẽ đi theo hướng đó. N10E20nghĩa là đi về phía Bắc 10 đơn vị, rồi quay về hướng Đông, và đi về phía Đông 20 đơn vị.

Chi tiết đầu vào

  • Đầu vào sẽ luôn bắt đầu bằng một trong NESW(vì vậy không cần tính đến đầu vào trống).
  • Hai hướng dẫn thư liên tiếp được cho phép. NEnên được giải thích, "Quay về hướng Bắc, rồi lập tức quay về hướng Đông". Nó giống như chỉ E. SLLlà "Rẽ về phía Nam, sau đó lập tức rẽ trái hai lần". Nó giống như N.
  • Tất cả các số sẽ là số nguyên (lưu ý cách .không có trong bộ ký tự)
  • Đầu vào sẽ chỉ bao gồm NESWUDLR1234567890(Nếu nó cần thứ gì khác, như '\ 0' trong C; hoặc nếu các chức năng nhập ngôn ngữ của bạn có dòng mới, hoặc một cái gì đó, thì tốt.)

Đầu ra

  • Các chỉ tiêu.
  • Nếu sử dụng hàm, nên xuất kiểu dữ liệu số hoặc chuỗi.
  • Phải chính xác đến 3 chữ số thập phân.

Các trường hợp thử nghiệm

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

Chương trình Python không tưởng tượng mà tôi đã sử dụng để thực hiện những điều này.

Chiến thắng

Đây là codegolf, vì vậy byte thấp nhất sau một tuần sẽ thắng!


@AdmBorkBork Đúng. Hãy chỉnh sửa.
Quelklef


@AdmBorkBork Cũng vậy , nhưng tất cả đều hơi khác nhau.
Quelklef

Chúng ta có thể giả sử đầu vào chỉ bao gồm NESWUDLR1234567890?
darrylyeo

@darrylyeo Chắc chắn, để tôi chỉnh sửa.
Quelklef

Câu trả lời:


2

(Đi) 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

Hãy thử trực tuyến!

Lấy đầu vào trên STDIN, đầu ra trên STDOUT.

Về cơ bản, cách tiếp cận này sử dụng các số phức để lưu trữ vị trí hiện tại, cũng như ngăn xếp ( c), chứa các giá trị bù cho mỗi hướng. Nếu một hướng nằm trong URDL, ngăn xếp được xoay theo chỉ số của hướng trong chuỗi đó; nếu hướng vào NESW, nó được xoay theo chỉ số của hướng trong chuỗi đó, cộng với chỉ số của 1ngăn xếp. Điều này biến đổi một vòng quay tương ứng với vị trí hiện tại thành một vòng quay so với vị trí của 1. Trong mọi trường hợp, đỉnh của ngăn xếp được nhân với số bước theo hướng và được thêm vào vị trí hiện tại.


"(Đi) Ruby" là gì?
Carcigenicate

@Carcigenicate Đó là Ruby, nơi trình thông dịch đã được biên soạn với một lá cờ đặc biệt giúp nó phù hợp hơn cho việc chơi gôn. Trong số các thay đổi khác, nó cho phép bạn viết tắt tên phương thức và thay đổi hành vi của các phần dựng sẵn nhất định. Nếu bạn truy cập liên kết TiO của tôi, bạn sẽ thấy mã trong tiêu đề, phần lớn các thay đổi được thực hiện.
Người hướng dẫn

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))

Hãy thử trực tuyến!

-9 byte nhờ Jonathan Allan


Bạn có thể lưu sáu byte với mệnh đề khác: else:v+=d*n;n=0;h='NUERSDW'.find(i);d=d**(h%2)*1j**(~-h/2)- lưu ý rằng Lcó thể bị mất ở cuối chuỗi tìm kiếm ở đây vì -1%2bằng 7%21j**(-1)bằng 1j**3.
Jonathan Allan

@Jonathan ALLan Thủ thuật hay! Cảm ơn!
HyperNeutrino

Cứu ba người khác bằng cách nội tuyến cho: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

@Jonathan ALLan Này tuyệt, cảm ơn!
HyperNeutrino

Đã thử tay của tôi với câu trả lời của Python, không thể có được dưới 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: Sử dụng .search()thay vì .indexOf()( @Shaggy )

-1 byte: Sắp xếp lại chương trình để loại bỏ dấu ngoặc đơn kèm theo ( @Shaggy )

-3 byte: Sử dụng .replace()thay vì .match().map()( @ThePirateBay )


Chúng tôi đang nhận được câu trả lời khác nhau cho bài kiểm tra thứ hai đến cuối cùng.
Quelklef

@Quelklef Đã sửa.
darrylyeo

Bạn có thể lưu một vài byte bằng cách sử dụng searchthay vì indexOf?
Shaggy

Tôi nghĩ bạn cũng có thể lưu một byte bằng cách di chuyển avào map, thay thế ,trước Mathbằng &&và loại bỏ các dấu ngoặc đơn kèm theo.
Shaggy

@Shaggy Tuyệt vời, cảm ơn!
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)

Hãy thử trực tuyến!

Giải thích:

# 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
      )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.