No outro dia, nossa equipe foi para uma sala de fuga. Um dos quebra-cabeças envolvia uma placa de seis interruptores mecânicos, onde era necessário encontrar a combinação correta de ligar e desligar para destravar uma caixa, mais ou menos assim:
-v-v-v-
-v-v-v-
Sendo desenvolvedores, decidimos que seria mais eficiente tentar todas as combinações 2 ^ 6 = 64 do que realmente resolver o enigma. Então, designamos um cara pobre para fazer uma contagem binária:
-v-v-v-
-v-v-v-
-v-v-v-
-v-v-^-
-v-v-v-
-v-^-v-
-v-v-v-
-v-^-^-
e assim por diante.
O desafio
Escreva um programa que, considerando todos os interruptores na posição desligado, como uma string formatada como acima, gere todas as combinações de ligado e desligado em qualquer ordem.
Você pode escrever um programa completo ou uma função. Portanto, seu programa pode receber entradas através de stdin, um arquivo ou como um argumento de cadeia única e retornar ou imprimir a saída. Se retornado, a saída pode estar em uma lista / array / etc. em vez de uma única sequência. Se a saída for uma única sequência, as placas deverão ser separadas por novas linhas (novas linhas finais são permitidas).
As seqüências de entrada corresponderão ao regex r'((-v)+-)(\n(-v)+-)*'
e representarão uma placa com todos os interruptores desativados. Isso significa que não há zero caso, e os comutadores estão alinhados à esquerda. Cada linha pode não ter o mesmo número de opções.
Cada placa de saída deve ter exatamente o mesmo formato da entrada, exceto que os vs podem ser substituídos por ^ 's conforme necessário. As placas de saída podem ser separadas por qualquer número de novas linhas.
Como o tempo de execução é naturalmente O (2 ^ n) no número de comutadores, seu código não será testado em mais de 10 comutadores em qualquer organização.
Este é o código-golfe, pelo que o código mais curto em número de bytes vence.
Amostras de entradas e saídas
Entrada:
-v-
Saída possível:
-v-
-^-
Entrada:
-v-
-v-
Saída possível:
-^-
-^-
-^-
-v-
-v-
-^-
-v-
-v-
Como é extremamente tedioso verificar sua resposta para um número maior de opções, aqui está um script Python como uma ferramenta de verificação de integridade. (Incluí um trecho comentado no momento para gerar a saída esperada de um determinado arquivo de entrada, caso você queira mais casos de teste.) É um pouco menos flexível em termos de entrada e saída do que a especificação, infelizmente; coloque a string de entrada em um arquivo chamado 'input' e a saída separada por nova linha (desculpe, sem formatação de lista) em um arquivo chamado 'output' no mesmo diretório e execute python3 sanitycheck.py
.