Введение
Для тех, кто не знает, палиндром - это когда строка равна строке в обратном направлении (за исключением взаимодействия, пробелов и т. Д.). Примером палиндрома является:
abcdcba
Если вы измените это, вы получите:
abcdcba
Что то же самое. Поэтому мы называем это палиндромом. Чтобы палиндромизировать вещи, давайте рассмотрим пример строки:
adbcb
Это не палиндром. Чтобы палиндромизировать это, нам нужно объединить обратную строку в исходную строку справа от исходной строки , оставив обе версии без изменений. Чем короче, тем лучше.
Первое, что мы можем попробовать, это следующее:
adbcb
bcbda
^^ ^^
Не все символы совпадают, поэтому это не правильная позиция для перевернутой строки. Идем на один шаг вправо:
adbcb
bcbda
^^^^
Это также не соответствует всем персонажам. Мы идем еще один шаг вправо:
adbcb
bcbda
На этот раз все персонажи совпадают . Мы можем объединить обе строки, оставив нетронутыми . Окончательный результат:
adbcbda
Это палиндромизированная строка .
Задание
Если задана строка (по крайней мере с одним символом), содержащая только строчные буквы (или заглавные буквы, если это подходит лучше), выведите строку с палиндромом .
Контрольные примеры
Input Output
abcb abcba
hello hellolleh
bonobo bonobonob
radar radar
hex hexeh
Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
источник
obonobo
было бы лучшим решением для контрольного примера.bono b o nob
это целое предложение. Какая разница между Богом и Боно? Бог не бродит по Дублину, притворяясь Боно ;-)Ответы:
Желе,
1110 байтПопробуйте онлайн!
Как это работает
источник
Pyth (commit b93a874), 11 байт
Тестирование
Этот код использует ошибку в текущей версии Pyth , commit b93a874 . Ошибка в том, что
_IJ+zb
он анализируется так, как если бы он былq_J+zbJ+zb
, что эквивалентно тому_I+zb+zb
, когда он должен (по замыслу Pyth) проектироваться какq_J+zbJ
, что эквивалентно_I+zb
. Это позволяет мне сохранить байт - после исправления ошибки правильный код будет.VkI_IJ+zbJB
. Я объясню этот код вместо.По сути, код перебирает все возможные строки до тех пор, пока не найдет самую короткую строку, которая может быть добавлена к входным данным для формирования палиндрома, и выведет объединенную строку.
источник
Python, 46 байт
Если строка является палиндромом, верните ее. В противном случае, поместите первую букву вокруг рекурсивного результата для оставшейся части строки.
Пример разбивки:
источник
s!=s[::-1]
)Haskell, 36 байт
Более читабельно:
Если строка является палиндромом, верните ее. В противном случае, сэндвич первой буквы вокруг рекурсивного результата для хвоста строки.
Строка
s
разбита наh:t
второго охранника, избегая наполнителя1>0
для этого случая. Это короче, чемs@(h:t)
для ввода.источник
Pyth -
1612 байт4 байта сохранены благодаря @FryAmTheEggman.
FGITW, много игры в гольф возможно.
Тестовый пакет .
источник
Brachylog ,
1665 байт (не конкурирует)Попробуйте онлайн!
Когда я опубликовал свой первоначальный ответ, он все еще был на старой реализации в Java. Поскольку я перепрограммировал все в Прологе, теперь он работает так, как и должно быть.
объяснение
Обратное распространение делает так, что первое допустимое значение для
A
него будет самым коротким, которое вы можете объединить с Input, чтобы сделать его палиндромом.Альтернативный раствор, 5 байтов
Это примерно то же самое, что и приведенный выше ответ, за исключением того, что вместо того, чтобы указывать «Выход - это конкатенация ввода со строкой
A
», мы утверждаем, что «Выход - это строка, для которой вход является префиксом выхода».источник
JavaScript (ES6), 92 байта
Вычисляет и вырезает перекрытие между исходной строкой и ее обращением.
источник
Сетчатка,
2925Попробуйте онлайн!
Большое спасибо Мартину за 11 сохраненных байтов!
Это просто создает обратную строку и соединяет их вместе. Единственная действительно интересная часть этого - метод обращения:
O^#r`.\G
это делается с помощью режима сортировки. Мы сортируем буквы второй строки (те, которые не являются символами новой строки и являются последовательными от конца строки, благодаря символу\G
) по их числовому значению, которое, поскольку чисел нет, равно 0. Затем мы обращаем порядок результатов этой стабильной сортировки с^
опцией. Все кредиты за необычное использование\G
принадлежат Мартину :)источник
CJam, 18
Попробуйте онлайн
Объяснение:
источник
Луа,
8988 байтЯ победил Javascript! \ o / Сохранено 1 байт благодаря @LeakyNun ^^
Это полная программа, принимающая входные данные в качестве аргумента командной строки.
ungolfed
источник
while
можно удалить?i=i+1end
?1end
как шестнадцатеричное число. Как правило, вы не можете использовать[abcdef]
непосредственно после числа, не считая его шестнадцатеричным. Есть еще одно исключение0x
.Пролог, 43 байта
Это предполагает строку кодов в качестве входных данных, например, в SWI-Prolog 7:
a(`hello`).
объяснение
Это в основном порт моего ответа на брахилог.
источник
Октава,
7875 байтСохранено 3 байта благодаря E ᴛʜᴇ Gᴏʟғᴇʀ!
ideone все еще не работает для именованных функций, но здесь приведен тестовый прогон кода как программы.
источник
Perl, 37 байт
Основано на ответе xnor.
Включает +2 для
-lp
Запустить с вводом на STDIN, например
palindromize.pl
:источник
05AB1E , 18 байт
Код:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
Пайк, 15 байт
Попробуй это здесь!
источник
J, 20 байт
Это монадический глагол. Попробуй это здесь. Использование:
объяснение
Я использую тот факт, что палиндромизация S - это S + reverse (P) , где P - самый короткий префикс S , удаление которого приводит к палиндрому. В J немного неуклюже выполнить поиск первого элемента массива, который удовлетворяет предикату; отсюда индексация.
источник
Haskell, 68 байт
Пример использования:
f "abcb"
->"abcba"
.Выполняйте поиск по
inits
входным даннымi
(например,inits "abcb"
->["", "a", "ab", "abc", "abcb"]
) до тех пор, пока не найдете тот, к которому он добавлен в обратном направлении, чтобыi
построить палиндром.источник
r=reverse
нужно идти раньшеf i=
...?MATL ,
1716 байтСлабое вдохновение в ответе CJam от @ aditsu .
Попробуйте онлайн!
объяснение
источник
Рубин, 44 байта
Этот ответ основан на решениях xnor Python и Haskell .
источник
==s?s:
??
между?:
для троичного и?x == 'x'
замены используется с Ruby 1.9Oracle SQL 11.2, 195 байт
Un-golfed
источник
Серьезно, 34 байта
Последний символ является неразрывным пробелом (ASCII 127 или
0x7F
).Попробуйте онлайн!
Объяснение:
источник
C #, 202 байта
Я пытался.
Ungolfed:
Кто-нибудь может дать мне какие-нибудь идеи для группировки двух вызовов .Reverse (). ToArray ()? Отдельный метод - больше байтов.
источник
QBIC , 41 байт
Объяснение:
источник
Haskell, 46 байтов
Мне интересно, есть ли способ удалить скобки в
(f$tail l)++[l!!0]
...источник