El otro día, nuestro equipo fue a una sala de escape. Uno de los acertijos involucraba una placa de seis interruptores mecánicos donde tenía que encontrar la combinación correcta de encendido y apagado para desbloquear una caja, algo así:
-v-v-v-
-v-v-v-
Como desarrolladores, decidimos que sería más eficiente probar cada una de las combinaciones 2 ^ 6 = 64 que resolver el rompecabezas. Entonces le asignamos a un pobre tipo que haga un recuento binario:
-v-v-v-
-v-v-v-
-v-v-v-
-v-v-^-
-v-v-v-
-v-^-v-
-v-v-v-
-v-^-^-
y así.
El desafío
Escriba un programa que, dado que todos los interruptores están en la posición de apagado como una cadena con el formato anterior, genera todas las combinaciones de encendido y apagado en cualquier orden.
Puede escribir un programa completo o una función. Por lo tanto, su programa puede recibir la entrada a través de stdin, un archivo o como un argumento de cadena única, y puede devolver o imprimir la salida. Si se devuelve, la salida puede estar en una lista / matriz / etc. en lugar de una sola cadena. Si la salida es una sola cadena, los tableros deben estar separados por nuevas líneas (se permiten nuevas líneas finales).
Las cadenas de entrada coincidirán con la expresión regular r'((-v)+-)(\n(-v)+-)*'
y representarán una placa con todos los interruptores apagados. Esto significa que no hay mayúsculas y cero, y los interruptores están alineados a la izquierda. Es posible que cada fila no tenga el mismo número de interruptores.
Cada placa de salida debe tener exactamente el mismo formato que la entrada, excepto que las v se pueden reemplazar por ^ 's según sea necesario. Las placas de salida se pueden separar por cualquier número de nuevas líneas.
Dado que el tiempo de ejecución es naturalmente O (2 ^ n) en la cantidad de interruptores, su código no se probará en más de 10 interruptores en ninguna disposición.
Este es el código de golf, por lo que gana el código más corto en número de bytes.
Muestra de entradas y salidas
Entrada:
-v-
Salida posible:
-v-
-^-
Entrada:
-v-
-v-
Salida posible:
-^-
-^-
-^-
-v-
-v-
-^-
-v-
-v-
Dado que es extremadamente tedioso verificar su respuesta para un mayor número de interruptores, aquí hay un script de Python como una herramienta de verificación de cordura. (He incluido un fragmento actualmente comentado para generar la salida esperada de un archivo de entrada dado en caso de que desee más casos de prueba). Desafortunadamente, es un poco menos flexible en términos de entrada y salida que la especificación; coloque la cadena de entrada en un archivo llamado 'input' y la salida separada por la nueva línea (lo siento, sin formato de lista) en un archivo llamado 'output' en el mismo directorio y ejecútelo python3 sanitycheck.py
.