Thử thách này được lấy cảm hứng lỏng lẻo từ trò chơi Zachtronics Infinifactory .
Bạn được cung cấp một cái nhìn từ trên xuống của một lưới băng tải hình chữ nhật, được đại diện bởi >v<^
. Có thể có các ô không có băng tải, được biểu thị bằng khoảng trắng. Đây là một ví dụ:
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Thiết lập này được bao quanh hoàn toàn bởi một số lượng không gian vô hạn.
Hơn nữa, bạn được cung cấp kích thước của một mảnh hàng hóa hình chữ nhật được đặt trên băng tải ở góc trên cùng bên trái của lưới. Nhiệm vụ của bạn là tìm hiểu xem hàng hóa có bao giờ dừng lại hay liệu cuối cùng nó sẽ di chuyển trong một vòng lặp.
Tất nhiên, hàng hóa có khả năng bao phủ một số băng tải cùng một lúc, vì vậy đây là các quy tắc để tìm ra hướng của hàng hóa trong mỗi bước:
Băng tải đối diện triệt tiêu lẫn nhau. Vì vậy, nếu một hàng hóa 3x2 bao gồm bất kỳ bản vá nào sau đây (được phác thảo bằng dấu gạch nối và đường ống cho rõ ràng), kết quả sẽ giống nhau:
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
Điều tương tự cũng xảy ra với những điều này:
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
Vì vị trí chính xác của băng tải bên dưới hàng hóa là không liên quan, nên việc bạn hủy cặp nào không quan trọng.
Hủy bỏ này được áp dụng trước các quy tắc khác. Do đó, đối với các quy tắc khác, sẽ chỉ có băng tải theo nhiều nhất hai hướng.
- Nếu hàng hóa hoàn toàn không bao gồm bất kỳ băng tải nào (vì tất cả các băng tải đều hủy, vì nó chỉ bao gồm các khoảng trống hoặc do nó di chuyển hoàn toàn khỏi lưới điện), nó sẽ dừng lại.
Nếu hàng hóa bao phủ nhiều băng tải của một hướng hơn so với hướng khác, hàng hóa sẽ di chuyển theo hướng đó. Ví dụ: nếu hàng hóa 3x2 bao phủ các bản vá sau
>> ^>^
Nó sẽ di chuyển sang phải, bởi vì có nhiều
>
hơn^
. Mặt khác, nếu nó được bảo hiểm>>^ ^
quy tắc này sẽ không được áp dụng, bởi vì có một sự ràng buộc giữa
>
và^
.Điều này chỉ để lại các trường hợp trong đó có một ràng buộc giữa các hướng liền kề (một sự ràng buộc giữa các hướng ngược lại sẽ bị hủy bỏ). Trong trường hợp này, hàng hóa tiếp tục di chuyển dọc theo trục mà nó đã di chuyển. Ví dụ: nếu một hàng hóa 3x2 di chuyển phải hoặc di chuyển trái hiện đang bao phủ miếng vá
>>^ ^
nó sẽ di chuyển sang phải Nếu nó đã đến trên miếng vá này di chuyển lên hoặc xuống, bây giờ nó sẽ di chuyển lên. Nếu loại xung đột này xảy ra ở bước đầu tiên của mô phỏng, giả sử rằng hàng hóa đã được di chuyển sang phải.
Ví dụ chi tiết
Hãy xem xét lưới băng tải ở phía trên và một hàng hóa 3x2. Sau đây là một hình dung từng bước của quá trình. Mỗi bước bao gồm lưới, với hàng hóa được đại diện bởi #
, một hộp nhỏ hiển thị các băng tải được bao phủ bởi hàng hóa, một hộp khác với các băng tải sau khi hủy và quy tắc xác định nơi hàng hóa di chuyển:
###vv < > <vv < > <vv < > <vv < > <vv < > <vv <
###^ >v v ###^ >v v v ^ >v v v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ ###v^^>vv^ ###v^^>vv^ ###^^>vv^ ###^>vv^ >###>vv^
^>^ v ^>^ v ### ^>^ v ###^>^ v ###>^ v ###^ v
> v<v >> > v<v >> > v<v >> > v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
|> <| | | | v | | v | | >| | >| | >v| | >v| |>v^| |> ^| |v^^| | ^^|
| v | | v | | >| | >| | | | | | | | | | ^| | | | ^>| | >|
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3 Rule 4 Rule 4 Rule 3
================================================================================
> <vv < > <### < > <vv <
v ###v v v ###v v v ###v v
>###>vv^ >v^^>vv^ >###>vv^
^>^ v ^>^ v ^>^ v
> v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+
|^ >| | >| |vv | | v | |^ >| | >|
|v^^| | ^^| |^ >| | >| |v^^| | ^^|
+---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3
Tại thời điểm này, hàng hóa đi vào một vòng lặp giữa hai khung hình cuối cùng.
Bây giờ hãy xem xét một hàng hóa 2x3 thay thế:
##<vv < >##vv < > <vv < > <vv < > <vv < > <vv <
## ^ >v v ##^ >v v ##^ >v v v ^ >v v v ^ >v v v ^ >v v
##>v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##^^>vv^ >v^^>vv^
^>^ v ^>^ v ## ^>^ v ## ^>^ v ##^>^ v ##^>^ v
> v<v >> > v<v >> > v<v >> >##v<v >> > ##<v >> > ##<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ ## v<^
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
|> | |> | | <| | | |v | |v | | >| | >| |>v| |>v| | | | |
| v| | v| |v | |v | | >| | >| | | | | | | | | | v| | v|
| | | | | >| | | | | | | | | | | | v| | v| |>v| |>v|
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
Rule 4 Rule 3 Rule 4 Rule 3 Rule 3 Rule 3
================================================================================
> <vv < > <vv < > <vv <
v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ >v^^>vv^ >v^^>vv^
^>^ v ^>^ v ^>^ v
> ##<v >> > v<v >> > v<v >>
## v<^ ## v<^ >v v<^
## ## ##
## ##
##
+--+ +--+ +--+ +--+ +--+ +--+
| v| | v| |>v| |>v| | | | |
|>v| |>v| | | | | | | | |
| | | | | | | | | | | |
+--+ +--+ +--+ +--+ +--+ +--+
Rule 3 Rule 4 Rule 2
Ở bước cuối cùng, quy tắc 2 được áp dụng vì hàng hóa đã di chuyển khỏi lưới điện, do đó, nó sẽ dừng lại và sẽ không có một vòng lặp.
Quy tắc và giả định
Đầu vào của bạn sẽ là lưới băng tải như mô tả ở trên cùng với chiều rộng và chiều cao của hàng hóa. Bạn có thể lấy ba tham số này theo bất kỳ thứ tự và định dạng thuận tiện. Đối với lưới, điều này có nghĩa là bạn có thể đọc một chuỗi đơn với các dòng được phân tách bằng dòng mới hoặc các ký tự khác hoặc một chuỗi các chuỗi hoặc một mảng các ký tự, miễn là các ô lưới riêng lẻ vẫn được biểu thị bằng các ký tự >v<^
và không gian.
Bạn nên đầu ra một truthy giá trị nếu kết quả thiết lập trong một vòng lặp của ít nhất hai khung hoặc một falsy giá trị nếu hàng hóa sẽ đến để nghỉ ngơi.
Bạn có thể giả định rằng lưới sẽ được đệm vào một hình chữ nhật có khoảng trắng và hàng hóa ban đầu sẽ vừa với lưới.
Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).
Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.
Các trường hợp thử nghiệm
Các trường hợp thử nghiệm được nhóm theo lưới.
Grid (2x2):
>v
^<
Width Height Loop?
1 1 True
1 2 True
2 1 True
2 2 False
Grid (3x3):
> v
^ <
Width Height Loop?
1 1 False
1 2 False
1 3 False
2 1 False
2 2 True
2 3 True
3 1 False
3 2 True
3 3 False
Grid (4x3):
>^>v
v^v
^ <<
Width Height Loop?
2 2 False
Grid (6x5):
>v>v>v
^v^v^v
^v^v^v
^>^>^v
^<<<<<
Width Height Loop?
1 1 True
1 2 False
2 1 True
2 2 True
2 4 True
2 5 False
3 1 False
3 2 True
3 3 True
3 5 True
6 2 False
6 3 True
6 5 False
Grid (10x6):
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Width Height Loop?
1 1 False
2 3 False
2 6 False
3 2 True
5 4 False
6 1 True
10 6 False
Là một tập hợp các trường hợp thử nghiệm bổ sung, hãy xem xét rằng bất kỳ đầu vào nào trong đó lưới chỉ bao gồm các khoảng trắng phải mang lại kết quả sai lệch.
Tôi đã kiểm tra tất cả các trường hợp kiểm tra theo cách thủ công, vì vậy hãy cho tôi biết nếu bạn nghĩ rằng tôi đã phạm sai lầm.
[^^/v<]
trở thành [[0,1] [0,1];[0,-1] [-1,0]]
? Hoặc bạn có nghĩa là tùy thuộc vào chúng tôi cho dù đó là STDIN, đầu vào chuỗi, đầu vào mảng char, v.v., nhưng nó vẫn phải ở dạng ^, v,> và <?
><^v
hoặc khoảng trắng. Tôi sẽ làm rõ điều đó.