Es posible que haya visto este en Die Hard: With a Vengeance ... Esta pregunta se basa en el famoso rompecabezas de jarras de 3 y 5 litros, pero con una inclinación ligeramente diferente.
Obtenga un código que, cuando se le da un número entero entre 1 y 100, le proporcionará las instrucciones más rápidas para medir en un tanque, la cantidad correspondiente de litros de agua de una fuente, utilizando una jarra de 3 litros y una jarra de 5 litros.
No hay gradaciones en ninguna de las jarras; la fuente es abundante en el suministro de agua, y se supone que el tanque se vacía al comienzo de cada ejecución del código.
No puede acceder al agua del tanque una vez que entra en el tanque.
El formato de ejecución es el siguiente:
Entrada:
4
por ejemplo.
Salida
Salida de cada paso numerado, como se muestra, seguido de una cuenta de los volúmenes de la jarra de 5L, la jarra de 3L y el tanque. El formato de conteo también se muestra a continuación. El número de pasos también se debe generar al final de los pasos.
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into 3L jug
5L: 2, 3L: 3, T: 0
3) Empty 3L jug
5L: 2, 3L: 0, T: 0
4) Pour from 5L jug into 3L jug
5L: 0, 3L: 2, T: 0
5) Fill 5L jug
5L: 5, 3L: 2, T: 0
6) Pour from 5L jug into 3L jug
5L: 4, 3L: 3, T: 0
7) Pour from 5L jug into tank
5L: 0, 3L: 3, T: 4
Volume measured out in 7 turns
Ejemplo 2
Entrada: 8
Salida:
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
3) Fill 3L jug
5L: 0, 3L: 3, T: 5
4) Pour from 3L jug into tank
5L: 0, 3L: 0, T: 8
Volume measured out in 4 turns
Convenciones
Fill xL jug
- llena la jarra asociada hasta la parte superior de la fuenteEmpty xL jug
- vacía el contenido de la jarra asociada en la fuentePour from xL jug into yL jug
- Vierte el contenido de la jarra xL en la jarra yLPour from xL jug into tank
- Vierte el contenido de la jarra xL en el tanque
El código más corto gana.
fuente
Respuestas:
Rubí,
407376365331324323Esto se está volviendo difícil de leer ...
Toma entrada en STDIN. Ejemplo ejecutado para N = 10:
fuente
T-SQL 2012:
14101302Otro intento quijotesco de una pregunta en SQL, pero este ofreció una oportunidad agradable para jugar con algunas de las nuevas opciones de función de ventana en la versión 2012. Además, explota los CTE recursivos, que pueden no ser nada impresionantes en la mayoría de los lenguajes de programación, pero la recursividad en SQL es como cambiar de caballo y buggy a Ferrari.
El motor central de esto está en las líneas 5-12, que usa un CTE recursivo y una función de ventana para construir una tabla con la mayoría de los números necesarios para resolver el problema. Observe en particular la prueba para 3, 4, 6 o 9, que garantiza un enfoque óptimo de la solución en 3s a partir de esos números. (Técnicamente, es un empate para 4 entre el enfoque de 3-1 y el 2-2, pero hacerlo de esta manera me dio muchos personajes). Entonces es simple unirse a una tabla de búsqueda de los pasos óptimos para diferentes fragmentos del problema y usar otra función de ventana para numerar correctamente los pasos.
Si no tienes MS SQL por ahí, juega con él en SQLFiddle.
Resultados para la entrada 42:
Editar:
Golfed una mejora decente puntuación por
fuente
Javascript: 481
Primer intento de golf, consejos apreciados
Se equivoca con algunos números porque no comprueba si es mejor verter 3 o 5, por ejemplo: 9 da 9 vueltas en lugar de 6, podría arreglarlo más tarde
Pegarlo en la consola
De 553 a 481 gracias a @WallyWest
fuente
n=["3L jug","5L jug","tank"];l=[0,0,0];t=[3,5,0];h=0;c=console;function e(d){l[d]=t[d];c.log(++h+") Fill "+n[d]);k()}function m(d,g){s=l[d];f=l[g];b=s+f>t[g];l[g]=b?t[g]:f+s;l[d]=b?s-(t[g]-f):0;c.log(++h+") Pour from "+n[d]+" into "+n[g]);k()}function k(){c.log("5L: "+l[1]+", 3L: "+l[0]+", T: "+l[2])}a=prompt();for(t[2]=a;4<a;)e(1),m(1,2),a-=5;2<a&&(e(0),m(0,2),a-=3);1<a&&(e(1),m(1,0),m(1,2),a=0);0<a&&(e(0),m(0,1),e(0),m(0,1),m(0,2));c.log("Volume measured out in "+h+" turns")
para 481 caracteres ...if
sJava, 610
Tomé la solución de Sumedh y la jugué. Quería ponerlo en los comentarios, pero mi reputación no es suficiente :(. Es un 40% menos, creo que al menos debería ser compartido. Sin embargo, aún lejos de ser el primero ...
Aquí está sin golf:
NB: solo funciona en la primera ejecución. Vuelva a ejecutarlo y el resultado será incorrecto (debido a una variable global).
La siguiente versión es segura, pero perdemos 2 caracteres, pasando de 610 a 612:
Salida de muestra para N = 69:
fuente
Java: 984
Aquí está el código
La entrada es desde la línea de comando. por ejemplo: java X 4
fuente
main(String[]s)
,int n=Integer.parseInt(s[0]),t=0,c=0;
,java.io.PrintStream q=System.out;
. Además, puede ser posible escribir el primerowhile
como uno o dos caracteres más cortosfor
. Además, susString
correos electrónicos son repetitivos, puede intentar almacenar partes repetitivas en variables o crear funciones que las construyan utilizando solo un prefabricadoString
.Python 2.7 - 437
No es el código más corto, pero creo que esta es la forma más óptima de resolver esto.
Como dije en los comentarios, la forma más óptima de calcular esto:
divmod(amount,5)
. Esto le dará uno de 4,3,2,1 como el resto.Lo que deja 1 o 2 como el resto. Use la solución óptima para cualquiera de las cuales se puede conocer de antemano como:
El código:
Y una salida para 4L en 7 pasos:
fuente
Smalltalk (Smalltalk / X),
568 560516entrada en n:
este es definitivamente el programa más ofuscado que he escrito ...
Editar: Algunos Smalltalks pueden no permitir variables de espacio de trabajo autodeclaradas y tendrá que anteponer declaraciones. También bindWith: puede ser diferente (expandWith: '<p>').
salida de muestra para n = 17:
fuente
C,
567609versión anterior no válida:
y aquí está el código desglosado:
fuente
C (
480465 bytes)Versión óptima (agrega 10 bytes)
Probablemente más golf por hacer aquí: las funciones de salida me estaban matando. Esto debería dar la solución óptima (menor número de pasos). Similar a otro código aquí, llena y vacía las jarras de 5L hasta llegar a menos de 5 y luego cambia a jarras de 3L. Prueba 2 casos especiales (6 y 9) y si los encuentra cambia a jarras de 3 litros. Las instrucciones para obtener 1L y 2L están codificadas.
Versión más legible:
Ediciones:
Salida de prueba para n = 11 (versión óptima):
fuente
T-SQL (2012):
794689580Inspirado por la respuesta T-SQL de @ Jonathan-Van-Matre en combinación con el algoritmo de @ Lego-Stormtroopr . Quería hacer esto porque disfruté de las 99 botellas de cerveza desafío de .
Traté de mantener la ventana (
OVER
funciones de ) como mínimo en preferencia de las funciones matemáticas / bool.SQLFiddle está aquí .
Entrada:
11
Legible por humanos:
fuente
input = 8
input = 11
Python 3 (417 caracteres)
Explicado
Tenga en cuenta que tenemos 4 objetos, a saber, la jarra de 3L, la jarra de 5L, el tanque y el foutain. Las únicas operaciones que podemos hacer es mover el agua de un objeto
a
a otrob
. Esta es la funcióno(a, b)
hago en mi código: mover agua e imprimirla y seguir contando.Trucos
N=['3L jug','5L jug','tank',0]
. Aquí necesito el último elemento para evitarIndexError
. Además, se puede usar como la variable de conteo global, sin laglobal
palabra clave expansiva . Por ejemplo,N[3] += 1
Dado que
0 <= a < 4, 0 <= b < 4
en funcióno(a, b)
, podemos codificar(a, b)
en un dígito hexadecimal usando(a << 2) | b
, y decodificarlo usandodivmod(x, 4)
. Con este truco, las 5 soluciones (reminder=0, 1, 2, 3, 4
) se pueden codificar en una matriz['','c1c12','d46','c2','d434d46']
, que es un poco más corta que su forma original:A=[ (), ((3,0),(0,1),(3,0),(0,1),(0,2)), ((3,1),(1,0),(1,2)), ((3,0),(0,2)), ((3,1),(1,0),(0,3),(1,0),(3,1),(1,0),(1,2)) ]
Salida de muestra (n = 17)
fuente
COBOL (IBM Enterprise COBOL) 192 líneas de 72 caracteres
Esta es una prueba de concepto para la pregunta, y el comienzo de una para Golf-COBOL :-)
La pregunta pide la más rápida. Entonces, implemente el paralelismo. Incluso una persona puede llenar fácilmente una jarra de 3 litros y una de 5 litros al mismo tiempo.
Simplemente divida la entrada entre ocho, dejando también el resto. Realice algunos rellenos rápidos de 5L / 3L hasta la cantidad de ocho ajustes exactos, luego trate con el uno a siete litros restantes.
Lo más interesante del resto es para cuatro litros. Hacerlo como un litro más tres litros empuja mucha menos agua, solo 18 litros frente a 23 para las otras posibilidades.
El Código (en funcionamiento)
Esto obtiene una carga absoluta de mensajes de diagnóstico para el código que comienza en el lugar incorrecto y la escasez de puntos completos necesarios.
Ninguno de los diagnósticos indica ningún impacto en el código objeto. Entonces, a pesar de ser un RC = 8 reventado, sé que el objeto estará bien, así que lo vinculé y lo ejecuté.
Aquí están las salidas de uno a ocho litros. Después de eso, todos los resultados pueden ser intuidos. 17 y 100 se incluyen como ejemplos del paralelismo.
Todavía hay mucho por hacer para exprimir el programa en caracteres, la salida correcta fue lo importante primero. Contar los caracteres cuando están en líneas de longitud fija es algo completamente distinto.
Salida de muestra:
fuente