Considere a transformação Atbash :
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
Onde A ⇔ Z e L ⇔ O, por exemplo, existe uma propriedade interessante que algumas palavras compartilham. Quando algumas strings são traduzidas para o equivalente atbash, a tradução é a palavra original invertida. Eu chamo esses auto-palindromes de Atbash .
Como exemplo, vamos traduzir o WIZARD :
W → D
I → R
Z → A
A → Z
R → I
D → W
O resultado é DRAZIW , que é o WIZARD invertido. Assim, o WIZARD é um auto-palíndromo atbash.
Objetivo Dada uma sequência de caracteres ASCII imprimíveis, produza ou retorne um valor verdadeiro se essa sequência for um auto-palíndromo atbash e, caso contrário, um valor falsey. (Isso é feito através do STDIN, equivalente mais próximo, entrada funcional, etc. Se o seu idioma não puder fazer nada disso, considere escolher um idioma diferente, você pode codificar a entrada.) Você deve fazer isso sem distinção de maiúsculas e minúsculas. Se a entrada for um palíndromo e não for afetada pela sequência atbash, você ainda deverá gerar true, pois um palíndromo + em si é um palíndromo. Este é um código de golfe , portanto o programa mais curto em bytes vence.
Casos de teste
"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
Entre os melhores
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](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
...Respostas:
RX ,
98 bytesFortemente inspirado pela Retina, fiz isso alguns dias atrás. Código:
Explicação:
Experimente aqui !
fonte
Pitão,
109 bytesExperimente este violino online ou verifique todos os casos de teste de uma só vez.
Explicação
fonte
rz0
duas vezes, não é mais curto salvá-lo em uma variável?q_Jrz0XJG
é um byte mais curto.Julia, 96 bytes
Esta é uma função lambda que aceita uma string e retorna uma string. Para chamá-lo, atribua-o a uma variável.
Ungolfed:
fonte
Utilitários Bash + Linux, 56
Produz a string vazia para Truthy e algo como
- /dev/fd/63 differ: byte 1, line 1
para Falsey. Se isso não for aceitável, podemos adicionar-s
3 bytes extras e usar os códigos de retorno Unix padrão de 0 para Success (Truthy) e 1 para Failure (Falsey).fonte
Retina , 44 bytes
Imprime
1
ou0
. A contagem de bytes assume que o arquivo está codificado como ISO 8859-1.Experimente online!
Essa resposta foi amplamente inspirada na resposta sed da DigitalTrauma, mas, novamente, acho que não existem muitas abordagens para esse desafio em primeiro lugar.
Explicação
Sempre que você vê um
¶
, a primeira coisa que o Retina faz depois de dividir o código em linhas é substituir todos os pilrows por feeds de linha. Isso permite a inclusão de feeds de linha para um único byte, embora os feeds de linha sejam o separador de estágio do Retina.Começamos duplicando a entrada. Combinamos o final da entrada com
$
e inserimos um avanço de linha junto com a entrada (usando$_
).Um estágio de transliteração. Vamos começar com a regex:
.+$
. Corresponde à segunda cópia da entrada (garantindo que a correspondência vá até o final da sequência). Portanto, apenas os caracteres na segunda cópia serão transliterados. A transliteração em si faz uso de alguns recursos muito recentes.l
eL
são classes de caracteres para letras maiúsculas e minúsculas, respectivamente.o
refere-se ao outro conjunto de caracteres da transliteração e aR
reverte. Portanto, os dois conjuntos de caracteres se expandem para:Você notará que isso muda o caso ao executar o código Atbash, mas faremos a comparação final sem distinção entre maiúsculas e minúsculas.
Agora, invertemos a segunda cópia. Infelizmente, Retina ainda não tem uma maneira conveniente de fazer isso, então teremos que mover um personagem de ponta a ponta de cada vez. Isso é feito redirecionando o separador de avanço de linha como um marcador cuja parte ainda não foi revertida. Combinamos essa parte, mas capturamos o último caractere separadamente. Esse personagem fica na frente e o restante permanece inalterado. O
+
instrui o Retina a fazer isso repetidamente até que não seja mais possível (porque¶
está no final da string).Finalmente, verificamos se as duas strings são iguais. O
i
faz o padrão de maiúsculas e minúsculas - convenientemente, em .NET, isso significa que backreferences também são case-insensitive. Você pode perceber que não temos mais um separador entre a entrada original e a cópia modificada. Porém, não precisamos de um, porque eles têm o mesmo comprimento e, se a string agora consistir exatamente na mesma string duas vezes (conforme o caso), essas devem ser a original e a modificada. Se você está se perguntando o que aconteceu com o feed de linha à direita que usamos como marcador, ele ainda está lá, mas em muitos sabores de expressão regular$
também corresponde antes do último caractere da sequência se esse caractere é um avanço de linha.Como esta etapa consiste apenas em uma única linha, é considerada uma etapa de partida, que conta o número de partidas. Se a entrada for um palíndromo do Atbash, obteremos exatamente uma correspondência e a saída será
1
. Caso contrário, esse regex não corresponderá e a saída será0
.fonte
\n
em regex e$n
em substituição, mas isso é um desperdício de bytes para o golfe. ;)GNU Sed, 105
Saídas 1 para verdade e 0 para falsey.
Tentei fazer isso no Retina, mas não consegui descobrir como salvar a string antes da transliteração Atbash para comparação reversa com after. Talvez haja uma maneira melhor.
O
y
comando de transliteração do Sed deixa muito a desejar.fonte
T
- eu estava assumindo que ele era aplicado a cada personagem por sua vez, mas se meu entendimento estiver correto, ele se aplica a todo o espaço do padrão, que é muito mais útil[\s\S]+
omitindo, você está transliterando tudo.-r
flag pelas barras invertidas em\(
e\)
. Eu concordo com você noy
comando!, 15 caracteres / 30 bytes
Try it here (Firefox only).
Explicação
fonte
Parênteses, 658 bytes
No momento, só funciona para todas as maiúsculas sem espaço em branco, usando esta versão modificada do script para suportar a leitura de stdin:
Explicação
fonte
Python 3,
9085 bytesConvertemos a entrada em maiúscula e, em seguida, calculamos a sequência Atbashed subtraindo todos os ordinais de 155 se estiverem no intervalo do alfabeto em maiúsculas.
fonte
Kerf , 73 bytes
Kerf é uma linguagem proprietária na mesma família geral que APL, J e K. É possível escrever oneliners crípticos e compactos e evitar o uso de loops explícitos:
No entanto, o uso dos aliases explicitados para comandos em vez dos símbolos abreviados e o uso de identificadores significativos tornam o programa muito mais claro e fácil de seguir, mesmo que você não esteja familiarizado com o Kerf:
Em ação:
O Kerf provavelmente não vai ganhar uma tonelada de competições de codegolfe, especialmente contra linguagens criadas para fins específicos, mas pode valer a pena mexer se você gosta da idéia de linguagens da família APL, mas acha a sintaxe muito estranha. ( Isenção de responsabilidade: sou o autor do manual de referência do Kerf. )
fonte
Prolog, 121 bytes
Isso é chamado com um átomo como entrada, por exemplo
a('WIZARD').
.fonte
JavaScript (ES6), 91
TESTE
fonte
C,
10197 bytesComo a pergunta especificou caracteres ASCII, isso não lida com nenhuma outra codificação.
Explicação
Fazemos um ponteiro
p
que começa no final da string. Em seguida, fazemos um loop, movendo-noss
ep
um para o outros
chega ao fim. Isso significa que todos os pares de caracteres serão verificados duas vezes, mas isso economiza alguns bytes em comparação à parada assim que os ponteiros passam.A cada iteração, verificamos se
*p
é uma letra. Se assim for, verifique se*s
está na faixa de letras (ASCII 64 para cima), e que*p
e*s
adicionar até 27 (mod 32). As letras que não sejam letras com mais de 64 anos serão reprovadas nesse teste, portanto, não precisamos verificarisalpha(*s)
.Se
*p
não é uma letra, simplesmente testamos se é igual a*s
. Nos dois casos, encerramos o loop antess
ep
atravessamos.Se
s
ep
tivermos cruzado, todos os pares de letras corresponderam corretamente; portanto, retornamos verdadeiro; caso contrário, retornamos falso.Programa de teste
Passe as seqüências a serem testadas como argumentos da linha de comando. Isso produz uma saída correta para todos os casos de teste. Não há requisito fornecido para a cadeia vazia; minha implementação retorna false para essa entrada.
fonte
f
's declaração de tipo para um protótipo de estilo K & R:f(char*s)
Perl 5, 70 bytes
Uma sub-rotina:
Veja em uso:
fonte
MATL, 23 bytes
Usa a versão atual .
Exemplos
fonte
CJam, 18 bytes
Experimente online
Funciona convertendo a entrada para maiúscula, executando a tradução de letras, vira a seqüência e verifica a igualdade.
fonte
Japonês,
3027 bytesExperimente online!
Como funciona
Isso se baseia em grande parte na minha resposta japonesa em Trocar o alfabeto.
fonte
Python,
156112 bytesBasicamente, ele faz um dicionário da tradução com letras maiúsculas e a entrada é maiúscula (se tudo fosse minúsculo, isso acrescentaria 5 bytes). Em seguida, para cada caractere na entrada em maiúscula, faça a tradução e anexe a uma lista, a menos que o caractere não esteja no alfabeto; nesse caso, anexe o caractere como está. Junte-se à lista inteira e compare com a lista invertida.
Grite para o @Artyer por postar quase exatamente como eu ia postar antes de mim. Mas preciso confirmar, esse é o meu trabalho e fiz isso de forma independente .
Baseado na resposta de Julia por Alex A. Experimente aqui
fonte
.get(i,i)
. +1.05AB1E , 8 bytes (não concorrente)
Esse idioma usa recursos que pós-datam o desafio e, portanto, não são concorrentes.
Código:
Explicação:
Experimente online!
fonte
Fator,
118113 bytesEsta é uma função anônima.
Não conheço uma maneira mais curta de gerar uma matriz associativa do alfabeto: c
fonte
Clojure, 100 bytes
Deveria ser possível reduzi-lo a uma única função anônima, cortando em torno de mais 10 bytes (de declarações), mas ainda não encontrei um caminho.
fonte
Ruby,
7977 bytesAceita a palavra para testar como um argumento da linha de comandos. Sai com o código 0 (que é verdadeiro para o shell) se o argumento for um auto-palíndromo atbash ou com o código 1 caso contrário.
fonte
puts
resultado não seria mais curto do que sair com um ternário?$*
é um apelido paraARGV
.Ruby, 56 bytes
É uma função anônima que pega uma string e retorna
true
oufalse
. É um pouco desajeitado: para salvar alguns bytes, ele usa a variante destrutiva deupcase
(com um!
depois).upcase!
infelizmente retornanil
se nada for alterado (como todas as entradas numéricas), então alguns bytes são perdidos tentando lidar com isso. Ainda funciona tho :)fonte
MATLAB, 61 bytes
Não é a solução mais curta, mas ainda é interessante
fonte