Diese Herausforderung ist locker vom Zachtronics-Spiel Infinifactory inspiriert .
Sie erhalten eine Ansicht von oben auf ein rechteckiges Gitter von Förderbändern, dargestellt durch >v<^
. Es kann Zellen ohne Förderer geben, die durch Leerzeichen dargestellt werden. Hier ist ein Beispiel:
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Dieser Aufbau ist implizit von einer unendlichen Anzahl von Leerzeichen umgeben.
Darüber hinaus erhalten Sie die Abmessungen eines rechteckigen Stücks Fracht, das in der linken oberen Ecke des Gitters auf die Förderbänder gelegt wird. Sie müssen herausfinden, ob die Ladung jemals zur Ruhe kommt oder ob sie sich in einer Schleife bewegt.
Natürlich deckt die Ladung wahrscheinlich mehrere Förderer gleichzeitig ab. Daher gelten die folgenden Regeln, um die Richtung der Ladung in jedem Schritt zu bestimmen:
Gegenüberliegende Förderer heben sich gegenseitig auf. Wenn also eine 3x2-Ladung eines der folgenden Patches abdeckt (aus Gründen der Klarheit mit Bindestrichen und Rohren versehen), ist das Ergebnis dasselbe:
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
Gleiches gilt für diese:
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
Da die genaue Position eines Förderers unter der Ladung unerheblich ist, spielt es keine Rolle, welche Paare Sie stornieren.
Diese Stornierung wird vor den anderen Regeln angewendet. Daher gibt es für die anderen Regeln nur Förderer in höchstens zwei Richtungen.
- Wenn die Ladung überhaupt keine Förderer abdeckt (entweder weil alle Förderer ausfallen, weil sie nur Leerzeichen abdeckt oder weil sie sich vollständig vom Gitter entfernt hat), kommt sie zur Ruhe.
Wenn die Ladung mehr Förderer einer Richtung als der anderen abdeckt, bewegt sich die Ladung in diese Richtung. ZB wenn eine 3x2 Ladung den folgenden Patch abdeckt
>> ^>^
es würde sich nach rechts bewegen, denn es gibt mehr
>
als^
. Auf der anderen Seite, wenn es bedeckt ist>>^ ^
Diese Regel würde nicht gelten, da zwischen
>
und ein Zusammenhang besteht^
.Dies lässt nur Fälle übrig, in denen es ein Unentschieden zwischen benachbarten Richtungen gibt (ein Unentschieden zwischen entgegengesetzten Richtungen hätte aufgehoben). In diesem Fall bewegt sich die Ladung weiter entlang der Achse, in der sie sich bereits bewegt. Bedeckt nun beispielsweise eine sich rechts oder links bewegende 3x2-Ladung das Feld
>>^ ^
es würde sich nach rechts bewegen. Wenn es auf diesem Patch angekommen wäre, der sich nach oben oder unten bewegt, würde es sich stattdessen nach oben bewegen. Wenn diese Art von Konflikt im ersten Schritt der Simulation auftritt, nehmen Sie an, dass sich die Fracht nach rechts bewegt hat.
Ausführliche Beispiele
Betrachten Sie das Fördergitter oben und eine 3x2-Ladung. Das Folgende ist eine schrittweise Visualisierung des Prozesses. Jeder Schritt besteht aus dem Raster, in dem die Ladung durch #
ein Kästchen dargestellt wird , in dem die von der Ladung abgedeckten Förderer, ein weiteres Kästchen mit den Förderern nach der Stornierung und die Regel angegeben sind, die festlegt, wohin sich die Ladung bewegt:
###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
Zu diesem Zeitpunkt tritt die Ladung in eine Schleife zwischen den letzten beiden Rahmen ein.
Betrachten Sie stattdessen eine 2x3-Ladung:
##<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
Im letzten Schritt gilt Regel 2, weil sich die Ladung vom Gitter entfernt hat, so dass sie zur Ruhe kommt und es keine Schleife gibt.
Regeln und Annahmen
Ihre Eingabe wird das oben beschriebene Fördergitter sein, zusammen mit der Breite und Höhe der Ladung. Sie können diese drei Parameter in beliebiger Reihenfolge und in beliebigem Format verwenden. Für das Raster bedeutet dies, dass Sie eine einzelne Zeichenfolge mit durch Zeilenumbrüche oder andere Zeichen getrennten Zeilen oder ein Array von Zeichenfolgen oder ein Array von Arrays von Zeichen lesen können, solange die einzelnen Rasterzellen noch durch die Zeichen >v<^
und dargestellt werden Leerzeichen.
Sie sollten einen Wahrheitswert ausgeben , wenn das Setup eine Schleife von mindestens zwei Frames ergibt, oder einen falschen Wert, wenn die Ladung zur Ruhe kommt.
Sie können davon ausgehen, dass das Gitter zu einem Rechteck mit Leerzeichen aufgefüllt wird und die Ladung zunächst in das Gitter passt.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
Die Testfälle sind nach Rastern gruppiert.
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
Berücksichtigen Sie als zusätzlichen Satz von Testfällen, dass jede Eingabe, bei der das Raster nur aus Leerzeichen besteht, ein falsches Ergebnis liefern muss.
Ich habe alle Testfälle manuell überprüft. Lassen Sie mich wissen, wenn Sie glauben, dass ich einen Fehler gemacht habe.
[^^/v<]
wird [[0,1] [0,1];[0,-1] [-1,0]]
? Oder liegt es an uns, ob es sich um STDIN, eine Zeichenfolgeeingabe, eine Zeichenfeldeingabe usw. handelt, aber es muss immer noch die Form ^, v,> und <haben?
><^v
oder ein Leerzeichen dargestellt werden. Ich werde das klären.