Было несколько предыдущих попыток задать этот вопрос, но ни одна из них не соответствует современным стандартам на этом сайте. В ходе обсуждения 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!