З’єднайте букви


10

Натхненна цією маленькою грою .

Виклик

Подано в якості початкового положення сітки (завжди 5x5), наприклад:

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

Вам потрібно з'єднати літери (однакові букви всі разом), видаливши всі порожні -пробіли. Букви будуть завжди A,B,C,D and E.

Кожна пара букв повинна бути з'єднана однією нерозгалуженою лінією, яка може згинатись під прямим кутом (використовуючи ту саму букву для зображення лінії).

Гарантія буде мати кожну початкову літеру рівно 2 рази, і вона завжди матиме всі початкові літери AE.

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

Оскільки це найкоротший код у байтах виграє!


Приклад

Для кожної проблеми існує не одне рішення, але правила стосуються всіх (немає порожнього місця та не відокремлених літер). І вхід гарантовано мати хоча б один правильний вихід.

Почнемо з'єднувати букви А:

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

Тепер, з'єднавши літери B:

AABCD
AAB--
AABC-
AABBD
AAE-E

Тепер, з'єднавши літери С:

AABCD
AABC-
AABC-
AABBD
AAE-E

Тепер, з'єднавши літери D:

AABCD
AABCD
AABCD
AABBD
AAE-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.