Это был вдохновлен теперь удалены CS.SE вопрос .
задача
Учитывая две непустые входные строки A и B, выведите наименьшее расстояние от A до палиндрома, который содержит B в качестве подстроки. Расстояние определяется количеством замен символов ( расстояние Хэмминга ).
ограничения
- Разумный вклад: существует палиндром. Это означает, что | A | ≥ | B |.
- A и B содержат только нижние символы ASCII, строчные и прописные различаются (как и все остальные символы).
- Если ваш язык не может работать с символами ASCII, вы также можете использовать целые числа (или какой-либо другой разумный тип данных) и можете ограничить диапазон до 128 элементов.
- Вы можете получить ввод из стандартного ввода, аргументов функции, аргументов командной строки и т. Д.
- Вы можете дать результат на стандартный вывод, возвращаемое значение и т. Д.
- Вам не нужно давать рабочий палиндром, достаточно наименьшего расстояния до одного.
Примеры
A B Output
thilloaoyreot hello 4 (thelloaolleht)
benjonson stack 9 (stackcats)
neversaynever! odd 9 (neveroddoreven)
ppcggcpp gg 0 (ppcggcpp)
stars tat 1 (stats)
счет
Это код гольф, выигрывает самый короткий код в байтах.
code-golf
string
palindrome
Сообщество
источник
источник
Pyth, 45 байт
Попробуйте онлайн. Тестирование.
Я до сих пор не совсем доволен тем, как это получилось. Но, по крайней мере, сейчас довольно сложно понять без объяснения причин. (Успех, наверное?)
объяснение
Q
и B, какz
.m
…_BQ
Вычислите следующее для A и его обратногоd
:m
...h-ldlz
Рассчитать следующее для всехk
от 0 доlen(A) - len(B)
включительно:+Bklz
Получить паруk, k + len(B)
.cd
Сплитd
по этим показателям.X
…1z
Заменить вторую (среднюю) часть на B.Ks
Объединить кусочки и сохранить вK
. B теперь вставляется в положениеk
в A или наоборот.hc2
Разделите полученную строку на две части и оставьте первую часть. Это дает половину строки с возможным средним символом.hc2PK
Удалите последний символ и сделайте то же разделение, сохранив первый кусок. Это дает половину строки без возможного среднего символа.+
..._
Добавьте обратную сторону более короткой части к более длинной части. Теперь у нас есть палиндром.s
Объединить результаты для А и его обратного.f}zT
Удалите все строки, которые не содержат B.m
Вычислите следующее для всех полученных строкd
:nVQd
Получите парное неравенство с A. Это дает True для пар, которые необходимо изменить.s
Подведите итог списка. Это дает расстояние Хемминга.hS
Возьми минимальный результат.источник
JavaScript (Firefox 30+),
152146 байтМетод грубой силы: создайте каждое возможное перекрытие A и B, превратите каждое в палиндром, вычислите расстояния Хэмминга от A и возьмите наименьшее из полученных расстояний.
Вероятно, можно было бы играть в гольф немного больше ...
Тестовый фрагмент
Показать фрагмент кода
источник