(Вдохновленный во время рисования на сухой доске стирания)
Вызов:
При наличии входной строки, содержащей символы, которые представляют разные цвета маркеров сухого стирания на белой доске, выведите порядок, в котором они были нарисованы, от первого до последнего.
Входные данные:
Строка, содержащая цвета маркера сухого стирания, которые представлены буквенными буквами (верхние отличаются от строчных, вы можете заменить любые символы, используемые в моих примерах, если каждый цвет имеет отдельную букву). Остальная часть доски будет пустым пространством. Там будет только одна линия каждого цвета на доске. Не будет входов, где все строки перекрывают друг друга (см. Контрольный пример 4
). Все линии будут прямыми и горизонтальными или вертикальными.
Выход:
Порядок, в котором линии были нарисованы на доске, от первого до последнего. Если для любого входа есть несколько решений, вы можете вывести любое из них. Вывод может быть отформатирован так, как вы пожелаете: одна строка символов или разделенные пробелами, символами новой строки и т. Д., Если используемые символы совпадают с теми, которые использовались при вводе.
Тестовые случаи:
Вход 1:
R
R
BBRBB
R
Выход 1:
BR
Вход 2:
GY
GY
RRRRGYRRR
GY
GY
BBBBBBBB
GY
GY
Выход 2:
RGYB // or RYGB
Вход 3:
R P
R P
AAAARAAAAPA
R P
R P
GGGGRGGG P
R
Выход 3:
AGPR // or APGR
Вход 4:
O Y
RRRYR
O Y
GOGGG
O Y
Выход 4:
// Undefined, does not need to be handled by your program
Вход 5:
YYYB
B
B
Выход 5:
// YB or BY
Правила:
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Ответы:
Perl 103 + 2 = 105 байт
Запуск с
-n0
(штраф 2 байта).Объяснение:
Здесь есть небольшая тонкость:
Посмотрите на четвертую строку здесь. Если бы порядок записи был BACBD, то там действительно могла бы быть горизонтальная линия
B
s, не нарушая ни одного из предположений проблемы (кроме того, что есть только одна линия каждого цвета, что мы не проверяем). Чтобы обойти это, в последнем регулярном выражении мы гарантируем, что каждая строка начинается с буквы (или цифры, или подчеркивания, но это невозможно), и полагаемся на тот факт, что параллельные линии будут найдены слева направо и сверху -вниз (потому что регулярное выражение найдет первое совпадение в строке). Таким образом, первый символ каждой неоднозначной строки здесь перезаписывается до того, как сама строка рассматривается как совпадение, и это предотвращает сопоставление с регулярным выражением.источник
perl -n0E '/.*/;for$i(/(\S)(?=(?:(?:.{@{+}})?(?:\1| ))*(?!.*\1))/gs){/.*/;unless(/$i+[^$i\s]+$i/||/$i(.{@{+}}[^$i ])+.{@{+}}$i/s){$r="$i$r";s/$i/ /g;last}}/\S/?redo:say$r'
(что требует, чтобы входные строки были дополнены справа пробелами, чтобы быть одинаковой длины))Python 2, 199 байт
Это закончилось намного дольше, чем я изначально думал. Кроме того,
rindex
я мог видеть это как очень хорошую программу для перевода на Pyth.Берет список строк и выводит список символов. Код рекурсивно генерирует перестановки, следя за тем, чтобы ни одна из нарисованных линий не рисовалась поверх текущей линии.
Код злоупотребляет многими функциями Python, например, использует
w
мощь логического значения, тестирует пустые наборы, проверяя подмножества{0}
(поскольку мои наборы никогда не содержат нестроковых значений ), и мой любимый, отличая любой список отNone
проверки, если его Представление больше, чемZ
.Объясненный код
источник