Hay un río y hay lobos y gallinas a un lado del río. Tienen una balsa y todos necesitan llegar al otro lado. Sin embargo, la balsa no puede viajar sola. La balsa se hundirá si hay más de dos animales en ella. Ninguno de los animales quiere mojarse porque el río está frío y sucio. Ninguno de los animales puede saltar o volar sobre el río. Además, si hay pollos en un lado, no puede haber más lobos en ese lado que pollos en ese lado: los lobos decidirán comerlos. Esto significa que no puedes llevar a dos lobos en la balsa a un lado con un pollo.
Su tarea es hacer un programa / función que tome una cantidad de lobos y una cantidad de pollos (mayor o igual que la cantidad de lobos) como entrada y encuentre la menor cantidad de veces que la balsa tiene que moverse a través del río. Si la tarea no es posible, el programa / función debería generar / devolver una cadena vacía. Luego imprimirá / devolverá un método sobre cómo se hace de la siguiente manera:
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
Como puede deducir, la balsa se moverá automáticamente en direcciones alternas (izquierda y derecha, comenzando de izquierda a derecha cuando el primero o dos animales crucen el río). Esto no necesita ser enviado / devuelto. 'W', 'C', 'CW', 'CC' o 'WW' en la salida pueden estar separados por al menos uno de los siguientes:
spaces (' ')
commas (',')
newlines
Alternativamente, puede almacenar las instrucciones como elementos en una lista (una lista vacía significa que no hay solución).
Casos de prueba (salida separada por comas - la entrada toma la forma 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
Intenta hacer que tu código sea lo más corto posible en bytes.
fuente
Respuestas:
Perl,
179165164163157156 bytesIncluye +4 para
-p
Dar lobos seguidos de pollos en STDIN
Emite el contenido del barco por línea. Para este ejemplo da:
river.pl
:Funciona como se muestra, pero reemplaza
\xhh
y\n
por sus versiones literales para obtener la puntuación reclamada.Esto probablemente será superado por un programa que resuelva el caso general (C> W> 0)
Agregue a eso las soluciones triviales para solo lobos y solo pollos y un estuche especial codificado para
2 2
y3 3
(4 4
y más alto no tienen solución). Pero ese sería un programa aburrido.Explicación
El estado actual del campo se almacena como una sola cadena que consiste en:
w
para un lobo en la orilla con el botec
por un pollo en la orilla con el bote\x88
(poco invertidow
) para un lobo en el otro banco\x9c
(poco invertidoc
) para un pollo en el otro bancoP
para la orilla derecha,\xaf
(bit invertidoP
) para la orilla izquierda (lado inicial)\n
WC\nW\nWC\nC\n
(observe losW
syC
están en mayúsculas aquí)La matriz
@F
contendrá todos los estados accesibles. Se inicializa con la cadena de iniciowolves times "w", chickens times "c", \xaf \n
Luego, el programa realiza un bucle
@F
que se extenderá durante el bucle para que también se procesen nuevos estados. Para cada elemento, entonces hace:\n
que representa la posición actual de los animales y el bote. Si eso se ha visto antes de saltar$a{$`x/\n/}++
grep(y/c//<y/w//&/c/,$_,~$_)
$\
y guárdelo ya que la primera solución encontrada es la más corta$\||=$' x/^\w*\n/
c
yw
personajes. (Los animales del otro lado no coincidirán\w
)/(\w?)(.*)(c|w)(.+)\n(?{code})^/
. Luego, invierta la cadena completa antes de la\n
excepción de los animales que fueron seleccionados para el botepush@F,$1.$3.~"$`$2$4\xf5"
. Agregue los animales seleccionados a los movimientos en mayúsculas:uc"$'$1$3\n"
El proceso de selección de animales baraja efectivamente la parte de la cuerda que los representa de muchas maneras. Entonces, por ejemplo,
wcwc
ywwcc
ambos pueden llegar a representar 2 lobos y 2 pollos. La comprobación de estado$a{$`x/\n/}++
distinguirá de manera poco práctica estos dos estados, por lo que se generarán y comprobarán muchos más estados de los necesarios. Por lo tanto, el programa se quedará sin memoria y tiempo tan pronto como el número de animales diferentes aumente. Esto se mitiga solo un poco por el hecho de que la versión actual dejará de agregar nuevos estados una vez que se encuentre una soluciónfuente
WC,C,WC
hay 2 lobos y 1 pollo en la orilla derecha. Juego terminadoJavaScript (ES6),
251264...244240 bytesToma el número de lobos y gallinas
(w, c)
y devuelve una de las soluciones óptimas, oundefined
si no hay solución.Formateado y comentado
Función de envoltura:
Función recursiva principal:
Casos de prueba
Mostrar fragmento de código
fuente
and finds the smallest number of times the raft has to move across the river.
. así que no creo que sea una solución válidaCJam, 133
Pruébalo en línea
Explicación:
Básicamente, el programa realiza un BFS y recuerda cada estado alcanzado para evitar ciclos infinitos. Los estados de trabajo se representan como [[Wl Cl] [Wr Cr] M1 M2 ... Mn] donde W = lobos, C = pollos, l = lado izquierdo, r = lado derecho, M = movimientos realizados hasta ahora (inicialmente ninguno), y los movimientos son como "C", "WC" o "WW", etc. (prácticamente más como ["" "C"], ["W" "C"], ["WW" ""], pero es lo mismo al imprimir). Los estados recordados se representan como [[Wl Cl] [Wr Cr] S] donde S es el lado del barco (0 = izquierda, 1 = derecha).
fuente
Perl 6 , 268 bytes
Genera cadenas de
(wolf count, chicken count)
estados cada vez más largas para la orilla izquierda y devuelve la primera que coincide con todas las reglas.Resulta que este enfoque no es eficiente ni muy conciso, pero al menos fue divertido escribirlo.
No creo que nunca haya apilado los meta-operadores
Z
(zip) yX
(cross) antes, como elZZ-
yZX*
aquí, un poco sorprendido de que realmente haya funcionado.(Las nuevas líneas solo se agregan para fines de visualización y no forman parte del recuento de bytes).
fuente
JavaScript (ES6), 227
237Básicamente, hace un BFS y recuerda cada estado que alcanzó para evitar ciclos infinitos.
A diferencia de @ aditsu, no creo que haya lugar para el golfMenos golf
Prueba
fuente