Я палиндром. Ты?


103

Было несколько предыдущих попыток задать этот вопрос, но ни одна из них не соответствует современным стандартам на этом сайте. В ходе обсуждения 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 (включая пробел, но не включая перевод строки). Помимо прочего, это означает, что если вы обрабатываете ввод как последовательность байтов, а не последовательность символов, ваша программа, вероятно, все равно будет соответствовать спецификации (если только кодировка ввода / вывода вашего языка не очень странная). Таким образом, определение палиндрома в предыдущем пункте имеет значение только при проверке правильности формы программы.
  • Сокрытие половины программы в комментарии или строковом литерале, хотя и не является творческим, является законным; Вы забиваете по длине, а не по креативности, поэтому не стесняйтесь использовать «скучные» методы, чтобы ваша программа была палиндромом. Конечно, из-за того, что вы набираете очки по длине, части вашей программы, которые ничего не делают, ухудшат ваш счет, поэтому возможность использования обеих половин вашей программы, вероятно, будет полезна, если вы сможете управлять ею. ,
  • Поскольку критерий победы измеряется в байтах, вам необходимо указать кодировку, в которой написана ваша программа, чтобы иметь возможность его оценить (хотя во многих случаях будет очевидно, какую кодировку вы используете).

Критерий победы

Хотя программа должна быть палиндромом на уровне персонажей, мы используем байты, чтобы увидеть, кто победит. В частности, чем короче ваша программа, измеренная в байтах, тем лучше; это вызов . Чтобы разрешить сравнение представлений (особенно представлений на одном и том же языке), поместите количество байтов для вашей программы в заголовок вашего представления (плюс число символов, если оно отличается от количества байтов).


12
Кто-нибудь, пожалуйста, объясните, почему бы () () не быть палиндромом?
Эмилио М Бумачар

58
@EmilioMBumachar Попробуйте заменить (с aи )с b. Это ababпалиндром? Нет, так и должно быть abba. Тогда ()()тоже не палиндром; это должно быть ())(.
DLosc

7
Эти решения полностью используют комментарии, чтобы сделать палиндромную программу похожей на лазейку для меня :(
kennytm

15
@kennytm Запрещать их было бы хуже, потому что не существует удовлетворительного способа сделать это объективно, без учета языка. (Что такое комментарий? Как насчет помещения неиспользованной половины в строковый литерал, который отбрасывается? Как насчет 2D-языков, где вы можете иметь идеально исполняемый код, который просто никогда не достигается?)
Мартин Эндер,

Ответы:


137

Brachylog (2), 3 байта в кодовой странице Brachylog

I↔I

Попробуйте онлайн!

Это полная программа, которая принимает ввод через стандартный ввод (используя синтаксис Brachylog для констант, т.е. строки заключаются в двойные кавычки) и выводит через стандартный вывод. Выходы true.для палиндромного ввода и false.для непалиндромного ввода.

Эта программа не только палиндромна, она также имеет зеркальную симметрию влево / вправо (и, вероятно, в некоторых шрифтах вверх / вниз).

объяснение

В Brachylog заглавными буквами отмечены точки в программе, которые имеют одинаковые значения; это используется почти как электрическая цепь для передачи информации из одной части программы в другую. Одним из следствий этого является то, что если вы заключаете команду в одинаковую пару заглавных букв, вы фактически утверждаете, что ввод и вывод команды совпадают. Brachylog неявно принимает входные данные, поэтому в этом случае мы также утверждаем, что входные данные для команды совпадают с входными данными для программы. В этой программе мы используем команду , которая переворачивает вещи (в данном случае, строки); таким образом, программа эффективно утверждает, что ввод одинаковый вперед и назад.

Полная программа (в отличие от функции) в Brachylog возвращает логическое значение, false.если нет способа сделать все утверждения в программе правильными сразу или true.если все утверждения в программе совместимы друг с другом. У нас есть только одно утверждение - что изменение входа не меняет его - так что программа действует как палиндромная проверка.


49
И вращательная симметрия 180 градусов, это красиво.
ATaco

7
... и симметрия по вертикальной и горизонтальной осям :-)
Луис Мендо,

13
@SteakOverflow Brachylog использует пользовательскую кодовую страницу , поэтому эти символы не кодируются в UTF-8
DJMcMayhem

4
Я присоединился к этому сообществу только для того, чтобы проголосовать за эту программу. Ух ты.
Билл Мичелл

4
@ATaco Комбинация симметрий влево / вправо и вверх / вниз подразумевает вращательную симметрию 180 градусов. ;)
Эрик

55

Pyth , 3 байта

_I_

Возвращает True или False .

Попробуйте онлайн!

Как это устроено

  _  Reverse the input.
_I   Invariant-reverse; test if the reversed input is equal to its reverse.

1
Зачем тебе финал _?
Busukxuan

34
@busukxuan Из вопроса: «Кроме того, программа или функция, которую вы пишете, должна быть самим палиндромом»
isaacg

1
Почему так много голосов ... Этот ответ не кажется таким уж сложным ...?
ghosts_in_the_code

1
Полагаю, что так. Тем не менее, это кажется несправедливым. На некоторые вопросы нужно много трудиться, а на другие гораздо проще. Тем не менее выплата остается прежней. Кстати, я также проголосовал: P
ghosts_in_the_code

4
@ghosts_in_the_code Только один из моих ответов со 100+ на самом деле был трудным для написания, но есть ответы, на которые я потратил несколько дней, которые получили лишь несколько голосов. В конце концов, все выровняется ...
Деннис


33

Желе , 5 байт

ḂŒ
ŒḂ

Возвращает 1 или 0 . Первая строка является неисполненной вспомогательной ссылкой, вторая строка вызывает тест палиндрома.

Попробуйте онлайн!


вау, недавнее дополнение.
Джонатан Аллан

6
Да, только 18 часов.
Деннис

Вы не указали кодировку. Я догадываюсь UTF-8?
Брайан Минтон

1
@BrianMinton Нет, это будет 11 байт в UTF-8. Желе использует эту кодовую страницу .
Деннис

@ Денис, спасибо за информацию.
Брайан Минтон


23

Mathematica, 23 байта

QemordnilaP;PalindromeQ

Не очень интересно, но ради полноты ...

Выше - это CompoundExpressionоценка PalindromeQ, встроенная, которая решает проблему. QemordnilaPэто просто неопределенный идентификатор, который игнорируется из-за ;.


21

Haskell, 87 85 44 34 байта

p=(==)<*>reverse--esrever>*<)==(=p

Пояснение: ((->) a)это экземпляр Applicative (спасибо @faubiguy), с <*>определением как

(<*>) f g x = f x (g x)

Таким образом, подставляя аргументы, можно понять, почему это работает.


1
Можете ли вы объяснить код?
ло

1
@bli все после того, --как это комментарий.
theonlygusti

3
@theonlygusti Haskell достаточно чужой, что помогает только половина.
Якк

@Yakk Это какая - то комбинация из (==), reverseи idфункции ( idфункция идентичности).
17

Вы можете сохранить 10 байтов, используя <*>вместо <$>и удаляя<*>id
faubi



16

MATL , 7 байт

tPX=XPt

Попробуйте онлайн!

Возвращает [1; 1] для палиндромного ввода и [0; 0] иначе.

t       % duplicate the input
P       % reverse the second string
X=      % check the two strings are exactly equal (returns 0 or 1)
XP      % flip array (does nothing)
t       % duplicate the answer, giving either [1;1] or [0;0]
        % (implicit) convert to string and display

15

Пип , 12 11 байт

Теперь без комментариев!

x:RVaQaVR:x

Принимает ввод в качестве аргумента командной строки; выходы 1для палиндрома, 0для непалиндрома. Попробуйте онлайн!

Суть того , что мы хотим сделать , это RVaQa: reverse(a) string-equals a. Код x:RVaQaвычисляет этот результат и присваивает его x. Затем VR:xприсваивает значение xпеременной VR. Поскольку это присваивание является последним оператором в программе, его значение также печатается автоматически. Вуаля!

Для предыдущей интересной версии, использующей некоторое неопределенное поведение, см. Историю изменений.



9

R 111 103 байт

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))#))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Не самый оригинальный ответ. #символ комментария в R

Ungolfed:

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))
#
))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Строка символов из scanпреобразуется в необработанные байты благодаря charToRawфункции. Эти необработанные байты сравниваются один за другим со своими аналогами из rev()функции, которая меняет порядок своих аргументов. Выход этой части является вектором TRUEи / или FALSE.
Затем allфункция выводит, TRUEесли все эти элементыTRUE

Здесь "\n"в scanфункцию необходимо вводить более одного слова.

Предыдущий ответ (побайтно), 81 байт

function(s)all((s=charToRaw(s))==rev(s))#))s(ver==))s(waRoTr‌​ahc=s((lla)s(noitcnu‌​f

с - 24 байта благодаря @rturnbull .


Вы можете сэкономить несколько байтов, выполнив charToRawпреобразование перед присваиванием sи изменив способ задания sepаргумента scan:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
rturnbull

(Кроме того, этот подход не работает, например, для ввода ééв кодировке UTF-8, но я не думаю, что это нарушает правила вызова.)
rturnbull

@rturnbull: спасибо за вклад! Я действительно тестировал ééс latin1кодировкой.
Фредерик,

Так как тест должен быть выполнен символьно, я думаю, что текущая программа нарушает правила.
Фредерик

Я не уверен, что предыдущая версия нарушает правила. ОП гласит: «Среди прочего, это означает, что если вы обрабатываете ввод как последовательность байтов, а не последовательность символов, ваша программа, вероятно, все равно будет соответствовать спецификации (если только кодировка ввода / вывода вашего языка не очень странная). "
rturnbull

8

RProgN , 11 байт

~]S.E E.S]~

Первая половина этого делает всю тяжелую работу, и, благодаря удобству RProgN, вторая половина - No-op.

~]S.E E.S]~
~           # Treat the word as a Zero Space Segment
 ]          # Duplicate the top of the stack
  S.        # Reverse the top of the stack
    E       # Compare if these values are equal
      E.S]~ # A no-op, because the ~ is at the end of the word, not the start.

Попробуйте онлайн!


8

Сетчатка , 53 байта

Число байтов предполагает кодировку ISO 8859-1.

$
¶$`
O$^`\G.
»
D`
M$`^.+$
$+.^`$M
`D
»
.G\`^$O
`$¶
$

Попробуйте онлайн!

Я уверен, что это еще не оптимально ( »строка кажется особенно расточительной, и у меня есть 45-байтовое решение, которое является палиндромным, за исключением одного символа), но я предполагаю, что это начало.


8

GNU sed , 64 59 + 1 (флаг r) = 60 байт UTF-8

Мне потребовалось некоторое время, чтобы придумать ответ sed, который не использует раздел комментариев, чтобы сделать код палиндромом. Вместо этого я использую cкоманду, которая печатает первую половину кода в обратном порядке, только я удостоверяюсь, что эта инструкция не достигнута.

:;s:^(.)(.*)\1$:\2:;t;/../c1
d
1c/../;t;:2\:$1\)*.().(^:s;:

Сценарий печатает, 1если входная строка не является палиндромом (думайте об этом как об ошибке). Если строка является палиндромом, то вывод не производится (думайте, что он успешно завершился).

Запустите примеры: или попробуйте онлайн!

me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "level"
me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "game"
1

Объяснение:

:                              # start loop
s:^(.)(.*)\1$:\2:              # delete first and last char, if they are the same
t                              # repeat if 's' was successful
/../c1                         # if at least 2 chars are left, print 1. 'c' reads
                               #till EOL, so next command must be on a new line.
d                              # delete pattern space. This line must be a
                               #palindrome itself, and must end the script.
1c/../;t;:2\:$1\)*.().(^:s;:   # (skipped) print first half of code in reverse
                               #order. Everything after 'c' is treated as string.

1
TIO теперь поддерживает sed. -rне работает, но вы можете просто обернуть все это в BASH. Попробуйте онлайн!
Райли

@Riley Хорошее использование верхнего и нижнего колонтитула на TIO, спасибо. Предыдущий обходной путь состоял в том, чтобы переместить код в список аргументов с -e, но ваш путь намного лучше. Я ждал, когда это будет исправлено, но так мне и не нужно.
сешумара

7

Алиса , 19 байт

/@.nzRoi\
\ioRzn.@/

Попробуйте онлайн!

Отпечатки Jabberwockyдля палиндромов и ничего для непалиндромов. Работает для произвольного ввода UTF-8.

объяснение

Поскольку это задача обработки строк, Алиса должна будет работать в обычном режиме, чтобы решить ее. Это, в свою очередь, означает, что указатель инструкции должен перемещаться по диагонали, и поэтому нам нужно по крайней мере две строки, чтобы IP мог отскочить вверх и вниз. Перевод строки в такой программе обеспечивает хорошую позицию для размещения среднего символа палиндрома. Это означает, что вторая строка должна быть обратной первой. Но поскольку мы выполняем только все остальные символы в каждой строке, если мы убедимся, что длина строки нечетная, обратная сторона кода будет аккуратно вписываться в собственные пробелы. Единственный символ, который вообще не используется, это обратный слеш, но поскольку он был произвольным, я выбрал его, чтобы программа выглядела красиво и симметрично.

Так или иначе, актуальный соответствующий код такой:

/ . z o
 i R n @

Который выполнен зигзагом слева направо.

/   Reflect the IP southeast, enter Ordinal mode.
i   Read all input as a single string.
.   Duplicate the input.
R   Reverse the copy.
z   Pop the reverse Y and the original X. If X contains Y, drop everything
    up to its first occurrence. Since we know that X and Y are the same length,
    Y can only be contained in X if X=Y, which means that X is a palindrome.
    So this will result in an empty string for palindromes and in the non-empty
    input for non-palindromes.
n   Logical NOT. Replaces non-empty strings with "", and empty strings with
    "Jabberwocky", the "default" truthy string.
o   Output the result.
@   Terminate the program.

6

Haskell , 34 байта

f=(==)=<<reverse--esrever<<=)==(=f

Попробуйте онлайн! Позвонить с f "some string", возврат Trueили False.

=<<Оператор функций работает , как f=<<g = \s -> f (g s) s, поэтому код эквивалентен f s=s==reverse s, который, как я только что заметил, приведет к тому же счетчику байтов.


Версия без комментариев: (49 байт)

e x y=x/=y
p=e=<<reverse
esrever<<=e=p
y=/x=y x e

Попробуйте онлайн!

Позвони с p "some string". Это выводит, Falseесли данная строка является палиндромом, и Trueесли это не палиндром.

Объяснение:

Я нашел этот комментарий свободным палиндромом, начав с версии комментария и заменив комментарий новой строкой:

p=(==)=<<reverse
esrever<<=)==(=p

Вторая строка завершается неудачно, потому что круглые скобки не совпадают, поэтому нам нужно от них избавиться. Если бы у нас была функция, eкоторая проверяет равенство, то

p=e=<<reverse
esrever<<=e=p

оба компилировать со второй линией , определяющой инфиксным-оператор , <<=который принимает два аргумента 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и определяет =/оператор, который не мешает исходному /=оператору.


5

НЕФТЬ , 178 байт

Читает ввод, разбирает его, медленно добавляет его длину (путем увеличения и уменьшения) к адресу, который должен знать адрес после строки, переходит к другой части кода (в середине), меняет направление полосы, разворачивает строку снова, и проверяет, совпадает ли это с исходной строкой. TL; DR: Это боль, как обычно.

Выводится, 40если строка не является палиндромом, 0если это так.

5
0
12
0
40
1
40
2
1
40
34
10
2
3
22
16
9
2
8
35
6
11
6
37

3
4
4
27
26
0
1
10
1

40
13
2
31
04

1
01
1
0
62
72
4
4
3

73
6
11
6
53
8
2
9
61
22
3
2
01
43
04
1
2
04
1
04
0
21
0
5

2
Аккуратный язык! :)
DLosc

5

Javascript, 64 байта

f=s=>s==[...s].reverse().join``//``nioj.)(esrever.]s...[==s>=s=f

Вызов функции fсо строкой

f("abba") // returns true
f("abab") // returns false

Ваш исходный код не палиндром!
сешумара

@seshoumara Обновленный код
Prasanth Bendra

Теперь все хорошо. Может быть, упомяните возвращаемое значение, если строка не является палиндромом, просто для завершения.
сешумара

@apsillers спасибо, я отредактировал ответ.
Prasanth Bendra

Нет функции f, ваш код не назначает вашу функцию-стрелку переменной, поэтому ее нельзя вызвать
spex

5

Japt , 7 2 байта

êê

Запустить его

Старое решение:

U¥UwU¥U

Попробуйте онлайн!

объяснение

U¥UwU¥U
U¥        U is the input, ¥ is a shortcut for == 
  Uw      w is a reverse function.
    U¥U   This calculates U == U (always true), but the result is ignored
          because w does not look at its arguments.

Japt не экранирует функции, пока не будет достигнута закрывающая скобка (или пробел).

Это можно переписать: U¥Uw(U¥U)U¥UwU==Uw. В Japt скобки, пропущенные в начале и конце функции, вставляются автоматически.


Все это имеет смысл, кроме случаев, когда wфункция не принимает аргументов, как она применяется U? Это что-то вроде U.reverse()?
DLosc

@DLosc Правильно. Он переворачивается так Uже, как и U.reverse().
Оливер

4

Утилиты Bash + Unix, 49 байт

[ "$1" = "`rev<<<$1`" ] # ] "`1$<<<ver`" = "1$" [

Ввод передается в качестве аргумента.

Выход возвращается в коде результата - 0 для палиндрома, 1 для непалиндрома.

Может быть, кто-то может сделать лучше, а не просто полагаться на комментарий, чтобы сделать сам код палиндромным.

Попробуйте онлайн!


[[ $1 = `rev<<<$1` ]]короче ( [[Синтаксис Bash , цитата не требуется)
Arthur2e5

2
@ Arthur2e5 Я опробовал ваше предложение, но я думаю, что цитаты rev<<<$1нужны даже в [[...]]решении. Проверьте это с помощью входной строки '[$]]$['(которая является палиндромом). С этими кавычками, добавленными, чтобы оно работало, ваше решение имеет ту же длину, что и мое решение.
Митчелл Спектор

Отличный улов! Я забыл, что RHS of ==in [[будет интерпретироваться как caseшаблон.
Arthur2e5

@ Arthur2e5 Я все еще думаю, что есть какой-то умный способ сделать это короче.
Митчелл Спектор

Будет ли это работать, если во вводе есть переводы строки? Я думаю, что вам нужен rev | tac вместо просто rev.
b_jonas

4

> <>, 11 байт

{=?!;
;!?={

Попробуй это здесь!

Возвращает "\ nsomething пахнет подозрительно ..." на действительном палиндроме, не выводит на неверный палиндром. Поместите палиндром в стек.


Требование, чтобы входные данные были уже в стеке, делает это фрагментом. Эта задача требует программ или функций, а не фрагментов.
pppery

4

Ява - 171 169 160 байт

int q(String s){return s.equals(new StringBuffer(s).reverse().toString())?1:2;}//};2:1?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

Комментарий в конце должен сделать это палиндромом. Возвращает, P(alindrome)когда ввод палиндром, а N(ot)когда нет.

Безголовая версия:

int q(String s) {
    return s.equals(new StringBuffer(s).reverse().toString()) ? 'P' : 'N';
}//};'N':'P'?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

2 байта сохранены благодаря @DLosc

Спасибо @Olivier Grégoire за указание неверного количества байтов! Исправлено сейчас


Я считаю, что вы можете сохранить несколько байтов, возвращая ints вместо chars.
DLosc

Я не знаю, как проверить ваш счетчик байтов, но у вас есть 160 байтов, а не 161.
Оливье Грегуар

Вы можете сохранить 2 байта, возвращая 80 для 'P'и 78 для 'N'или использовать различные символы для сохранения еще большего количества байтов.
Селим

1
Вы можете сэкономить еще больше байтов, выполнив new StringBuffer(s).reverse()+""вместоnew StringBuffer(s).reverse().toString()
Селим

1
По какой причине вы возвращаете intвместо bool?
CodesInChaos

4

Java 8, 92 90 байт

Это версия комментария. Если строка содержит обратное, то это палиндром ( true), иначе это не ( false).

s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s

Попробуйте онлайн!

Обновить

  • -2 [18-04-05] Переключен на содержит. Спасибо @Kevin Cruijssen !
  • -2 [17-02-20] Удалены ;«ы
  • -16 [17-02-22] Автоконвертация

Этот код не является лямбда-выражением.
Якоб

@ Якоб Я так и думал. Если бы вы использовали лямбду, вы, вероятно, захотите лидирующий и конечный перевод строки. (Я добавил ссылку tio)
NonlinearFruit

Да, моя жалоба состояла в том, что строковый комментарий делает представление больше, чем просто лямбда-выражением, и, следовательно, не является допустимым как лямбда-решение Не волнуйтесь об этом сейчас; Я, вероятно, в конечном итоге сделаю метапост, чтобы собрать консенсус.
Якоб

@Jakob Лямбда-решения могут иногда иметь посторонний код , поэтому я думаю, что он действителен. Но если вы не проданы, метапост не повредит.
Нелинейный

1
Я знаю, что это было давно, но вы можете сыграть в гольф 2 байта, изменив его на s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s. Попробуйте онлайн 90 байт .
Кевин Круйссен

3

На самом деле 5 байтов

;R=R;

Попробуйте онлайн!

Истинный вывод есть [1]\n[1], а вывод ложный []\n[](в обоих выходах \nпредставляет буквальный перевод строки).

Объяснение:

;R=R;
;R=    duplicate input, reverse one copy, test equality (the main palindrome-testing part)
   R   range(1, x+1) - if palindrome, this pushes [1], else it pushes []
    ;  duplicate

Почему бы тебе просто не сделать это ?
Утренняя монахиня

1
@LeakyNun это должен быть палиндром
caird coinheringaahing

3

C ++, 154 байта

int m(){std::string g,p="";g=p;std::reverse(p.begin(),p.end());return g==p;}//};p==g nruter;))(dne.p,)(nigeb.p(esrever::dts;p=g;""=p,g gnirts::dts{)(m tni

Должен сказать, обратное утверждение было дорогостоящим, но я не могу себе представить, что могу сделать, чтобы это изменить. Возможность вырезать символы std :: спасла бы меня примерно на 10 символов, но "используя пространство имен std;" еще немало.

Я полагаю, что C ++ не был предназначен для краткости.


3

Пролог, 44 байта

p-->[]|[_]|[E],p,[E].%.]E[,p,]E[|]_[|][>--p

Это использует определенные грамматики предложения. Это на самом деле полная контекстно-свободная грамматика:

p -->
      []            % the empty string
   |                % or
      [_]           % a one character string
   |                % or
      [E],          % one character, followed by
      p,            % a palindrome, followed by
      [E].          % that same character

Использование:

?- phrase(p,"reliefpfeiler").
true 

?- phrase(p,"re").
false.

2

CJam, 13 байтов

l_W%=e#e=%W_l

Объяснение:

l_W%=e#e=%W_l
l_            e#Read input twice
  W%          e#Reverse one input
    =         e#Test for equality
     e#e=%W_l e#Comment to be a palindrome

Пример:

> l_W%=e#e=%W_l
l_W%=e#e=%W_l
1

> l_W%=e#e=%W_l
Hi
0

> l_W%=e#e=%W_l
hh
1

Попробуйте это:l_W%#e#%W_l
aditsu

2

J, 15 байтов, 15 символов

-:|.NB. .BN.|:-

Возвращает 1, если палиндром, 0, если нет.

Выход:

   f '())('
1
   f 'nope'
0

Объяснение:

-:    NB. "Match" verb, checks for equality
|.    NB. Reverses the string
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.