Tu reto:
Estás en el piso 0 de un edificio infinitamente alto. En cualquier piso, puedes caminar hacia la ventana y dejar caer un huevo. Su objetivo es descubrir el piso más alto que el huevo puede soportar sin romperse. Sin embargo, tiene un máximo de 3 huevos para resolver esto, pero debe minimizar el número de intentos.
En términos formales:
- Se le da una función
f(n)
que devuelvebool(n <= X)
para un desconocidoX
, donde0 <= X
- Debe devolver el valor de
X
(sin acceder directamente a él) f(n)
solo debe devolverFalse
un máximo de3
veces (en un solo caso de prueba). Si devuelveFalse
más que eso, entonces su respuesta es descalificada.
Restricciones
Su puntaje es el número total de llamadas que realiza f(n)
(en los casos de prueba a continuación)
Si lo desea, puede renunciar a pasar una función y simplemente "simular" la situación anterior. Sin embargo , su algoritmo de resolución no debe saber nada X
.
Su algoritmo no debe codificar los casos de prueba, o un máximo X
. Si tuviera que regenerar los números, o agregar más, su programa debería ser capaz de manejarlos (con una puntuación similar).
Si su idioma no admite enteros de precisión arbitrarios, puede usar el long
tipo de datos. Si su idioma tampoco es compatible, entonces no tiene suerte.
El enésimo caso de prueba se genera utilizando lo siguiente:
g(n) = max(g(n-1)*random(1,1.5), n+1), g(0) = 0
o aproximadamente 1.25^n
Casos de prueba:
0,1,2,3,4,6,7,8,10,14,15,18,20,27,29,40,57,61,91,104,133,194,233,308,425,530,735,1057,1308,1874,2576,3162,3769,3804,4872,6309,7731,11167,11476,15223,15603,16034,22761,29204,35268,42481,56238,68723,83062,95681,113965,152145,202644,287964,335302,376279,466202,475558,666030,743517,782403,903170,1078242,1435682,1856036,2373214,3283373,4545125,6215594,7309899,7848365,8096538,10409246,15103057,20271921,22186329,23602446,32341327,33354300,46852754,65157555,93637992,107681394,152487773,181996529,225801707,324194358,435824227,579337939,600264328,827690923,1129093889,1260597310,1473972478,1952345052,1977336057,2512749509,3278750235,3747691805,5146052509
Este es un desafío de código , ¡y la persona con la puntuación más baja gana!
fuente
Respuestas:
Javascript,
44285944285774825 llamadasPrueba aquí
Puntuaciones para cada caso de prueba individual:
Cómo funciona:
1 huevo:
Cuando hay un huevo, la mejor estrategia es subir 1 piso a la vez y regresar el piso directamente debajo del piso donde se rompe primero.
2 huevos:
Cuando tenemos dos huevos, el número máximo de pisos que tenemos que verificar será el n más pequeño para el cual T n es mayor que el rango de pisos que tenemos que verificar. T n es el enésimo número de triángulo. El primer lanzamiento se realizará en el enésimo piso. El segundo lanzamiento se realizará
n - 1
pisos por encima del primer lanzamiento. El lanzamiento enésimo se harán - m + 1
pisos por encima delm - 1
lanzamiento en th. Después de que el huevo se rompa, se necesitaránn - m
tiradas para determinar el piso mediante el primer método.3 huevos:
Con el primero de nuestros huevos debemos determinar un límite superior para el piso más alto. Originalmente, hice esto duplicando el número de piso cada vez. Después de analizar el algoritmo para 2 huevos, pensé que tal vez sería mejor si cada vez que tiramos el huevo, los lanzamientos máximos para encontrar el piso correcto con 2 huevos aumentarían en 1. Esto puede satisfacerse usando los números tetraédricos. Después de que se rompa el primer huevo, podemos usar los métodos anteriores para los huevos restantes.
El máximo de gotas de huevo que requiere para determinar que el piso debe ser óptimo. Sin embargo, probablemente se podría encontrar un mejor algoritmo donde el promedio de gotas de huevo es mejor.
fuente
Java, 68985 llamadas
Resultados de la prueba:
Programa de prueba:
Mientras optimizaba, intenté hacer que el número de intentos con cada huevo fuera aproximadamente igual.
fuente
Ruby,
6746666026 llamadasCódigo de prueba:
Resultados:
Este algoritmo funciona como mi antiguo algoritmo, pero tiene algunas diferencias:
La primera gota de huevo está en el piso 8
El primer incremento es 8 * 8 = 64
Estos números son el resultado de un ajuste aleatorio a mano.
fuente