Было несколько предыдущих попыток задать этот вопрос, но ни одна из них не соответствует современным стандартам на этом сайте. В ходе обсуждения Meta я публикую его таким образом, чтобы обеспечить честную конкуренцию в соответствии с нашими современными наборами правил.
Фон
Палиндром является строкой , которая «считывает те же вперед и назад», т.е. в обратной последовательности такой же , как и сама строка. Мы говорим не об «удобных палиндромах», а о строгом посимвольном обращении; например, ()()
не палиндром, а ())(
есть.
Задание
Напишите программу или функцию, которая принимает строку S (или соответствующий эквивалент на вашем языке) в качестве входных данных и имеет один выходной Q (на ваш выбор). Вы можете использовать любые разумные средства, чтобы получить данные и предоставить результаты.
- Когда вход S является палиндромом, выход Q должен иметь значение A (то же самое для любого палиндромного S ).
- Когда вход S не является палиндромом, выход Q должен иметь значение B (то же самое для любого непалиндромного S ).
- А и В должны отличаться друг от друга.
Или другими словами: сопоставьте все палиндромы с одним значением, а все непалиндромы - с другим.
Кроме того, программа или функция, которую вы пишете, должна быть самой палиндромом (т.е. ее исходный код должен быть палиндромной), что делает это проблемой с ограниченным исходным кодом .
Разъяснения
- Хотя
true
иfalse
являются очевидным выбором для A и B , вы можете использовать любые два различных значения для ваших выходных данных «is palidrome» и «not palidrome», которые не обязательно должны быть логическими. - Здесь мы определяем обращение строк на уровне символов ;
éé
является палиндромным независимо от того, закодирована ли программа в UTF-8 или Latin-1, даже если это не палиндромная последовательность октетов после кодирования UTF-8. - Однако, даже если ваша программа содержит символы не ASCII, она должна работать только для ввода ASCII. В частности, ввод S будет содержать только печатные символы ASCII (включая пробел, но не включая перевод строки). Помимо прочего, это означает, что если вы обрабатываете ввод как последовательность байтов, а не последовательность символов, ваша программа, вероятно, все равно будет соответствовать спецификации (если только кодировка ввода / вывода вашего языка не очень странная). Таким образом, определение палиндрома в предыдущем пункте имеет значение только при проверке правильности формы программы.
- Сокрытие половины программы в комментарии или строковом литерале, хотя и не является творческим, является законным; Вы забиваете по длине, а не по креативности, поэтому не стесняйтесь использовать «скучные» методы, чтобы ваша программа была палиндромом. Конечно, из-за того, что вы набираете очки по длине, части вашей программы, которые ничего не делают, ухудшат ваш счет, поэтому возможность использования обеих половин вашей программы, вероятно, будет полезна, если вы сможете управлять ею. ,
- Поскольку критерий победы измеряется в байтах, вам необходимо указать кодировку, в которой написана ваша программа, чтобы иметь возможность его оценить (хотя во многих случаях будет очевидно, какую кодировку вы используете).
Критерий победы
Хотя программа должна быть палиндромом на уровне персонажей, мы используем байты, чтобы увидеть, кто победит. В частности, чем короче ваша программа, измеренная в байтах, тем лучше; это вызов кода-гольфа . Чтобы разрешить сравнение представлений (особенно представлений на одном и том же языке), поместите количество байтов для вашей программы в заголовок вашего представления (плюс число символов, если оно отличается от количества байтов).
(
сa
и)
сb
. Этоabab
палиндром? Нет, так и должно бытьabba
. Тогда()()
тоже не палиндром; это должно быть())(
.()() is not a palindrome, but ())( is.
Поздравляю, вы сделали это на Reddit!Ответы:
Brachylog (2), 3 байта в кодовой странице Brachylog
Попробуйте онлайн!
Это полная программа, которая принимает ввод через стандартный ввод (используя синтаксис Brachylog для констант, т.е. строки заключаются в двойные кавычки) и выводит через стандартный вывод. Выходы
true.
для палиндромного ввода иfalse.
для непалиндромного ввода.Эта программа не только палиндромна, она также имеет зеркальную симметрию влево / вправо (и, вероятно, в некоторых шрифтах вверх / вниз).
объяснение
В Brachylog заглавными буквами отмечены точки в программе, которые имеют одинаковые значения; это используется почти как электрическая цепь для передачи информации из одной части программы в другую. Одним из следствий этого является то, что если вы заключаете команду в одинаковую пару заглавных букв, вы фактически утверждаете, что ввод и вывод команды совпадают. Brachylog неявно принимает входные данные, поэтому в этом случае мы также утверждаем, что входные данные для команды совпадают с входными данными для программы. В этой программе мы используем команду
↔
, которая переворачивает вещи (в данном случае, строки); таким образом, программа эффективно утверждает, что ввод одинаковый вперед и назад.Полная программа (в отличие от функции) в Brachylog возвращает логическое значение,
false.
если нет способа сделать все утверждения в программе правильными сразу илиtrue.
если все утверждения в программе совместимы друг с другом. У нас есть только одно утверждение - что изменение входа не меняет его - так что программа действует как палиндромная проверка.источник
Pyth , 3 байта
Возвращает True или False .
Попробуйте онлайн!
Как это устроено
источник
_
?Python , 39 байт
Попробуйте онлайн!
Скучно, но если есть немного в Python, это будет впечатляющим.
источник
(
,)
были хорошие (и запутанные) материалы :)Желе , 5 байт
Возвращает 1 или 0 . Первая строка является неисполненной вспомогательной ссылкой, вторая строка вызывает тест палиндрома.
Попробуйте онлайн!
источник
Желе , 5 байт
Попробуйте онлайн!
Равно обратному и обратному равняется.
Или более эффективный, но менее эстетичный:
или же
источник
Mathematica, 23 байта
Не очень интересно, но ради полноты ...
Выше - это
CompoundExpression
оценкаPalindromeQ
, встроенная, которая решает проблему.QemordnilaP
это просто неопределенный идентификатор, который игнорируется из-за;
.источник
Haskell,
87854434 байтаПояснение:
((->) a)
это экземпляр Applicative (спасибо @faubiguy), с<*>
определением какТаким образом, подставляя аргументы, можно понять, почему это работает.
источник
--
как это комментарий.(==)
,reverse
иid
функции (id
функция идентичности).<*>
вместо<$>
и удаляя<*>id
05AB1E , 3 байта
Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
ÂQ
PHP, 55 байт
Плюс, название языка - палиндром, так что ... бонусные баллы!
источник
MATL , 7 байт
Попробуйте онлайн!
Возвращает [1; 1] для палиндромного ввода и [0; 0] иначе.
источник
Пип ,
1211 байтТеперь без комментариев!
Принимает ввод в качестве аргумента командной строки; выходы
1
для палиндрома,0
для непалиндрома. Попробуйте онлайн!Суть того , что мы хотим сделать , это
RVaQa
:reverse(a) string-equals a
. Кодx:RVaQa
вычисляет этот результат и присваивает егоx
. ЗатемVR:x
присваивает значениеx
переменнойVR
. Поскольку это присваивание является последним оператором в программе, его значение также печатается автоматически. Вуаля!Для предыдущей интересной версии, использующей некоторое неопределенное поведение, см. Историю изменений.
источник
Perl 6 , 25 байт / символов utf8
Попробуй
источник
R
111103 байтНе самый оригинальный ответ.
#
символ комментария в RUngolfed:
Строка символов из
scan
преобразуется в необработанные байты благодаряcharToRaw
функции. Эти необработанные байты сравниваются один за другим со своими аналогами изrev()
функции, которая меняет порядок своих аргументов. Выход этой части является векторомTRUE
и / илиFALSE
.Затем
all
функция выводит,TRUE
если все эти элементыTRUE
Здесь
"\n"
вscan
функцию необходимо вводить более одного слова.Предыдущий ответ (побайтно), 81 байт
с - 24 байта благодаря @rturnbull .
источник
charToRaw
преобразование перед присваиваниемs
и изменив способ заданияsep
аргументаscan
:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
éé
в кодировке UTF-8, но я не думаю, что это нарушает правила вызова.)éé
сlatin1
кодировкой.RProgN , 11 байт
Первая половина этого делает всю тяжелую работу, и, благодаря удобству RProgN, вторая половина - No-op.
Попробуйте онлайн!
источник
Сетчатка , 53 байта
Число байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
Я уверен, что это еще не оптимально (
»
строка кажется особенно расточительной, и у меня есть 45-байтовое решение, которое является палиндромным, за исключением одного символа), но я предполагаю, что это начало.источник
GNU sed ,
6459 + 1 (флаг r) = 60 байт UTF-8Мне потребовалось некоторое время, чтобы придумать ответ sed, который не использует раздел комментариев, чтобы сделать код палиндромом. Вместо этого я использую
c
команду, которая печатает первую половину кода в обратном порядке, только я удостоверяюсь, что эта инструкция не достигнута.Сценарий печатает,
1
если входная строка не является палиндромом (думайте об этом как об ошибке). Если строка является палиндромом, то вывод не производится (думайте, что он успешно завершился).Запустите примеры: или попробуйте онлайн!
Объяснение:
источник
-r
не работает, но вы можете просто обернуть все это в BASH. Попробуйте онлайн!Алиса , 19 байт
Попробуйте онлайн!
Отпечатки
Jabberwocky
для палиндромов и ничего для непалиндромов. Работает для произвольного ввода UTF-8.объяснение
Поскольку это задача обработки строк, Алиса должна будет работать в обычном режиме, чтобы решить ее. Это, в свою очередь, означает, что указатель инструкции должен перемещаться по диагонали, и поэтому нам нужно по крайней мере две строки, чтобы IP мог отскочить вверх и вниз. Перевод строки в такой программе обеспечивает хорошую позицию для размещения среднего символа палиндрома. Это означает, что вторая строка должна быть обратной первой. Но поскольку мы выполняем только все остальные символы в каждой строке, если мы убедимся, что длина строки нечетная, обратная сторона кода будет аккуратно вписываться в собственные пробелы. Единственный символ, который вообще не используется, это обратный слеш, но поскольку он был произвольным, я выбрал его, чтобы программа выглядела красиво и симметрично.
Так или иначе, актуальный соответствующий код такой:
Который выполнен зигзагом слева направо.
источник
Haskell , 34 байта
Попробуйте онлайн! Позвонить с
f "some string"
, возвратTrue
илиFalse
.=<<
Оператор функций работает , какf=<<g = \s -> f (g s) s
, поэтому код эквивалентенf s=s==reverse s
, который, как я только что заметил, приведет к тому же счетчику байтов.Версия без комментариев: (49 байт)
Попробуйте онлайн!
Позвони с
p "some string"
. Это выводит,False
если данная строка является палиндромом, иTrue
если это не палиндром.Объяснение:
Я нашел этот комментарий свободным палиндромом, начав с версии комментария и заменив комментарий новой строкой:
Вторая строка завершается неудачно, потому что круглые скобки не совпадают, поэтому нам нужно от них избавиться. Если бы у нас была функция,
e
которая проверяет равенство, тооба компилировать со второй линией , определяющой инфиксным-оператор ,
<<=
который принимает два аргументаesrever
иe
и возвращает функциюp
.Чтобы определить
e
как функцию равенства, обычно пишутe=(==)
, но)==(=e
опять не компилируют. Вместо того, чтобы мы могли явно взять два аргумента и передать их==
:e x y=x==y
. Теперь обратный кодy==x=y x e
компилируется, но переопределяет==
оператор, что приводитe x y=x==y
к сбою определения . Однако если мы переключимся на оператор неравенства/=
, обратное определение становитсяy=/x=y x e
и определяет=/
оператор, который не мешает исходному/=
оператору.источник
НЕФТЬ , 178 байт
Читает ввод, разбирает его, медленно добавляет его длину (путем увеличения и уменьшения) к адресу, который должен знать адрес после строки, переходит к другой части кода (в середине), меняет направление полосы, разворачивает строку снова, и проверяет, совпадает ли это с исходной строкой. TL; DR: Это боль, как обычно.
Выводится,
40
если строка не является палиндромом,0
если это так.источник
Javascript, 64 байта
Вызов функции
f
со строкойисточник
f
, ваш код не назначает вашу функцию-стрелку переменной, поэтому ее нельзя вызватьJapt ,
72 байтаЗапустить его
Старое решение:
Попробуйте онлайн!
объяснение
Japt не экранирует функции, пока не будет достигнута закрывающая скобка (или пробел).
Это можно переписать:
U¥Uw(U¥U)
→U¥Uw
→U==Uw
. В Japt скобки, пропущенные в начале и конце функции, вставляются автоматически.источник
w
функция не принимает аргументов, как она применяетсяU
? Это что-то вродеU.reverse()
?U
же, как иU.reverse()
.Утилиты Bash + Unix, 49 байт
Ввод передается в качестве аргумента.
Выход возвращается в коде результата - 0 для палиндрома, 1 для непалиндрома.
Может быть, кто-то может сделать лучше, а не просто полагаться на комментарий, чтобы сделать сам код палиндромным.
Попробуйте онлайн!
источник
[[ $1 = `rev<<<$1` ]]
короче ([[
Синтаксис Bash , цитата не требуется)rev<<<$1
нужны даже в[[...]]
решении. Проверьте это с помощью входной строки'[$]]$['
(которая является палиндромом). С этими кавычками, добавленными, чтобы оно работало, ваше решение имеет ту же длину, что и мое решение.==
in[[
будет интерпретироваться какcase
шаблон.> <>, 11 байт
Попробуй это здесь!
Возвращает "\ nsomething пахнет подозрительно ..." на действительном палиндроме, не выводит на неверный палиндром. Поместите палиндром в стек.
источник
Ява -
171169160 байтКомментарий в конце должен сделать это палиндромом. Возвращает,
P(alindrome)
когда ввод палиндром, аN(ot)
когда нет.Безголовая версия:
2 байта сохранены благодаря @DLosc
Спасибо @Olivier Grégoire за указание неверного количества байтов! Исправлено сейчас
источник
int
s вместоchar
s.'P'
и 78 для'N'
или использовать различные символы для сохранения еще большего количества байтов.new StringBuffer(s).reverse()+""
вместоnew StringBuffer(s).reverse().toString()
int
вместоbool
?Java 8,
9290 байтЭто версия комментария. Если строка содержит обратное, то это палиндром (
true
), иначе это не (false
).Попробуйте онлайн!
Обновить
;
«ыисточник
s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s
. Попробуйте онлайн 90 байт .На самом деле 5 байтов
Попробуйте онлайн!
Истинный вывод есть
[1]\n[1]
, а вывод ложный[]\n[]
(в обоих выходах\n
представляет буквальный перевод строки).Объяснение:
источник
C ++, 154 байта
Должен сказать, обратное утверждение было дорогостоящим, но я не могу себе представить, что могу сделать, чтобы это изменить. Возможность вырезать символы std :: спасла бы меня примерно на 10 символов, но "используя пространство имен std;" еще немало.
Я полагаю, что C ++ не был предназначен для краткости.
источник
Пролог, 44 байта
Это использует определенные грамматики предложения. Это на самом деле полная контекстно-свободная грамматика:
Использование:
источник
CJam, 13 байтов
Объяснение:
Пример:
источник
l_W%#e#%W_l
J, 15 байтов, 15 символов
Возвращает 1, если палиндром, 0, если нет.
Выход:
Объяснение:
источник