Соедините буквы


10

Вдохновлен этой маленькой игрой .

Вызов

В качестве входных данных задается начальная позиция сетки (всегда 5x5), например:

-ABCD
-A---
---C-
---BD
--E-E

Вам нужно соединить буквы (одинаковые буквы все вместе), удалив все пустые -места. Буквы будут всегда A,B,C,D and E.

Каждая пара букв должна быть соединена одной неразветвленной линией, которая может изгибаться под прямым углом (используя ту же букву для изображения линии).

Входные данные гарантированно будут иметь каждую начальную букву ровно 2 раза и всегда будут иметь все начальные буквы AE.

Входные данные могут быть прочитаны из stdin, или из одной единственной строки в виде аргумента некоторой функции, или даже из массива / матрицы / списка символов, наиболее удобного способа для вашего языка программирования.

Поскольку это выигрывает самый короткий код в байтах!


пример

Существует не только одно решение для каждой проблемы, но правила применяются ко всем (без пустого пространства и без разделенных букв). И на входе гарантированно будет хотя бы один правильный выход.

Давайте начнем соединять буквы A:

AABCD
AA---
AA-C-
AA-BD
AAE-E

Теперь соединяем буквы Б:

AABCD
AAB--
AABC-
AABBD
AAE-E

Теперь соединяем буквы С:

AABCD
AABC-
AABC-
AABBD
AAE-E

Теперь соединяем буквы D:

AABCD
AABCD
AABCD
AABBD
AAE-E

И, наконец, буквы E:

AABCD
AABCD
AABCD
AABBD
AAEEE

Другие образцы

input:
E--E-
BB-C-
AD---
---C-
AD---

output:
EEEEE
BBECE
ADECE
ADECE
ADEEE

input:
A----
---B-
-C-C-
-D-D-
BE-EA

output:
AAAAA
BBBBA
BCCCA
BDDDA
BEEEA

@ Sp3000 не является дуплом, так как этот вызов имеет гарантию правильного ввода.
Натан Меррилл,

Гарантируется, что на каждой входной букве каждая буква будет ровно 2 раза? У него всегда будут все начальные буквы A-E?
Тон Хоспел

1
@NathanMerrill, который кажется довольно незначительной разницей. Я не могу себе представить, что проверка на разрешимость займет большую часть кода.
Мартин Эндер

1
@ MartinBüttner в моей задаче, проверка на разрешимость является проблемой, не требуется подключение. Хотя эти две проблемы будут иметь сходство, они кажутся мне совершенно разными.
Натан Меррилл

4
Моя любимая техника для некоторых подобных вопросов - использовать случайные числа, чтобы заполнить позиции, чтобы избежать отката и остановиться, если я найду решение. Это работает только в том случае, если решение гарантировано, в противном случае программа может работать вечно (если решение гарантировано, вы часто можете написать код, чтобы длительное время выполнения экспоненциально становилось маловероятным в течение более длительного времени). Для этого метода вопросы являются очень разные
Ton Hospel

Ответы:


4

Perl, 130 128 127 байтов

Включает +4 для -n0(программа не работает из командной строки, поэтому -и место тоже учитывается)

Позвонить со входа на STDIN:

perl -n0 connectletters.pl
E--E-
BB-C-
AD---
---C-
AD---

Действие с ^Dили ^Zили что-то закрывает STDIN в вашей системе

connectletters.pl:

/-/?map{$_="$`$_$'";s%\pL%$_="$`0$'";1while do{s/[$&-](.{5}|)0|0(.{5}|)[$&-]/0$+0/s};/$&/||$&%eg;!/1/&&do$0}A..E:exit!print
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.