Saltar al contenido

Los interruptores del laboratorio

Enunciado

En el laboratorio viejo nadie sabe qué interruptor es de qué lámpara. Anders Lund, el técnico, ya lo averiguó: cada interruptor está conectado a varias lámparas, y al oprimirlo todas esas cambian: las apagadas se prenden y las prendidas se apagan. Ahora quiere prenderlas todas oprimiendo los menos interruptores posibles.

Escribe una función que reciba n, cuántas lámparas hay (de 1 en adelante; se numeran de 0 a n - 1), e interruptores, una lista donde cada elemento es la lista de las lámparas que cambia ese interruptor (sin repetir lámparas; la lista de interruptores puede venir vacía).

Al principio todas las lámparas están apagadas, y oprimir un interruptor cambia cada una de sus lámparas: la apagada se prende y la prendida se apaga. Cada interruptor se oprime una vez o ninguna, y da igual en qué orden. Regresa un entero: el menor número de interruptores que hay que oprimir para que queden todas prendidas al mismo tiempo, o -1 si no hay manera.

Con 3 lámparas e interruptores [[0, 1], [1, 2], [1]] hay que oprimir los tres: el primero prende la 0 y la 1, el segundo prende la 2 pero apaga la 1, y el tercero la vuelve a prender. Regresa 3. Con 3 lámparas e interruptores [[0, 1], [1, 2]], la 1 siempre acaba apagada si prendes la 0 y la 2, así que regresa -1.

Ejemplos

  • El ejemplo

    3, [[0, 1], [1, 2], [1]] → 3

  • No hay manera

    3, [[0, 1], [1, 2]] → -1

  • El que prende más no va primero

    6, [[0, 1, 2, 3], [0, 1, 2], [3, 4, 5], [4], [5]] → 2

  • Uno solo las prende todas

    4, [[0, 1, 2, 3]] → 1

Además de estas, el reto tiene pruebas ocultas que se revelan al enviar tu solución.

Empiezas con esto

Python

def oprimir(n, interruptores):
    pass

JavaScript

function oprimir(n, interruptores) {
}
Resolver este reto

Se abre en el navegador, con el editor y las pruebas. Este reto es del plan completo; los de O(1) y O(log n) son gratis.

Más retos de O(2ⁿ)

Ver todos los retos →