Если вы когда-либо пытались написать палиндромный код раньше, вы бы знали, сколько скобок мешает вам. ()()
это не палиндром, даже если он выглядит так, как и должно быть, хотя ())(
и ()(
палиндромен, и оба выглядят очень тупыми. Разве это не было бы удобно, если бы это было наоборот?
Строка обычно является палиндромной, если она равна строке, полученной, когда в ее обращении перевернуты все скобки ( ()
), скобки ( []
) и фигурные скобки ( {}
). Никакие другие символы не являются специальными и требуют переключения. ( <>
иногда в паре, но часто не так, они не учтены.)
Ваша задача - написать на вашем языке программу (с вводом в STDIN) или функцию (с одним строковым аргументом), которая (a) дает непротиворечивое истинное значение *, когда ее аргумент удобно палиндромным и другой непротиворечивый ложный значение иначе, и (b) само по себе удобно палиндромно.
Например, следующие входные данные обычно являются палиндромными:
racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov
И следующие не являются:
non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni
Вы не можете полагаться на какое-либо внешнее состояние (конкретное имя файла, структуру каталогов, другой пользовательский ввод, веб-доступ и т. Д.), Кроме флагов интерпретатора / компилятора.
Кроме того, вы не можете использовать «трюк с комментариями», когда вы комментируете или не используете какой-то фрагмент кода, используя возможности комментариев вашего языка. Например, все нижеперечисленное не допускается, поскольку они содержат нефункциональные части, которые можно безопасно удалить или уничтожить (за счет потери удобства-палиндромности):
{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"
Очевидно, что это может не охватывать каждый такой случай, но суть проблемы здесь заключается не в том, чтобы использовать комментарии и непарсированный ** код для достижения палиндромности, а вместо этого использовать исправленные паренсы и скобки. Я смотрю на тебя, LISP, Брейнфак.
Это код-гольф , поэтому выигрывает самый короткий код, но приветствуется любая длина кода.
* Под последовательными значениями true и false я подразумеваю, что вы можете вернуть одно из пары значений, например, 1
для true и 0
для false, или False
для true и "no"
для false, если эти значения отличаются друг от друга и не переход от запуска к запуску вашей программы. Используйте то, что спасает ваших персонажей.
** Не путать с неисполненным : код, который является допустимым и может делать странные вещи, но никогда не вызывается, это хорошо.
источник
if(false){some code}
или неиспользуемые переменные? Они разрешены?(eslaf)fi
, вы можете использоватьif(false)
.()()
не палиндром,Ответы:
J (60)
Это функция, которая принимает аргумент:
Объяснение:
f :: g
запускает функциюf
над входом и возвращает результат, если возвращается без ошибок. Еслиf
не удается, он запускаетсяg
вместо.f
Здесь(|.-:'())([]][{}}{'&charsub)
, который делает фактическую работу:|.
: обратный-:
: равно'())([]][{}}{'&charsub
: замена каждого кронштейна на противоположный кронштейнg
Функция(busrahc&'}{{}][[])(()':-.|)
, которая является нонсенсом , но синтаксический правильным.busrahc
не определено, но это не имеет значения, потому что оно разрешается только при запуске (и не запускается).источник
f :: g
вg@-@f
.g
эквивалентно хуку(-.|)
из-за:
того, что выходные данные становятся -1 и пустым списком для удобно палиндромных и нет соответственно.GolfScript,
10791Новые строки художественные.
fi
,c43
Иc
являются Без операционное, но весь код выполняется.Отпечатки
-3-1-1
для удобных палиндромов, в-4-1-1
противном случае. Попробуйте онлайн!Альтернативная версия, 155 байт
За счет 64 байтов это можно улучшить:
Как и прежде, весь код выполняется, и каждый байт влияет на вывод.
Отпечатки
010
для удобных палиндромов, в-100
противном случае. Попробуйте онлайн!Тесты и примеры
Как это работает
источник
Руби, 110
Печатает,
true
если ввод является удобным палиндромом, аfalse
если нет. Обратите внимание, что это решение предполагает, что ввод не завершается символом новой строки, поэтому проверьте его с помощьюecho -n
:Это довольно простой порт моего ответа на Palindromic Palindrome Checker (и до сих пор не играли в гольф). Основная хитрость заключается в том, что первое выражение в скобках всегда возвращается
1
, поэтому вторая половина логического выражения никогда не оценивается (но анализируется).Единственная сложность в адаптации этого состояла в том, чтобы выяснить, как добавить вызов, чтобы
z.tr
его «удобный реверс» также был синтаксически верным - но я мог бы просто использовать тот же трюк, который я уже использовал, путы:,*
который в первой половине анализируется как оператор сплат (используйте содержимое массива в качестве параметров функции) и оператор умножения (или повторения) массива во второй половине.Рубин, 157
297, весь код выполненЭта (немного более длинная) версия выполняет весь код, и все, кроме двух строк, влияют на вывод, который печатается в последней строке, но все строки анализируются и выполняются без ошибок. Эта версия интерпретирует любой завершающий символ новой строки как часть ввода, поэтому используйте его либо
echo -n
для проверки, либо для добавления ввода новой строки. Он печатает,true
если на входе удобный палиндром, иfalse
иначе.объяснение
источник
GolfScript, 61 символ
Хорошо, вот базовое решение в GolfScript. Я уверен, что это может быть улучшено:
Как обычно для GolfScript, эта программа считывает свой ввод со стандартного ввода. Это выводит:
если ввод является удобным палиндромом, как определено в задании выше, и:
если это не так.
Объяснение: Эта программа в значительной степени опирается на решение о том, что неисполненный код в порядке, если он анализируется. Он состоит из двух блоков кода, разделенных фигурными скобками (
{ }
), которые являются зеркальным отображением друг друга.Первый блок кода выполняется
~
следующим за ним и проверяет, является ли ввод удобным палиндромом, и выводит,1
если он есть, а0
если нет. Второй кодовый блок не выполняется, и поэтому он просто остается в стеке до тех пор, пока программа не завершится, и все в стеке не будет автоматически структурировано и напечатано интерпретатором GolfScript.Следует отметить, что интерпретатор GolfScript делает очень мало проверок синтаксиса во время синтаксического анализа (или вообще когда-либо); литерал блока кода GolfScript может содержать почти все, даже если он может произойти сбой при выполнении. Тем не менее, некоторые синтаксические ошибки, такие как неопределенные строковые литералы, действительно вызывают ошибку даже в неисполненном коде, поэтому я считаю, что это решение (едва) подпадает под правила.
Ps. Если посмотреть на исполняемый код, он содержит несколько удобных палиндромных элементов, таких
@[.]@
как строковый литерал"([{}])"
и даже цикл%{ ... }%
. Это дает соблазнительное предположение о том, что «внутренне палиндромное» решение GolfScript, где бы полная палиндромная программа была бы выполнена и работало, могло бы быть действительно возможным. Так как я сам пока не смог его изготовить, я предлагаю вознаграждение +100 повторений первому человеку, которому удастся его создать!источник
"n\";X;";X;"\n"
комментирование, но я дам вам преимущество сомнения. Однако я действительно искал такие «изначально палиндромные» решения или, по крайней мере, те, где невыполнение блоков было немного более скрытным.1;
). Это все еще считается полностью функциональным?JavaScript (ES6), 245 байт
Я хотел получить ответ JS, который можно запустить в браузере, так что вот оно.
Удаляя весь код, который никогда не запускается, мы получаем это:
Что можно упростить до этого:
источник
n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n
(185 байтов)Javascript (ES6) 288
Запускается в командной строке Spidermonkey . Читает одну строку из STDIN и выводит
true
илиfalse
зависит от того, является ли ввод удобным палиндромом.Этот код синтаксически действителен, но все после
&&
не выполняется, так какprint
функция возвращает значение Falsey.Вы можете запустить этот код в консоли Firefox, запустив эту подкладку первую эмулировать
readline
иprint
функцию. Отредактируйте вход внутриreadline
при необходимости:И вот быстрый пример вывода:
источник
&&
было действительно умно, я рекомендую вам (но это кажется немного обманчивым)05AB1E, 35 байт
Попробуйте онлайн!
Объяснение:
источник
"()[]{}"
вы можете это сделатьžu„<>-
q
хотя бы синтаксического анализа на предмет синтаксической достоверности? Если нет, я бы посчитал это равносильным закомментированию второй половины кода.CJam, 38 байт
Печатает,
"=re%W_@%W_q"1
если ввод удобно палиндромным и"=re%W_@%W_q"0
иначе.Попробуйте онлайн в интерпретаторе CJam .
Как это работает
После выполнения программы CJam автоматически печатает все три элемента в стеке: проверенную строку, логическое значение из сравнения строк и пустую строку.
источник
Perl, 83 + 2 = 85 байт
Бежать с
-nl
Код выходит после печати правдивости ввода. Все после точки с запятой интерпретируется (и может произойти сбой, когда сценарий достигнет этой точки, если бы он не
exit
встречался), но не был выполнен. Если бы яexit;tixe;
пропустил код, он все равно вывел бы результат правильно, прежде чем он потерпел крах.источник