L'autre jour, notre équipe s'est rendue dans une salle d'évasion. L'un des casse-tête impliquait une carte de six interrupteurs mécaniques où vous deviez trouver la bonne combinaison d'activation et de désactivation afin de déverrouiller une boîte, un peu comme ceci:
-v-v-v-
-v-v-v-
En tant que développeurs, nous avons décidé qu'il serait plus efficace d'essayer chacune des combinaisons 2 ^ 6 = 64 que de résoudre le puzzle. Nous avons donc assigné un pauvre gars pour faire un comptage binaire:
-v-v-v-
-v-v-v-
-v-v-v-
-v-v-^-
-v-v-v-
-v-^-v-
-v-v-v-
-v-^-^-
etc.
Le défi
Écrivez un programme qui, étant donné que les commutateurs sont tous en position d'arrêt sous forme de chaîne formatée comme ci-dessus, génère toutes les combinaisons d'activation et de désactivation dans n'importe quel ordre.
Vous pouvez écrire soit un programme complet soit une fonction. Ainsi, votre programme peut soit prendre en entrée via stdin, un fichier, soit en tant qu'argument de chaîne unique, et retourner ou imprimer la sortie. S'il est retourné, la sortie peut être dans une liste / tableau / etc. plutôt qu'une seule chaîne. Si la sortie est une seule chaîne, les tableaux doivent être séparés par des retours à la ligne (les retours à la ligne sont autorisés.)
Les chaînes d'entrée correspondront à l'expression régulière r'((-v)+-)(\n(-v)+-)*'
et représenteront une carte avec tous les commutateurs désactivés. Cela signifie qu'il n'y a pas de cas zéro et que les commutateurs sont alignés à gauche. Chaque ligne peut ne pas avoir le même nombre de commutateurs.
Chaque carte de sortie doit avoir exactement le même format que l'entrée, sauf que les v peuvent être remplacés par des ^ si nécessaire. Les cartes de sortie peuvent être séparées par un nombre quelconque de sauts de ligne.
Étant donné que l'exécution est naturellement O (2 ^ n) dans le nombre de commutateurs, votre code ne sera pas testé sur plus de 10 commutateurs dans n'importe quel arrangement.
C'est le code-golf, donc le code le plus court en nombre d'octets gagne.
Exemples d'entrées et de sorties
Contribution:
-v-
Sortie possible:
-v-
-^-
Contribution:
-v-
-v-
Sortie possible:
-^-
-^-
-^-
-v-
-v-
-^-
-v-
-v-
Puisqu'il est extrêmement fastidieux de vérifier votre réponse pour un plus grand nombre de commutateurs, voici un script Python en tant qu'outil de vérification d'intégrité. (J'ai inclus un extrait actuellement commenté pour générer la sortie attendue à partir d'un fichier d'entrée donné au cas où vous voudriez plus de cas de test.) C'est un peu moins flexible en termes d'entrée et de sortie que la spécification, malheureusement; placez la chaîne d'entrée dans un fichier nommé 'input' et la sortie séparée par la nouvelle ligne (désolé, pas de formatage de liste) dans un fichier nommé 'output' dans le même répertoire et exécutez python3 sanitycheck.py
.