На днях наша команда отправилась в комнату побега. Одна из головоломок была связана с платой из шести механических переключателей, где вам нужно было найти правильную комбинацию включения и выключения, чтобы разблокировать коробку, примерно так:
-v-v-v-
-v-v-v-
Будучи разработчиками, мы решили, что было бы эффективнее попробовать каждую из 2 ^ 6 = 64 комбинаций, чем решить головоломку. Итак, мы назначили какого-то бедного парня для двоичного подсчета:
-v-v-v-
-v-v-v-
-v-v-v-
-v-v-^-
-v-v-v-
-v-^-v-
-v-v-v-
-v-^-^-
и так далее.
Задача
Напишите программу, которая, учитывая все переключатели в выключенном положении в виде строки, как указано выше, генерирует все комбинации включения и выключения в любом порядке.
Вы можете написать либо полную программу, либо функцию. Таким образом, ваша программа может принимать входные данные через stdin, файл или в виде строкового аргумента, а также возвращать или распечатывать выходные данные. Если возвращено, вывод может быть в списке / массиве и т. Д. а не одна строка. Если выходные данные представляют собой одну строку, доски должны быть разделены символами новой строки (конечные символы новой строки разрешены).
Входные строки будут соответствовать регулярному выражению r'((-v)+-)(\n(-v)+-)*'
и представляют одну плату со всеми выключенными выключателями. Это означает отсутствие нуля, и переключатели выровнены по левому краю. Каждая строка может не иметь одинакового количества переключателей.
Каждая плата вывода должна быть точно такого же формата, что и входные данные, за исключением того, что буквы v могут быть заменены символами ^ при необходимости. Таблицы вывода могут быть разделены любым количеством новых строк.
Поскольку время выполнения, естественно, равно O (2 ^ n) по количеству переключателей, ваш код не будет тестироваться на более чем 10 переключателях в любом порядке.
Это код-гольф, поэтому выигрывает самый короткий код в количестве байтов.
Образцы входов и выходов
Входные данные:
-v-
Возможный вывод:
-v-
-^-
Входные данные:
-v-
-v-
Возможный вывод:
-^-
-^-
-^-
-v-
-v-
-^-
-v-
-v-
Поскольку проверять ваш ответ на большее количество переключателей крайне утомительно, вот скрипт Python как инструмент проверки работоспособности. (Я включил закомментированный в настоящее время фрагмент кода для генерации ожидаемого вывода из заданного входного файла на случай, если вам нужно больше тестовых случаев.) К сожалению, он немного менее гибок в плане ввода и вывода, чем спецификация; поместите входную строку в файл с именем 'input', а вывод с разделителями новой строки (извините, форматирование списка отсутствует) в файл с именем 'output' в том же каталоге и запустите python3 sanitycheck.py
.