Ich scheine mich in eine Art Essiggurke verwickelt zu haben. Buchstäblich. Ich habe ein paar Gurken auf den Boden fallen lassen und jetzt sind sie alle verstreut! Du musst mir helfen, sie alle zu sammeln. Oh, habe ich schon erwähnt, dass ich ein paar Roboter zur Verfügung habe? (Sie sind auch alle überall verstreut; ich bin wirklich schlecht darin, Dinge zu organisieren.)
Sie müssen Eingaben in Form von:
P.......
..1..2..
.......P
........
P3PP...4
.......P
dh mehrzeiligen entweder .
, P
(Gurke) oder eine Ziffer (Roboter ID). (Sie können davon ausgehen, dass jede Zeile gleich lang und aufgefüllt ist .
.) Sie können diese Zeilen als Array eingeben oder aus STDIN schlürfen oder eine durch Kommas getrennte einzelne Zeile einlesen oder eine Datei lesen oder alles tun, was Sie möchten nehme gerne die Eingabe.
Ihre Ausgabe muss in Form von n
Linien erfolgen, wobei n
die höchste Roboter-ID angegeben ist. (Roboter-IDs beginnen immer ab 1.) Jede Zeile enthält den Pfad des Roboters, der aus den Buchstaben L
(links), R
(rechts), U
(oben) und D
(unten) besteht. Hier ist zum Beispiel eine Beispielausgabe für dieses Puzzle:
LLU
RDR
LRRR
D
Es kann auch sein
LLU RDR LRRR D
Oder
["LLU","RDR","LRRR","D"]
Oder ein beliebiges Format, solange Sie wissen, wie die Lösung aussehen soll.
Ihr Ziel ist es, die optimale Ausgabe zu finden, die die geringsten Schritte aufweist. Die Anzahl der Schritte wird als die größte Anzahl von Schritten aller Roboter gezählt. Zum Beispiel hatte das obige Beispiel 4 Schritte. Beachten Sie, dass es möglicherweise mehrere Lösungen gibt, Sie jedoch nur eine ausgeben müssen.
Wertung:
- Ihr Programm wird mit jedem der 5 (zufällig generierten) Testfälle ausgeführt.
- Sie müssen die Schritte aus jedem Lauf hinzufügen, und das ist Ihre Punktzahl.
- Die niedrigste kumulative Gesamtpunktzahl gewinnt.
- Sie können diese spezifischen Eingaben möglicherweise nicht fest codieren. Ihr Code sollte auch für andere Eingaben funktionieren.
- Roboter können sich gegenseitig passieren.
- Ihr Programm muss deterministisch sein, dh für jeden Lauf dieselbe Ausgabe. Sie können einen Zufallszahlengenerator verwenden, solange dieser gesetzt ist und plattformübergreifend dieselben Zahlen erzeugt.
- Ihr Code muss für jede Eingabe innerhalb von 3 Minuten ausgeführt werden. (Am liebsten viel weniger.)
- Bei einem Unentschieden gewinnen die meisten Upvotes.
Hier sind die Testfälle. Sie wurden zufällig mit einem kleinen Ruby-Skript generiert, das ich geschrieben habe.
P.......1.
..........
P.....P...
..P.......
....P2....
...P.P....
.PP..P....
....P....P
PPPP....3.
.P..P.P..P
....P.....
P....1....
.P.....PP.
.PP....PP.
.2.P.P....
..P....P..
.P........
.....P.P..
P.....P...
.3.P.P....
..P..P..P.
..1....P.P
..........
.......2P.
...P....P3
.P...PP..P
.......P.P
..P..P..PP
..P.4P..P.
.......P..
..P...P...
.....P....
PPPP...P..
..P.......
...P......
.......P.1
.P..P....P
P2PP......
.P..P.....
..........
......PP.P
.P1..P.P..
......PP..
P..P....2.
.P.P3.....
....4..P..
.......PP.
..P5......
P.....P...
....PPP..P
Viel Glück und lass die Gurken nicht zu lange dort sitzen, sonst werden sie verderben!
Oh, und warum Gurken, fragst du?
Warum nicht?
quelle
Antworten:
Ruby, 15 + 26 + 17 + 26 + 17 = 101
Roboter findet Gurken!
Okay, hier ist eine Basis, um die Leute mit dem folgenden super-naiven Algorithmus zum Laufen zu bringen:
So sieht es für Testfall 1 aus:
Das ist natürlich nicht sehr gut, aber es ist ein Anfang!
Code:
Nimmt Eingaben in STDIN genau im Format des Testfall-Codeblocks in der ursprünglichen Frage vor. Für diese Testfälle wird Folgendes gedruckt:
quelle
Python, 16 + 15 + 14 + 20 + 12 = 77
Ich habe noch keine Erfahrung mit Problemen mit reisenden Verkäufern, aber ich hatte ein bisschen Zeit, also dachte ich, ich würde es versuchen. Grundsätzlich wird versucht, jedem Bot bestimmte Gurken zuzuweisen, indem er durch einen Vorlauf läuft, bei dem sie nach denjenigen suchen, die ihnen am nächsten und am weitesten von den anderen entfernt sind. Es erzwingt dann die effizienteste Methode für jeden Bot, um seine zugewiesenen Gurken zu sammeln.
Ich habe wirklich keine Ahnung, wie praktikabel diese Methode ist, aber ich vermute, dass sie für größere Boards mit weniger Bots nicht gut funktioniert (das vierte Board dauert manchmal schon mehr als zwei Minuten).
Code:
Ausgabe:
quelle