Saltar al contenido

El giro de la cinta

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):
    pass

JavaScript

function puntoDeGiro(codigos) {
}
Resolver este reto

Se abre en el navegador, con el editor y las pruebas. Es gratis y no hace falta cuenta para empezar.

Más retos de O(log n)

Ver todos los retos →