Il y a une rivière et il y a des loups et des poulets d'un côté de la rivière. Ils ont un radeau et ils ont tous besoin de se rendre de l'autre côté. Cependant, le radeau ne peut pas voyager seul. Le radeau coulera si plus de deux animaux s'y trouvent. Aucun animal ne veut se mouiller à cause du froid et de la saleté de la rivière. Aucun des animaux ne peut sauter ou survoler la rivière. De plus, s'il y a des poulets d'un côté, il ne peut pas y avoir plus de loups de ce côté qu'il n'y a de poulets de ce côté - les loups décideront alors de manger les poulets. Cela signifie que vous ne pouvez pas prendre deux loups sur le radeau avec un poulet.
Votre tâche consiste à créer un programme / une fonction qui prend un certain nombre de loups et un certain nombre de poulets (supérieur ou égal au nombre de loups) en entrée et trouve le plus petit nombre de fois que le radeau doit se déplacer à travers la rivière. Si la tâche n'est pas possible, le programme / la fonction doit générer / renvoyer une chaîne vide. Il imprimera / retournera ensuite une méthode pour savoir comment procéder de la manière suivante:
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
Comme vous pouvez le déduire, le radeau se déplacera automatiquement dans des directions alternées (gauche et droite, en commençant de gauche à droite lorsque le premier ou les deux premiers animaux traversent la rivière). Cela n'a pas besoin d'être sorti / retourné. «W», «C», «CW», «CC» ou «WW» dans la sortie peuvent être séparés par au moins l'un des éléments suivants:
spaces (' ')
commas (',')
newlines
Alternativement, vous pouvez stocker les instructions en tant qu'éléments dans une liste (une liste vide signifie aucune solution).
Cas de test (sortie séparée par des virgules - l'entrée prend la forme 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
Essayez de rendre votre code aussi court en octets que possible.
la source
Réponses:
Perl,
179165164163 163157156 octetsComprend +4 pour
-p
Donner des loups suivis de poulets sur STDIN
Sort le contenu du bateau par ligne. Pour cet exemple, il donne:
river.pl
:Fonctionne comme indiqué, mais remplacez
\xhh
et\n
par leurs versions littérales pour obtenir le score revendiqué.Cela sera probablement battu par un programme qui résout le cas général (C> W> 0)
Ajoutez à cela les solutions triviales pour les loups et les poulets uniquement et un cas spécial codé en dur pour
2 2
et3 3
(4 4
et plus n'ont pas de solution). Mais ce serait un programme ennuyeux.Explication
L'état actuel du champ est stocké sous la forme d'une chaîne unique composée de:
w
pour un loup sur la berge avec le bateauc
pour un poulet sur la berge avec le bateau\x88
(peu inverséw
) pour un loup sur l'autre rive\x9c
(peu inverséc
) pour un poulet sur l'autre riveP
pour la rive droite,\xaf
(bit inverséP
) pour la rive gauche (côté de départ)\n
WC\nW\nWC\nC\n
(notez lesW
s etC
sont en majuscules ici)Le tableau
@F
contiendra tous les états accessibles. Il est initialisé par la chaîne de départwolves times "w", chickens times "c", \xaf \n
Le programme boucle ensuite sur
@F
ce qui sera étendu pendant la boucle afin que de nouveaux états soient également traités. Pour chaque élément, il fait alors:\n
qui représente la position actuelle des animaux et du bateau. Si cela a été vu avant de sauter$a{$`x/\n/}++
grep(y/c//<y/w//&/c/,$_,~$_)
$\
et conservez-le puisque la première solution trouvée est la plus courte$\||=$' x/^\w*\n/
c
etw
. (Les animaux de l'autre côté ne correspondront pas\w
)/(\w?)(.*)(c|w)(.+)\n(?{code})^/
. Ensuite, inversez un peu toute la chaîne avant le\n
sauf les animaux qui ont été sélectionnés pour le bateaupush@F,$1.$3.~"$`$2$4\xf5"
. Ajoutez les animaux sélectionnés aux mouvements en les mettant en majuscule:uc"$'$1$3\n"
Le processus de sélection des animaux mélange efficacement la partie chaîne qui les représente de plusieurs façons. Donc, par exemple,
wcwc
etwwcc
peuvent tous deux représenter 2 loups et 2 poulets. La vérification d'état$a{$`x/\n/}++
distinguera inutilement ces deux états, de sorte que plus d'états que nécessaire seront générés et vérifiés. Par conséquent, le programme manquera de mémoire et de temps dès que le nombre d'animaux différents augmentera. Ceci n'est que légèrement atténué par le fait que la version actuelle cessera d'ajouter de nouveaux états une fois qu'une solution sera trouvéela source
WC,C,WC
il y a 2 loups et 1 poulet sur la rive droite. Game overJavaScript (ES6),
251264...244240 octetsPrend le nombre de loups et de poulets
(w, c)
et retourne l'une des solutions optimales, ouundefined
s'il n'y a pas de solution.Formaté et commenté
Fonction wrapper:
Fonction récursive principale:
Cas de test
Afficher l'extrait de code
la source
and finds the smallest number of times the raft has to move across the river.
. donc je ne pense pas que ce soit une solution valableCJam, 133
Essayez-le en ligne
Explication:
Fondamentalement, le programme fait un BFS et se souvient de chaque état atteint afin d'éviter les cycles infinis. Les états de travail sont représentés comme [[Wl Cl] [Wr Cr] M1 M2… Mn] où W = loups, C = poulets, l = côté gauche, r = côté droit, M = mouvements effectués jusqu'à présent (initialement aucun), et les mouvements sont comme "C", "WC" ou "WW" etc (pratiquement plus comme ["" "C"], ["W" "C"], ["WW" ""], mais c'est la même chose lors de l'impression). Les états mémorisés sont représentés comme [[Wl Cl] [Wr Cr] S] où S est le côté avec le bateau (0 = gauche, 1 = droite).
la source
Perl 6 , 268 octets
Génère des chaînes de plus en plus longues
(wolf count, chicken count)
états pour la rive gauche et renvoie le premier qui correspond à toutes les règles.Il s'avère que cette approche n'est ni efficace ni très concise, mais au moins c'était amusant d'écrire.
Je ne pense pas avoir jamais empilé les méta-opérateurs
Z
(zip) etX
(croisés) auparavant, comme lesZZ-
etZX*
ici - un peu surpris que cela ait réellement fonctionné.(Les sauts de ligne sont juste ajoutés à des fins d'affichage et ne font pas partie du nombre d'octets.)
la source
JavaScript (ES6), 227
237Fondamentalement, il fait un BFS et se souvient de chaque état atteint afin d'éviter les cycles infinis.
Contrairement à @ aditsu, je ne pense pas qu'il y ait de place pour le golfMoins golfé
Tester
la source