Рассмотрим преобразование Атбаша :
A|B|C|D|E|F|G|H|I|J|K|L|M
Z|Y|X|W|V|U|T|S|R|Q|P|O|N
Где A ⇔ Z и L ⇔ O, например. Есть интересное свойство, которое разделяют некоторые слова. Когда некоторые строки переводятся в их эквивалентный atbash, указанный перевод является обратным исходным словом. Я называю эти Атбашские Палиндромы .
В качестве примера давайте переведем WIZARD :
W → D
I → R
Z → A
A → Z
R → I
D → W
В результате DRAZIW , который WIZARD наоборот. Таким образом, WIZARD - это самопалиндром atbash.
Цель. Задать строку печатных символов ASCII, вывести или вернуть истинное значение, если эта строка представляет собой собственный палиндром atbash, а в противном случае - значение false. (Это делается с помощью STDIN, ближайшего аналога, функционального ввода и т. Д. Если ваш язык не может сделать ничего из этого, рассмотрите возможность выбора другого языка, который вы можете жестко закодировать для ввода.) Вы должны делать это без учета регистра. Если вход является палиндромом и не зависит от последовательности atbash, вы все равно должны вывести true, так как сам палиндром + является палиндромом. Это код-гольф , поэтому выигрывает самая короткая программа в байтах.
Контрольные примеры
"Input" => true, false
"WIZARD" => true
"Wizard" => true // case doesn't matter
"wIzArD" => true
"W I Z A R D" => true
"W IZ ARD" => false // the atbash of this is D RA ZIW, which is not a palindrome of W IZ ARD
"ABCXYZ" => true // ZYXCBA
"345 09%" => false // is not a palindrome
"ev" => true // ve
"AZGDFSSF IJHSDFIU HFIA" => false
"Zyba" => true
"-AZ" => false // -ZA is not a reverse of -AZ
"Tree vvig" => true // Givv eert
"$%%$" => true // palindrome
"A$&$z" => true // z$&$A
Leaderboard
Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=68757,OVERRIDE_USER=44713;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code
...Ответы:
RX ,
98 байтСильно вдохновленный Retina, я сделал это несколько дней назад. Код:
Объяснение:
Попробуй это здесь !
источник
Pyth,
109 байтовПопробуйте эту скрипку онлайн или проверьте все тестовые случаи одновременно.
объяснение
источник
rz0
дважды, не короче ли вы сохранить его в переменную?q_Jrz0XJG
на один байт короче.Юлия, 96 байт
Это лямбда-функция, которая принимает строку и возвращает строку. Чтобы вызвать его, присвойте его переменной.
Ungolfed:
источник
Утилиты Bash + Linux, 56
Выводит пустую строку для Truthy и что-то вроде
- /dev/fd/63 differ: byte 1, line 1
Falsey. Если это неприемлемо, тогда мы можем добавить-s
дополнительные 3 байта и использовать стандартные коды возврата Unix, равные 0 для успеха (Truthy) и 1 для сбоя (Falsey).источник
Сетчатка , 44 байта
Отпечатки
1
или0
. Подсчет байтов предполагает, что файл закодирован как ISO 8859-1.Попробуйте онлайн!
Этот ответ был в значительной степени вдохновлен ответом sed DigitalTrauma, но, опять же, я думаю, что, во-первых, не так много подходов к этому вызову.
объяснение
Всякий раз, когда вы видите
¶
, первое, что делает Retina после разбиения кода на строки, - это заменяет все эти пики на перевод строки. Это позволяет включать перевод строки для одного байта, даже если перевод строки является разделителем стадии Retina.Мы начнем с дублирования ввода. Мы сопоставляем конец ввода с
$
и вставляем перевод строки вместе с самим вводом (используя$_
).Стадия транслитерации. Давайте начнем с регулярным выражением:
.+$
. Он совпадает со второй копией ввода (гарантируя, что совпадение продолжается до конца строки). Поэтому только символы во втором экземпляре будут транслитерированы. Сама транслитерация использует некоторые новейшие функции.l
иL
являются классами символов для строчных и прописных букв соответственно.o
относится к другому набору символов транслитерации иR
обращает его вспять. Таким образом, два набора символов расширяются до:Вы заметите, что это меняет регистр при выполнении шифра Atbash, но мы все равно будем делать окончательное сравнение без учета регистра.
Теперь мы переворачиваем второй экземпляр. К сожалению, в Retina пока нет удобного способа сделать это, поэтому нам придется перемещать одного персонажа с конца на передний план за раз. Это делается путем повторного использования разделителя перевода строки в качестве маркера, часть которого еще не была перевернута. Мы сопоставляем эту часть, но захватываем последний символ отдельно. Этот персонаж идет впереди, а остальная часть остается неизменной.
+
Не говорит Retina сделать это несколько раз , пока не будет уже невозможно (потому что¶
в конце строки).Наконец, мы проверяем, являются ли две строки одинаковыми. Это
i
делает шаблон нечувствительным к регистру - удобно, в .NET, это означает, что обратные ссылки также нечувствительны к регистру. Вы можете заметить, что у нас больше нет разделителя между исходным вводом и измененной копией. Однако он нам не нужен, потому что они имеют одинаковую длину, и если строка теперь состоит из одной и той же строки дважды (с точностью до регистра), то они должны быть исходной и измененной строкой. Если вам интересно , что случилось с завершающим переводом строки , которую мы использовали в качестве маркера, он все еще там, но и во многих регулярных выражений ароматизаторов$
также соответствует до того последнего символа строки , если этот символ перевода строки.Поскольку этот этап состоит только из одной строки, он считается этапом совпадения, который подсчитывает количество совпадений. Если входной сигнал является палиндромом Atbash, мы получим ровно одно совпадение, и выходной результат будет
1
. Если нет, то это регулярное выражение не будет совпадать, и результат будет0
.источник
\n
в регулярных выражениях и$n
в замене, но это пустая трата байтов для игры в гольф. ;)GNU Sed, 105
Выходы 1 для правды и 0 для фальси.
Я пытался сделать это в Retina, но не мог понять, как сохранить строку перед транслитерацией Atbash для обратного сравнения с последующим. Возможно, есть лучший способ.
y
Команда транслитерации Седа оставляет желать лучшего.источник
T
- я предполагал, что оно применяется к каждому символу по очереди, но если мое понимание верно, оно применяется ко всему пространству паттернов, что гораздо полезнее[\s\S]+
, опуская его, вы транслитерируете все.-r
флаг обратной косой черты в\(
и\)
. Я согласен с вами поy
команде!𝔼𝕊𝕄𝕚𝕟, 15 символов / 30 байтов
Try it here (Firefox only).
объяснение
источник
Родительский, 658 байт
Сейчас работает только для всех заглавных букв без пробелов, используя эту модифицированную версию скрипта, так что он поддерживает чтение из stdin:
объяснение
источник
Python 3,
9085 байтМы преобразуем ввод в верхний регистр, а затем вычисляем строку Atbashed, вычитая все порядковые числа из 155, если они находятся в диапазоне прописных букв.
источник
Kerf , 73 байта
Kerf является проприетарным языком из того же общего семейства, что и APL, J и K. Можно писать загадочные, компактные однослойные и избегать использования явных циклов:
Тем не менее, использование прописных псевдонимов для команд вместо сокращенных символов и использование значимых идентификаторов делает программу намного более понятной и довольно простой для понимания, даже если вы не знакомы с Kerf:
В бою:
Керф, вероятно, не собирается выиграть кучу соревнований по кодгольфу, особенно против специально созданных языков, но, возможно, стоит повозиться, если вам нравится идея языков семейства APL, но вы находите синтаксис слишком странным. ( Отказ от ответственности: я автор справочного руководства для Kerf. )
источник
Пролог, 121 байт
Это вызывается с атомом в качестве входа, например
a('WIZARD').
.источник
JavaScript (ES6), 91
ТЕСТ
источник
C
10197 байтПоскольку в вопросе указаны символы ASCII, это не относится к другим кодировкам.
объяснение
Мы делаем указатель,
p
который начинается в конце строки. Затем мы зациклились, двигаясьs
иp
друг к другу, иs
достигли конца. Это означает, что каждая пара символов будет проверяться дважды, но это экономит пару байтов по сравнению с остановкой, как только указатели пересекаются.На каждой итерации мы проверяем,
*p
является ли буква. Если это так, проверьте, что*s
это в диапазоне букв (ASCII 64 и выше), и это*p
и*s
добавить до 27 (мод 32). Не-буквы старше 64 не пройдут этот тест, поэтому нам не нужно проверятьisalpha(*s)
.Если
*p
это не буква, то мы просто проверяем, равно ли оно*s
. В любом случае, мы прекращаем цикл раньшеs
иp
переходим.Если
s
иp
пересекли, то каждая пара букв соответствует правильно, поэтому мы возвращаем true; в противном случае мы возвращаем false.Тестовая программа
Передайте строки для проверки в качестве аргументов командной строки. Это дает правильный вывод для всех тестовых случаев. Там нет поставляемого требования для пустой строки; моя реализация возвращает ложь для этого ввода.
источник
f
объявление типа для прототипа в стиле K & R:f(char*s)
Perl 5, 70 байт
Подпрограмма:
Смотрите это в использовании:
источник
MATL, 23 байта
Использует текущий выпуск .
Примеры
источник
CJam, 18 байт
Попробуйте онлайн
Работает путем преобразования ввода в верхний регистр, выполнения перевода букв, переворачивания строки и проверки на равенство.
источник
Japt,
3027 байтПопробуйте онлайн!
Как это работает
Во многом это основано на моем ответе Джапта об обмене алфавитом.
источник
Python,
156112 байтПо сути, он составляет словарь перевода с заглавными буквами, а ввод заглавными (если бы все было строчными, то это добавило бы 5 байтов). Затем для каждого символа в вводе с заглавной буквы выполните перевод и добавьте в список, если символ не находится в алфавите, и в этом случае добавьте символ как есть. Присоединитесь ко всему списку и сравните с перевернутым списком.
Привет @Artyer за то, что он опубликовал почти так же, как я собирался опубликовать до меня. Но я должен подтвердить, что это моя работа, и я сделал это самостоятельно .
Основано на ответе Юлии Алексея. Попробуйте здесь
источник
.get(i,i)
. +1.05AB1E , 8 байт (не конкурирует)
Этот язык использует функции, которые устарели и поэтому не конкурируют.
Код:
Объяснение:
Попробуйте онлайн!
источник
Фактор
118113 байтЭто анонимная функция.
Я не знаю более короткого способа генерирования ассоциативного массива алфавита: c
источник
Clojure, 100 байт
Должна быть возможность сократить его до одной анонимной функции, сократив еще около 10 байтов (объявлений), но я пока не нашел пути.
источник
Рубин,
7977 байтПринимает слово для проверки в качестве аргумента командной строки. Выход с кодом 0 (который является правдивым для оболочки), если аргумент является самопалиндромом atbash, или с кодом 1 в противном случае.
источник
puts
результат не будет короче, чем выход с тройной?$*
это псевдонимARGV
.Рубин, 56 байт
Это анонимная функция, которая принимает строку и возвращает
true
илиfalse
. Это довольно неуклюже: чтобы сэкономить несколько байтов, он использует деструктивный вариантupcase
(с!
последующим после него).upcase!
к сожалению, возвращается,nil
если ничего не изменилось (как и все числовые данные), поэтому некоторые байты теряются при попытке справиться с этим. Все еще работает, хотя :)источник
MATLAB, 61 байт
Не самое короткое решение, но все же интересно
источник