Днями наша команда вирушила до кімнати втечі. Одна з головоломок включала дошку з шести механічних вимикачів, де вам довелося знайти правильну комбінацію ввімкнення та вимкнення, щоб розблокувати коробку, приблизно так:
-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
.