Questa sfida è liberamente ispirata al gioco Zachtronics Infinifactory .
Ti viene data una vista dall'alto verso il basso di una griglia rettangolare di nastri trasportatori, rappresentata da >v<^
. Potrebbero esserci celle senza convogliatori, rappresentate da spazi. Ecco un esempio:
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Questa configurazione è implicitamente circondata da un numero infinito di spazi.
Inoltre, ti vengono fornite le dimensioni di un pezzo di carico rettangolare che viene posizionato sui nastri trasportatori nell'angolo in alto a sinistra della griglia. Il tuo compito è capire se il carico si ferma mai o se finirà per muoversi in loop.
Naturalmente, è probabile che il carico copra più trasportatori contemporaneamente, quindi ecco le regole per capire la direzione del carico in ogni passaggio:
I trasportatori di fronte si annullano a vicenda. Quindi, se un carico 3x2 copre una delle seguenti patch (delineate con trattini e tubi per chiarezza), il risultato sarebbe lo stesso:
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
Lo stesso vale per questi:
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
Poiché la posizione esatta di un trasportatore sotto il carico è irrilevante, non importa quali coppie si annullano.
Questa cancellazione viene applicata prima delle altre regole. Pertanto, per le altre regole ci saranno solo nastri trasportatori al massimo in due direzioni.
- Se il carico non copre affatto i nastri trasportatori (sia perché tutti i nastri trasportatori si annullano, perché copre solo gli spazi o perché si è spostato completamente dalla griglia), si ferma.
Se il carico copre più convogliatori di una direzione rispetto all'altra, il carico si sposta in quella direzione. Ad esempio, se un carico 3x2 copre la seguente patch
>> ^>^
si sposterà a destra, perché ci sono più
>
di^
. D'altra parte, se coperto>>^ ^
questa regola non si applica, perché esiste un legame tra
>
e^
.Ciò lascia solo casi in cui esiste un legame tra direzioni adiacenti (un legame tra direzioni opposte avrebbe annullato). In questo caso, il carico continua a muoversi lungo l'asse in cui si sta già muovendo. Ad esempio, se un carico 3x2 con movimento a destra o a sinistra copre ora il patch
>>^ ^
si sposterà a destra. Se fosse arrivato su questa patch spostandosi verso l'alto o verso il basso, ora si sposta invece verso l'alto. Se questo tipo di conflitto si verifica nel primo passo della simulazione, supponiamo che il carico si sia spostato a destra.
Esempi dettagliati
Considera la griglia di trasporto in alto e un carico 3x2. Di seguito è riportata una visualizzazione dettagliata del processo. Ogni passaggio è costituito dalla griglia, con il carico rappresentato da #
, una piccola scatola che mostra i trasportatori coperti dal carico, un'altra scatola con i trasportatori dopo la cancellazione e la regola che determina dove si muove il carico:
###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
A questo punto, il carico entra in un loop tra gli ultimi due frame.
Ora considera invece un carico 2x3:
##<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
Nell'ultimo passaggio, si applica la regola 2 perché il carico si è spostato dalla griglia, quindi si ferma e non ci sarà un anello.
Regole e presupposti
Il tuo input sarà la griglia del trasportatore come descritto sopra insieme alla larghezza e altezza del carico. Puoi prendere questi tre parametri in qualsiasi ordine e formato convenienti. Per la griglia, ciò significa che è possibile leggere una singola stringa con linee separate da newline o altri caratteri, oppure una matrice di stringhe o una matrice di matrici di caratteri, purché le singole celle della griglia siano ancora rappresentate dai caratteri >v<^
e spazi.
Dovresti produrre un valore veritiero se l'installazione risulta in un ciclo di almeno due fotogrammi o un valore falso se il carico si ferma.
Si può presumere che la griglia sarà riempita con un rettangolo con spazi e che il carico inizialmente si adatterà alla griglia.
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).
Questo è il golf del codice, quindi vince la risposta più breve (in byte).
Casi test
I casi di test sono raggruppati per griglia.
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
Come set aggiuntivo di casi di test, considerare che qualsiasi input in cui la griglia è costituita esclusivamente da spazi deve produrre un risultato errato.
Ho controllato manualmente tutti i casi di test, quindi fammi sapere se pensi di aver fatto un errore.
[^^/v<]
diventa una griglia 2x2 con [[0,1] [0,1];[0,-1] [-1,0]]
? O vuoi dire che dipende da STDIN, un input di stringa, un input di array di caratteri, ecc., Ma deve comunque essere nella forma di ^, v,> e <?
><^v
o da uno spazio. Lo chiarirò.