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.
quelle
[^^/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.Antworten:
Ruby,
306 298 251 204198Edit: Vielen Dank an Ventero, der den Code durch einige erstaunliche Tricks stark verkürzt hat!
Ein- und Ausgabe
Der Code stellt eine Ruby-Funktion dar, die drei Parameter akzeptiert:
Es gibt
1
(wahr) zurück, falls es eine Schleife gibt, odernil
(falsch), falls die Ladung ruht.Tests
Hier besteht es alle Martins Tests: http://ideone.com/zPPZdR
Erläuterung
Der Code enthält keine cleveren Tricks. Es ist eine ziemlich einfache Implementierung der Regeln.
Im folgenden Code
move
handelt es sich um eine rekursive Funktion, die einen Zug gemäß den Regeln ausführt.Eine besser lesbare Version finden Sie hier .
Hinweis: Der Golf-Code wurde mehrfach geändert und ähnelt nicht mehr der lesbaren Version.
quelle
r
neben den vier Richtungen weitere Einträge enthalten sind,r[y>=0&&x>=0&&g[y]&&g[y][x]]+=1
sollten ein paar Bytes gespart werden.Python 2, 207 Bytes
Geben Sie das Raster als Liste von Zeilen ein, z
gefolgt von der Breite und Höhe. Rückgabe
0
oderTrue
entsprechend.Erläuterung
quelle
cmp
einer Variablen zuweisen ?D
zur Positionstaste sollte dies tun.Julia -
394300246214 BytesGibt 1 zurück, wenn die Ladung eine Schleife durchläuft, und 0, wenn sie zum Stillstand kommt. Es ist nicht "streng" wahr / falsch, da Julia 0 und 1 in booleschen Kontexten nicht zulässt ... aber ich betrachte Werte,
x
für diebool(x)==true
wahr undbool(x)==false
falsch sind.Die Eingabe
A
sollte in Form eines Zeichenarrays erfolgen. Wenn Sie das Fördergitter kopieren / einfügen, müssen Sie es in die entsprechende Form bringen. Verwenden Sie Folgendes, um zu vermeiden, dass Sie manuell damit umgehen müssen:Wo offensichtlich
(PASTE GRID HERE)
sollte mit dem Gitter selbst ersetzt werden. Überprüfen Sie die Leerzeichen am Ende jeder Zeile, um sicherzustellen, dass alle Leerzeichen vorhanden sind (stellen Sie nicht sicher, dass alle Zeilen gleich lang sind). Beachten Sie, dass diese Zeile nicht Teil des eigentlichen Lösungscodes ist, sondern lediglich ein praktischer Code, um die Verwendung des Lösungscodes zu vereinfachen.Ungolfed:
Hinweis:
1-[19 8]i%82%3
wurde ausgewählt, um die fünf möglichen Zeichen mit der effizientesten Methode, die ich finden konnte, den entsprechenden Koordinatenpaaren zuzuordnen. Dies ist auch der Grund, warum beim Erstellen 5 verwendet wird, um die Leerzeichen zu füllen. Dies istG
ein einstelliges Zeichen, das zugeordnet wird[0 0]
.Anwendungsbeispiel:
quelle
f(A,x,y)=
ist kürzer alsf=(A,x,y)->
.f=
und sie zu einer anonymen Funktion machen, wenn ich mit dem Golfen fertig bin.f()=
versus()->
.