Цей виклик дуже натхненний грою Zachtronics Infinifactory .
Вам надається вид зверху вниз прямокутної сітки конвеєрів, представлених символом >v<^
. Можуть бути комірки без конвеєрів, представлені пробілами. Ось приклад:
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Цей параметр неявно оточений нескінченною кількістю пробілів.
Крім того, вам надаються розміри прямокутного шматка вантажу, який розміщується на конвеєрах у верхньому лівому куті сітки. Ваше завдання - розібратися, чи колись вантаж приходить у стан спокою, чи він врешті переміститься в петлі.
Звичайно, вантаж, ймовірно, охоплює відразу кілька конвеєрів, тому ось правила визначення напрямку вантажу на кожному кроці:
Протилежні конвеєри скасовують один одного. Отже, якщо вантаж 3х2 покриває будь-який з наступних патчів (накреслений дефісами та трубами для наочності), результат буде таким самим:
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
Те саме стосується і таких:
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
Оскільки точне положення транспортера під вантажем не має значення, не важливо, які пари ви скасуєте.
Це скасування застосовується перед іншими правилами. Тому для інших правил будуть лише конвеєри, щонайменше, у двох напрямках.
- Якщо вантаж взагалі не покриває жодних конвеєрів (або тому, що всі конвеєри скасовуються, тому що він покриває лише простір, або тому, що він повністю перемістився з сітки), він перебуває у спокої.
Якщо вантаж охоплює більше транспортерів одного напрямку, ніж іншого, вантаж рухається в цьому напрямку. Наприклад, якщо вантаж 3х2 покрив наступний пластир
>> ^>^
вона буде рухатися вправо, тому що є більш
>
ніж^
. З іншого боку, якщо вона охоплювала>>^ ^
це правило не застосовуватиметься, оскільки існує зв'язок між
>
та^
.Це залишає лише випадки, коли між сусідніми напрямками існує зв'язок (зв’язок між протилежними напрямками скасувався б). У цьому випадку вантаж продовжує рухатись по осі, по якій він вже рухається. Наприклад, якщо вантаж, що рухається праворуч або рухається ліворуч 3х2, тепер покриває пластир
>>^ ^
воно рухатиметься праворуч. Якби він прибув на цей патч, рухаючись вгору або вниз, він би замість цього рухався. Якщо подібний конфлікт виникає на першому кроці моделювання, припустимо, що вантаж рухався вправо.
Детальні приклади
Розгляньте конвеєрну сітку вгорі та вантаж 3х2. Далі йде покрокова візуалізація процесу. Кожен крок складається з сітки з вантажем, представленим #
невеликою коробкою, на якій зображені транспортери, накриті вантажем, ще одна коробка з конвеєрами після відміни та правило, яке визначає, куди рухається вантаж:
###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
У цей момент вантаж потрапляє в петлю між останніми двома рамками.
А тепер розгляньте замість вантажу 2х3:
##<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
На останньому кроці застосовується правило 2, оскільки вантаж перемістився з сітки, тому він перебуває в спокої і не буде петлі.
Правила та припущення
Вашим входом буде сітка транспортера, як описано вище, разом із шириною та висотою вантажу. Ви можете приймати ці три параметри в будь-якому зручному порядку та форматі. Для сітки це означає, що ви можете прочитати один рядок з рядками, розділеними новими рядками або іншими символами, або масив рядків або масив масивів символів, поки окремі комірки сітки все ще представлені символами >v<^
та пробіли.
Ви повинні вивести триєдне значення, якщо в результаті установки буде цикл щонайменше двох кадрів або хибне значення, якщо вантаж прийде в спокій.
Ви можете припустити, що сітка буде забита прямокутником з пробілами, і що вантаж спочатку поміститься в сітку.
Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out).
Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.
Випробування
Тестові приклади групуються за сітками.
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
В якості додаткового набору тестових випадків розглянемо, що будь-який вхід, де сітка складається виключно з пробілів, повинен дати результат помилкового результату.
Я перевірив усі тестові справи вручну, тому повідомте мені, якщо ви думаєте, що я помилився.
[^^/v<]
стає [[0,1] [0,1];[0,-1] [-1,0]]
? Або ви маєте на увазі, що це від нас, чи це STDIN, рядок введення, вхід масиву char тощо, але це все одно має бути у формі ^, v,> та <?
><^v
або пробілом. Я це уточню.