Di chuyển mũi tên dọc theo một đường viền


28

Hộp cát

Cho một tập hợp các đường viền 2d không chồng chéo (cách nhau ít nhất một khoảng trống ngay cả trên các đường chéo) với các mũi tên được định hướng theo cùng chiều kim đồng hồ hoặc ngược chiều kim đồng hồ (mỗi đường viền có hướng riêng) và một số dương n, di chuyển các mũi tên ncác bước dọc theo các đường viền theo hướng tương ứng. Các mũi tên được thể hiện > v < ^tương ứng cho các hướng phải, xuống, trái và lên. Ở đó, các ký tự khác là -(ngang), |(dọc) và +(góc). Khi một mũi tên ở một góc, nó sẽ giữ hướng hiện tại và chỉ thay đổi sau khi rẽ.

Sẽ luôn có một đoạn thẳng (hoặc một khoảng trắng) giữa hai góc bất kỳ (như +-+đối với phương ngang và tương tự đối với phương thẳng đứng) - nói cách khác, các góc nhọn Ubị cấm. Các đoạn giữa các góc là dọc hoặc ngang và uốn cong ở một góc luôn là 90 độ.

Đầu vào:

  • một số nguyên dương - n- số bước
  • một đại diện ASCII của các đường viền - nó có thể là một chuỗi nhiều dòng, một danh sách các chuỗi, một danh sách các ký tự, v.v.

Đầu ra:

Các đường viền giống nhau với tất cả các mũi tên đã dịch chuyển ncác bước theo hướng chung của mỗi đường viền.

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

1.

Đầu vào:

n = 1

 +----->->            
 |       |            
 |       v---+        
 |           |        
 +---<-------+      

Đầu ra:

 +------>+
 |       v
 |       +>--+
 |           |
 +--<--------+

2.

Đầu vào:

n = 2

 +-----+ +---+        
 |     | |   |        
 +-->--+ |   v  
         |   | 
 +--->---+   |        
 |           |         
 +------<<---+       

Đầu ra:

 +-----+ +---+
 |     | |   |
 +---->+ |   |
         |   | 
 +----->-+   v
 |           |     
 +----<<-----+        

3.

Đầu vào:

n = 3

 +---+   +---+   +-------+      
 |   |   |   v   |       |      
 ^   |   |   |   +-<-+   |      
 |   |   ^   |       |   v      
 |   +---+   +-->----+   |      
 |                       |      
 |   +-------+   +---+   |      
 |   |       |   v   |   |      
 +---+       +---+   +---+      

Đầu ra:

 +>--+   ^---+   +-------+
 |   |   |   |   ^       |
 |   |   |   |   +---+   |
 |   |   |   |       |   |
 |   +---+   v----->-+   |
 |                       |
 |   +-------+   +---+   v 
 |   |       |   |   |   |
 +---+       +-<-+   +---+  

4.

Đầu vào:

n = 1

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

Đầu ra:

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

5.

Đầu vào

n = 4

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

Đầu ra:

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

6.

Đầu vào:

n = 1

^->
^ v
<<v

Đầu ra:

^>+
^ v
<<v

Viết một hàm hoặc một chương trình giải quyết các nhiệm vụ trên. Mã ngắn nhất tính bằng byte trong mọi ngôn ngữ sẽ thắng. Đừng nản lòng với các ngôn ngữ chơi gôn. Giải thích về thuật toán và mã được đánh giá cao.


Hai đường viền có thể chạm vào các góc của chúng trên một đường chéo, hoặc một đường viền chạm vào chính nó như vậy không?
xnor

4
"Cho một tập hợp các đường viền 2d không chồng chéo ... với các mũi tên được định hướng theo cùng chiều kim đồng hồ hoặc ngược chiều kim đồng hồ" đối với tôi giống như mọi đường viền được định hướng theo cùng một hướng, trong khi từ các trường hợp thử nghiệm, có vẻ như mũi tên chỉ nhất quán trong một đường viền.
xnor

3
@xnor Cảm ơn ý kiến ​​của bạn! - Không, các đường viền không được phép chạm vào nhau / chính nó trên một đường chéo. - Mỗi đường viền có directon riêng. Tôi sẽ cập nhật mô tả.
Galen Ivanov

2
Là đầu vào không có không gian giữa các bức tường có thể? Vd: Hãy thử trực tuyến! . Tôi biết bạn đã nói "cách nhau ít nhất một khoảng trắng" nhưng tôi không rõ liệu điều đó chỉ áp dụng cho các vòng độc lập hay nếu nó cũng áp dụng cho một vòng lặp.
Giô-na

1
@Jonah Không, không thể:There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Galen Ivanov

Câu trả lời:


14

JavaScript (ES6),  210 ... 182  180 byte

Lấy đầu vào là (m)(n), trong đó là danh sách các danh sách các ký tự. Trả về kết quả trong cùng định dạng.m

m=>g=n=>n?g(n-1,m=m.map((r,y)=>r.map((c,x)=>(i=0,h=$=>~$?(m[Y=y+($-2)%2]||0)[X=x+~-$%2]>h?"-|+"[n+=`;m[${Y}][${X}]=S[${$}]`,i?2:$&1]:h($^++i):c)((S="<^>v").indexOf(c)))),eval(n)):m

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

Làm sao?

Bạn có thể theo liên kết này để xem phiên bản được định dạng của nguồn.

Vỏ bánh

Hàm đệ quy chỉ được sử dụng như một trình bao bọc gọi mã chính để di chuyển tất cả các mũi tên theo 1 bước và tiếp tục gọi chính nó bằng cho đến .gn1n=0

Phương pháp cập nhật

Chúng ta không thể di chuyển từng mũi tên một cách an toàn vì chúng ta sẽ gặp rủi ro ghi đè các mũi tên không được cập nhật bằng các mũi tên được cập nhật. Thay vào đó, trước tiên chúng tôi loại bỏ tất cả các mũi tên và tính toán vị trí mới của chúng. Chúng tôi áp dụng các vị trí mới trong lần thứ hai.

Điều này được thực hiện bằng cách sử dụng lại dưới dạng chuỗi để lưu trữ các cập nhật vị trí dưới dạng mã JS.n

Chẳng hạn, trong trường hợp thử nghiệm đầu tiên, được đặt thành:n

"1;m[0][7]=S[2];m[1][8]=S[3];m[2][9]=S[2];m[4][3]=S[0]"

(Lưu ý rằng số dẫn đầu - là giá trị ban đầu của - là vô hại.)n

Các vị trí mới được áp dụng chỉ bằng cách làm eval(n).

Hướng

Mỗi mũi tên được chuyển đổi thành một hướng (có tên trong mã), sử dụng la bàn sau:d$

10+23

Các giá trị tương ứng của và được tính theo cách này:dxdy

 d | dx = (d - 1) % 2 | dy = (d - 2) % 2
---+------------------+------------------
 0 |        -1        |         0
 1 |         0        |        -1
 2 |        +1        |         0
 3 |         0        |        +1

Góc

Nếu ký tự tiếp theo theo hướng được xác định là khoảng trắng hoặc nằm ngoài giới hạn, điều đó có nghĩa là chúng ta nằm ở một góc và chúng ta cần quay 90 ° hoặc 270 °. Đây là lý do tại sao hàm trợ giúp đang thử nghiệm tối đa 3 hướng khác nhau: , và .hddxor1dxor3

Nếu chúng ta nằm ở một góc, chúng ta sẽ ghi đè lên ô +. Mặt khác, chúng tôi ghi đè lên nó bằng -hoặc |, tùy thuộc vào tính chẵn lẻ của .d

Lưu ý : Tham số của không được đặt tên chỉ vì nó trông uber l33t mà còn vì nó cho phép chúng ta so sánh một ký tự đã cho với (ngầm định bị ép buộc với một chuỗi) để biết đó có phải là khoảng trắng (bên dưới ), một ký tự đường viền (ở trên không ) hoặc một mũi tên khác (cũng ở trên ).hh$h"$""$""$"

Phiên bản hoạt hình


Cám ơn vì đã giải thích!
Galen Ivanov

8

K (ngn / k) , 183 161 157 byte

{A:"^>v<";D,:-D:(-1 0;!2);s:(#x;#*x);c:~^x;r:" -+|"c*+/'3'0,c,0;$[#p:+s\&~^t:A?,/x;;:r];q:q@'*'&'~^x ./:/:q:+p+/:D@4!(t^0N)+/:0 1 3;s#@[,/r;s/+q;:;A@D?q-p]}/

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

{ }/Khi được gọi với một int left arg n, điều này sẽ áp dụng hàm trong { }n lần cho arg phải

A:"^>v<" mũi tên

D,:-D:(-1 0;!2) ∆y, ∆x cho 4 hướng hồng y

s:(#x;#*x) hình dạng của đầu vào: chiều cao, chiều rộng

c:~^x Countours - ma trận boolean hiển thị nơi không phải là khoảng trắng

r:" -+|"c*+/'3'0,c,0tạo lại ma trận ký tự bằng một đếm nhưng không có mũi tên, bằng cách đếm self + trên + dưới cho mỗi ô trong cvà thay thế 1-> -, 2-> +, 3->|

t:A?,/xcác loại mũi tên: 0 1 2 3 cho ^>v<, tất cả các ô khác được biểu diễn dưới dạng 0N(null)

p:+s\&~^t tọa độ của các mũi tên

$[#p ;;:r] nếu không có mũi tên nào, hãy quay lại r

q:+p+/:D@4!(t^0N)+/:0 1 3 tất cả 3 vị trí mới có thể cho mỗi mũi tên - nếu nó tiếp tục tiến về phía trước, nếu nó rẽ trái và nếu nó rẽ phải

q:q@'*'&'~^x ./:/:q cho mỗi mũi tên, chọn tùy chọn đầu tiên nằm trên đường đếm

@[,/r;s/+q;:;A@D?q-p]làm phẳng rvà đặt trên đó các mũi tên ở vị trí mới của họ và với hướng mới của họ

s# định hình lại hình dạng ban đầu


2
Bạn nhanh thật! Tôi hy vọng bạn sẽ giải thích mã sau khi chơi xong nó.
Galen Ivanov

Cám ơn vì đã giải thích!
Galen Ivanov

4

Than , 105 byte

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ≔>^<vζPθFθ¿№ζι«⊞υ⟦⌕ζιⅉⅈ⟧§+|-↨EKV›κ ²»ιFυ«J⊟ι⊟ι≔⊟ιιFIη«≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ιM✳⊗黧ζι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Bao gồm 22 byte được sử dụng để tránh yêu cầu định dạng đầu vào cồng kềnh. Giải trình:

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ

Thuận tiện nhập các đường viền và số lượng các bước.

≔>^<vζ

Các ký tự hướng được sử dụng nhiều lần để chuỗi được lưu trữ ở đây. Chỉ số của một ký tự hướng trong chuỗi này được gọi là hướng của nó.

Pθ

In các đường viền gốc mà không di chuyển con trỏ.

Fθ

Lặp lại các ký tự trong đường viền.

¿№ζι«

Nếu các nhân vật hiện tại là một nhân vật chỉ đường ...

⊞υ⟦⌕ζιⅉⅈ⟧

... Sau đó lưu hướng và vị trí trong danh sách ...

§+|-↨EKV›κ ²

... và thay thế ký tự bằng ký tự dòng thích hợp.

»ι

Nếu không, xuất ký tự và chuyển sang ký tự tiếp theo.

Fυ«

Vòng qua các vị trí đã lưu.

J⊟ι⊟ι

Nhảy đến vị trí đã lưu.

≔⊟ιι

Trích xuất hướng lưu.

FIη«

Lặp lại số bước thích hợp.

≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ι

Tìm hướng của bước tiếp theo, đó là bất kỳ hướng nào không đảo ngược cũng không trống.

M✳⊗ι

Bước một bước theo hướng đó. (Chỉ số hướng than cho Movelệnh gấp đôi giá trị của hướng của tôi.)

»§ζι

In ký tự hướng thích hợp.


Cám ơn vì đã giải thích!
Galen Ivanov

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.