El giro de la cinta
- O(log n) · Fácil
- Gratis
- Python
- JavaScript
- listas
- búsqueda
- comparaciones
Enunciado
Rubén entra al turno de noche y se encuentra en el suelo la cinta que imprime los códigos de las piezas. La cinta los imprime de menor a mayor, pero alguien cortó el rollo en un punto y pegó el principio al final: ahora la lista arranca por la mitad, sube hasta el código más grande y vuelve a empezar desde el más chico.
Escribe una función que reciba la lista de códigos y regrese la posición del código más chico, contando desde 0. Con 40, 52, 60, 7, 14, 22 y 31 regresas 3, porque el 7 quedó en la posición 3. Si nadie cortó el rollo, el más chico sigue al frente y regresas 0.
Los códigos son todos distintos y la cinta nunca llega vacía. Que sean distintos importa: con dos códigos iguales en los bordes no habría manera de saber de qué lado quedó el corte.
No se vale buscar el más chico con lo que ya trae el lenguaje (min, Math.min, index, indexOf): el chiste del reto es no leer la cinta completa.
Idea: en cada paso te queda un tramo de la cinta. Compara el código de en medio de ese tramo con el código donde termina ese mismo tramo, no con el último de la cinta completa. Si el de en medio es más grande, el corte quedó a su derecha y la mitad izquierda ya no la vuelves a mirar. Si no, el más chico es el de en medio o está antes.
Ejemplos
El rollo que alguien cortó
[40, 52, 60, 7, 14, 22, 31] → 3
Nadie cortó el rollo
[7, 14, 22, 31, 40, 52, 60] → 0
Cortado después del primero
[9, 1, 3, 5, 7] → 1
Cortado antes del último
[2, 3, 4, 5, 1] → 4
Dos códigos
[8, 4] → 1
Además de estas, el reto tiene pruebas ocultas que se revelan al enviar tu solución.
Empiezas con esto
Python
def punto_de_giro(codigos):
passJavaScript
function puntoDeGiro(codigos) {
}Se abre en el navegador, con el editor y las pruebas. Es gratis y no hace falta cuenta para empezar.