Es gibt einen Fluss und es gibt Wölfe und Hühner auf einer Seite des Flusses. Sie haben ein Floß und müssen alle auf die andere Seite. Das Floß kann jedoch nicht alleine fahren. Das Floß sinkt, wenn mehr als zwei Tiere darauf sind. Keines der Tiere möchte nass werden, weil der Fluss kalt und schmutzig ist. Keines der Tiere kann über den Fluss springen oder fliegen. Wenn sich auf einer Seite Hühner befinden, können sich auf dieser Seite nicht mehr Wölfe befinden als auf dieser Seite - die Wölfe entscheiden sich dann, die Hühner zu fressen. Dies bedeutet, dass Sie nicht zwei Wölfe auf dem Floß mit einem Huhn zur Seite stellen können.
Ihre Aufgabe ist es, ein Programm / eine Funktion zu erstellen, das / die eine Anzahl von Wölfen und eine Anzahl von Hühnern (größer oder gleich der Anzahl von Wölfen) als Eingabe verwendet und ermittelt, wie oft sich das Floß am wenigsten über den Fluss bewegen muss. Wenn die Aufgabe nicht möglich ist, sollte das Programm / die Funktion einen leeren String ausgeben / zurückgeben. Es wird dann eine Methode ausgegeben / zurückgegeben, wie dies auf folgende Weise erfolgt:
W if a wolf crosses the river on its own
C if a chicken crosses the river on its own
CW if a chicken and a wolf cross the river -- WC is also fine
CC if two chickens cross the river
WW if two wolves cross the river
Wie Sie ableiten können, bewegt sich das Floß automatisch in wechselnde Richtungen (links und rechts, beginnend von links nach rechts, wenn die ersten ein oder zwei Tiere den Fluss überqueren). Dies muss nicht ausgegeben / zurückgegeben werden. 'W', 'C', 'CW', 'CC' oder 'WW' in der Ausgabe können durch mindestens eine der folgenden Angaben getrennt sein:
spaces (' ')
commas (',')
newlines
Alternativ können Sie die Anweisungen als Elemente in einer Liste speichern (eine leere Liste bedeutet keine Lösung).
Testfälle (Ausgabe durch Komma getrennt - Eingabe hat die Form wolves,chickens
):
1,1 -> CW
2,2 -> CW,C,CC,C,CW
1,2 -> CW,W,CW
0,10 -> CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC
3,2 -> no solution
Versuchen Sie, Ihren Code so kurz wie möglich in Bytes zu halten.
quelle
Antworten:
Perl,
179165164163157156 BytesBeinhaltet +4 für
-p
Gib Wölfen gefolgt von Hühnern auf STDIN
Gibt den Bootsinhalt pro Zeile aus. Für dieses Beispiel gibt es:
river.pl
:Funktioniert wie abgebildet, aber ersetzen
\xhh
und\n
durch ihre Literalversionen, um die beanspruchte Punktzahl zu erhalten.Dies wird wahrscheinlich von einem Programm geschlagen, das den allgemeinen Fall löst (C> W> 0)
Hinzu kommen die trivialen Lösungen für nur Wölfe und nur Hühner und ein fest codierter Spezialfall für
2 2
und3 3
(4 4
und höher haben keine Lösung). Aber das wäre ein langweiliges Programm.Erläuterung
Der aktuelle Status des Feldes wird als einzelne Zeichenfolge gespeichert, bestehend aus:
w
für einen Wolf am Ufer mit dem Bootc
für ein Huhn am Ufer mit dem Boot\x88
(Bit vertauschtw
) für einen Wolf am anderen Ufer\x9c
(Bit vertauschtc
) für ein Huhn am anderen UferP
rechten Ufer befindet\xaf
(Bit umgekehrt)P
), für das linke Ufer (Startseite)\n
WC\nW\nWC\nC\n
(beachte dasW
s und schreibeC
hier groß).Das Array
@F
enthält alle erreichbaren Zustände. Es wird durch die Startzeichenfolge initialisiertwolves times "w", chickens times "c", \xaf \n
Das Programm durchläuft dann eine Schleife,
@F
die während des Schleifens verlängert wird, so dass auch neue Zustände verarbeitet werden. Für jedes Element gilt dann:\n
der die aktuelle Position der Tiere und des Bootes darstellt. Wenn das schon mal gesehen wurde überspringen$a{$`x/\n/}++
grep(y/c//<y/w//&/c/,$_,~$_)
$\
Bewahren Sie das auf und bewahren Sie es auf, da die erste gefundene Lösung die kürzeste ist$\||=$' x/^\w*\n/
c
undw
Zeichen. (Die Tiere auf der anderen Seite werden passen nicht zusammen\w
)/(\w?)(.*)(c|w)(.+)\n(?{code})^/
. Dann drehen Sie die gesamte Saite vor den\n
Tieren, die für das Boot ausgewählt wurden, umpush@F,$1.$3.~"$`$2$4\xf5"
. Fügen Sie die ausgewählten Tiere zu den Zügen hinzu, indem Sie sie mit einem Großbuchstaben versehen:uc"$'$1$3\n"
Der Tierauswahlprozess mischt effektiv den String-Teil, der sie auf viele Arten repräsentiert. So können zB
wcwc
undwwcc
beide 2 Wölfe und 2 Hühner darstellen. Die Zustandsüberprüfung$a{$`x/\n/}++
unterscheidet diese zwei so viel mehr Zustände, als notwendig sind, und wird erzeugt und überprüft. Aus diesem Grund wird dem Programm der Speicher und die Zeit ausgehen, sobald die Anzahl der verschiedenen Tiere größer wird. Dies wird nur ein wenig dadurch gemildert, dass die aktuelle Version keine neuen Status mehr hinzufügt, sobald eine Lösung gefunden wurdequelle
WC,C,WC
es 2 Wölfe und 1 Huhn am rechten Ufer gibt. Game overJavaScript (ES6),
251264...244240 ByteNimmt die Anzahl der Wölfe und Hühner
(w, c)
und gibt eine der optimalen Lösungen zurück, oderundefined
wenn es keine Lösung gibt.Formatiert und kommentiert
Wrapper-Funktion:
Hauptrekursivfunktion:
Testfälle
Code-Snippet anzeigen
quelle
and finds the smallest number of times the raft has to move across the river.
.CJam, 133
Probieren Sie es online aus
Erläuterung:
Grundsätzlich führt das Programm ein BFS durch und merkt sich jeden erreichten Zustand, um unendliche Zyklen zu vermeiden. Die Arbeitszustände sind wie [[Wl Cl] [Wr Cr] M1 M2… Mn] dargestellt, wobei W = Wölfe, C = Hühner, l = linke Seite, r = rechte Seite, M = bisher ausgeführte Züge (anfangs keine), und die Bewegungen sind wie "C", "WC" oder "WW" usw. (praktisch eher wie ["" C "], [" W "" C "], [" WW ""], aber es ist dasselbe beim Drucken). Die erinnerten Zustände werden wie [[Wl Cl] [Wr Cr] S] dargestellt, wobei S die Seite mit dem Boot ist (0 = links, 1 = rechts).
quelle
Perl 6 , 268 Bytes
Erzeugt zunehmend längere Ketten von
(wolf count, chicken count)
für die linke Bank und gibt die erste zurück, die allen Regeln entspricht.Es hat sich herausgestellt, dass dieser Ansatz weder effizient noch sehr prägnant ist, aber zumindest hat es Spaß gemacht, zu schreiben.
Ich glaube, ich habe die
Z
(zip) - undX
(cross) -Meta-Operatoren noch nie so gestapelt wie dieZZ-
undZX*
hier - ein bisschen überrascht, dass das tatsächlich funktioniert hat.(Die Zeilenumbrüche werden nur zu Anzeigezwecken hinzugefügt und sind nicht Teil der Byteanzahl.)
quelle
JavaScript (ES6), 227
237Grundsätzlich führt es ein BFS durch und merkt sich jeden erreichten Zustand, um unendliche Zyklen zu vermeiden.
Im Gegensatz zu @aditsu glaube ich, dass es keinen Platz zum Golfen gibtWeniger golfen
Prüfung
quelle