Manhattan khoảng cách của chuỗi luân chuyển


9

Tôi mặc dù đây sẽ là một thử thách tốt: http://adventofcode.com/2016/day/1

Mô tả công việc

Đưa ra một chuỗi các phép quay và khoảng cách theo mẫu (L | R) [1-9] [0-9] *, đưa ra khoảng cách manhattan giữa điểm bắt đầu và điểm kết thúc, đó là số lượng tối thiểu di chuyển dọc và ngang một tấm lưới.

Ví dụ

Ví dụ: nếu chúng tôi cho rằng bạn bắt đầu đối mặt với Bắc:

Theo sau R2, L3 để lại cho bạn 2 khối Đông và 3 khối Bắc, hoặc 5 khối. R2, R2, R2 để lại cho bạn 2 khối do Nam của vị trí bắt đầu của bạn, cách đó 2 khối. R5, L5, R5, R3 cách bạn 12 khối.

Chi tiết kỹ thuật

Bạn có thể chọn dấu phân cách giữa các lần di chuyển (ví dụ: "\ n", "," hoặc ","). Bạn phải đưa ra câu trả lời dưới dạng một số nguyên trong cơ sở 10.

Không phải là một bản sao!

Nó không phải là một bản sao vì nhiều lý do:

  • Các động thái không giống nhau. Ở đây họ là luân chuyển , không phải là hướng.
  • Tôi muốn khoảng cách Manhattan, không phải là eidianidian.

3
Bạn nên bao gồm một mô tả về khoảng cách Manhattan trong câu hỏi của bạn. Chỉ cần đăng một liên kết là loại khó khăn.
Gabriel Benamy

2
Nó rất khác! Chúng tôi chỉ có luân chuyển!
Labo

1
@Labo tôi đồng ý. Nó không chỉ là về thực tế rằng câu trả lời ở đây là ở khoảng cách Manhattan trong khi câu trả lời khác là ở khoảng cách Euclide. Cái này có chuyển động theo kiểu rùa trong khi cái còn lại chỉ định hướng la bàn NSEW (thực tế là nó gọi chúng là UDLR là không liên quan.)
Level River St

2
Vui lòng sử dụng Hộp cát trong tương lai để nhận phản hồi về các thách thức của bạn trước khi đăng chúng lên trang web chính.
Mego

2
@Labo Điều đó tốt, chúng tôi không mong đợi người dùng mới biết tất cả thông tin chi tiết về trang web này ngay lập tức. Đó chỉ là một gợi ý nhẹ nhàng cho lần tới. :)
Mego

Câu trả lời:


4

Python 3, 109 99 104 101 byte

Đây là một câu trả lời đơn giản sử dụng các số phức, với đầu vào là một chuỗi được phân tách bằng dấu cách hoặc một chuỗi được phân tách bằng dòng mới. Gợi ý chơi golf chào mừng!

Chỉnh sửa: -13 byte nhờ Labo. +5 byte để chuyển đổi thành int.

d=p=0
for r in input().split():d+=1-2*(r<'R');p+=1j**d*int(r[1:])
print(int(abs(p.real)+abs(p.imag)))

Ungolfing

def manhattan_rotation(seq, nsew=0, pos = 0):
    for rot in seq.split():
        # change direction
        if rot[0] == "L":
            nsew += -1 
        else:
            nsew += 1
        # move in that direction rot[1:] times
        pos += 1j ** nsew * int(rot[1:])
    return int(abs(pos.real)+abs(pos.imag))

1-2 * (r [0] <'R') sẽ giúp bạn tiết kiệm 2 byte :)
Labo

Đừng tạo một chức năng, đọc từ đầu vào làm cho bạn tiết kiệm nhiều ký tự hơn!
Labo

Gán 2 biến trong cùng một dòng để lưu 2 byte: d = p = 0
Labo

Tôi đánh gôn lại câu trả lời của bạn và nó tạo ra 99 ký tự! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo

2
@Labo Tôi không chắc bạn có thể chỉnh sửa thông số kỹ thuật theo cách có thể làm mất hiệu lực các câu trả lời hiện có, nhưng hãy để tôi hỏi một số mod.
Sherlock9

2

PHP, 93 byte

while($m=$argv[++$i])${chr(80|3&$d+=(P<$m)-(M>$m))}+=substr($m,1);echo abs($P-$R)+abs($Q-$S);

phá vỡ

while($m=$argv[++$i])       // loop through arguments:
    ${                      // 5. use as variable name
        chr(                // 4. cast to character (P,Q,R,S) 
        80|                 // 3. add 80
        3&                  // 2. modulo 4
        $d+=(P<$m)-(M>$m)   // 1. change direction depending on letter
    )}+=substr($m,1);       // 6. add number to variable
echo abs($P-$R)+abs($Q-$S); // calculate distance, print

2

Python 2, 86 byte

x=y=0
for d in input().split():c=cmp(d,'M');x,y=int(d[1:])-y*c,x*c
print abs(x)+abs(y)

Theo dõi hiện tại xytọa độ. Khi rẽ, thay vì cập nhật hướng, hãy xoay giá trị hiện tại để chuyển động luôn theo hướng x dương. Số phức quá tốn kém để trích xuất tọa độ từ.


1

Python 2, 103 102 byte

l=c=0
for i in input().split():c+=cmp(i[0],'N');l+=1j**c*int(i[1:])
print int(abs(l.imag)+abs(l.real))

thay thế

Đầu vào là một chuỗi các hướng phân cách không gian, ví dụ "R5 L5 R5 R3".
In ra khoảng cách Manhattan giữa vị trí bắt đầu và điểm đến.

Làm sao?

Bắt đầu từ nguồn gốc của mặt phẳng phức , l=0;

Với một bộ đếm rẽ phải quý tích lũy , c=0;

Đối với mỗi lệnh, iphép quay được phân tích cú pháp bằng cách so sánh ký tự đầu tiên của hướng với ký tự 'N'cđược điều chỉnh tương ứng.

Khoảng cách để di chuyển được phân tích cú pháp int(i[1:])và hướng dẫn được ban hành bằng cách thực hiện nhiều bước có kích thước khối theo hướng được đưa ra bằng cách lấy csức mạnh thứ của 0+1jvới 1j**c.

Khoảng cách Manhattan cuối cùng là tổng khoảng cách tuyệt đối từ gốc tọa độ theo hai hướng - tưởng tượng và thực tế; đạt được vớiabs(l.imag)+abs(l.real)


1
@ Sherlock9 - Ồ, um trả lời hội tụ. Lưu 2 byte bằng cách chuyển sang Python 2 và sử dụng cmpnhư câu trả lời của tôi, cho tôi biết và tôi sẽ xóa.
Jonathan Allan

0

JavaScript (ES2016), 98 100

Đã lưu 2 byte thx @Neil

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x*x)**.5+(y*y)**.5

100 byte cho ES6

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

Ít chơi gôn

d => d.replace(/.(\d+)/g,
  (d,l)=>( // L or R in d, distance in l
    o += d>'M' || 3, // orientation in o, used %4
    l *= ~-(o&2), // convert to number and change sign if needed
    o&1 ? x -= l : y += l // move based on orientation
  ), x = y = o = 0)
&& (x>0?x:-x) + (y>0?y:-y)

Kiểm tra (ES6)

F=
d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

function update() {
  O.textContent=F(I.value)
}

update()
<input id=I value='R5, L5, R5, R3' oninput='update()'><pre id=O></pre>


1
Câu trả lời ES6 của tôi ban đầu là 106 byte; sao chép biến trung gian của bạn tiết kiệm cho tôi 3 byte; chuyển từ trận đấu để thay thế đã cứu tôi 2 byte của bạn, và sao chép của bạn xử lý các định hướng và khoảng cách cùng một lúc đã cứu tôi một byte cuối cùng, kết quả là đây: s=>s.replace(/.(\d+)/g,(c,n)=>(d+=c<'R'||3,n*=~-(d&2),d&1?x+=n:y+=n),x=y=d=0)&&(x<0?-x:x)+(y<0?-y:y), mà bây giờ là hai byte ngắn hơn câu trả lời ES6 của bạn, nhờ vào sự c<'R'||3n*=~-(d&2)thủ đoạn .
Neil
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.