объяснение
Две строки можно перетасовать, переставляя их буквы, чтобы сформировать новую строку, так же как две стопки карт можно перетасовать, чтобы сформировать одну стопку.
Например, строки HELLO
и WORLD
могут быть перемешаны, чтобы сформировать HWEOLRLLOD
, или HEWORLLLDO
, или, возможно, просто HELLOWORLD
.
Это не случайный порядок, если исходный порядок букв не сохранен. Например, D
in WORLD
не может появиться раньше R
после перетасовки. Это означает, что EHLLOWRDLO
, например, это не случайный случай, HELLO
и WORLD
, хотя он содержит все оригинальные буквы.
Строка - это тасовка близнецов, если она может быть образована путем тасования двух одинаковых струн. Например, ABACBDECDE
это тасование близнецов, потому что оно может быть сформировано путем тасования ABCDE
и ABCDE
. DBEACBCADE
это не тасовка близнецов, потому что она не может быть сформирована путем тасования двух одинаковых строк.
Детали программы
Если задана входная строка, выведите, 0
если она не является случайным образом двойников, и выведите одну из строк двойников, если это случайный случай двойников.
Вы можете предположить, что длина входной строки составляет от четырех до двадцати символов и целиком состоит из прописных буквенных символов. Он должен быть в состоянии запустить в течение разумного количества времени, скажем, менее 10 минут.
Это код гольф, поэтому выигрывает самое короткое решение.
Пример ввода / вывода
> ABACBDECDE
ABCDE
> DBEACBCADE
0
> FFFFFF
FFF
> FFGGG
0
> ABBA
0
> AABB
AB
> AABAAB
AAB
У меня есть пример (не в гольф) реализации .
источник
that the input string has a length inclusively between four and twenty characters
и не говорит мне «никогда не доверяйте вводу пользователя!», «Никогда не доверяйте спецификациям!»FFGGG
чтобы сделать это последовательным.Ответы:
Хаскелл, 114
Ungolfed:
Объяснение:
Большая часть работы выполняется в
partitions
функции. Он работает путем рекурсивного генерирования всех разделов(a, b)
хвоста списка, а затем с помощью монады списка, чтобы добавить начальный элементx
к каждому из них и собрать все результаты.findMatch
работает путем фильтрации этого списка, так что остаются только разделы, в которых подпоследовательности равны. Затем он возвращает первую подпоследовательность в первом разделе. Если ничего не осталось, список пуст, поэтому"0"
вместо него возвращается добавленный в конце.main
просто читает ввод, передает его через эти две функции и печатает его.источник
R, 113 символов
Ungolfed (и вместо этого функция, которая принимает строку):
Решение опирается на
combn
функцию, которая генерирует все комбинации индексов в виде столбцов в матрице.apply
затем применяет функцию к каждому столбцу (измерению2
) в матрице и возвращает вектор строк или нулей.max
затем найдите самую большую строку (которая превосходит 0).Крутой особенностью в R является возможность выбрать подмножество вектора с заданным вектором индексов, а затем выбрать дополнение к этому подмножеству путем отрицания индексов:
x[i] == x[-i]
источник
Математика, 87
Это напрямую основано на посте Хаммара, но, надеюсь, он достаточно отчетлив, чтобы заслуживать публикации.
Тестовое задание:
источник
D
используя глубину сначала рекурсивный поиск
Я могу сделать это быстрее с
int i = min(a.length,b.length);if(a[0..i]!=b[0..i])return "0";
оговоркойисточник
void main(){writeln(c("ABCADABCAD"));}
- просто другая версия D, моя ошибка, что-то еще? Что насчет "ABCABCA"?Рубин, 89 знаков
Этот код реализует простой рекурсивный алгоритм поиска. Ввод должен быть дан на STDIN.
источник
Perl, 68 символов
Предполагается, что входная строка находится в
$_
переменной, а выход является значением выражения. Конечные переводы строк при вводе игнорируются. Вы можете запустить это из командной строки следующим образом:Этот код использует движок регулярных выражений Perl (и, в частности, его встроенную функцию выполнения кода ) для возврата. По сути, он сопоставляет входную строку с регулярным выражением
^((.+))+$
, отслеживая нечетные и четные подспряжения в$x
и$,
и отклоняя совпадение в конце, если они не равны.источник
AABAAB
?AABAAB
это простое решение для этого решения, поскольку внешняя группа должна совпадать только дважды. Мне потребовалось гораздо больше времени, чтобыAABB
правильно ее обработать .)Python, 168 символов
источник