Considere la transformación de 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
Donde A ⇔ Z y L ⇔ O, por ejemplo, hay una propiedad interesante que comparten algunas palabras. Cuando algunas cadenas se traducen a su equivalente atbash, dicha traducción es la palabra original invertida. Yo lo denomino Atbash Auto palíndromos .
Como ejemplo, traduzcamos WIZARD :
W → D
I → R
Z → A
A → Z
R → I
D → W
El resultado es DRAZIW , que es WIZARD invertido. Por lo tanto, WIZARD es un auto-palíndromo atbash.
Objetivo Dada una cadena de caracteres ASCII imprimibles, genera o devuelve un valor verdadero si esa cadena es un palíndromo automático atbash, y un valor falsey de lo contrario. (Esto se hace a través de STDIN, el equivalente más cercano, la entrada funcional, etc. Si su idioma no puede hacer nada de esto, considere elegir un idioma diferente para codificar la entrada). Debe hacerlo sin distinción entre mayúsculas y minúsculas. Si la entrada es un palíndromo y no se ve afectada por la secuencia atbash, aún debe generar verdadero, ya que un palíndromo + en sí mismo es un palíndromo. Este es un código de golf , por lo que gana el programa más corto en bytes.
Casos de prueba
"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
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](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
...Respuestas:
RX ,
98 bytesMuy inspirado por Retina, hice esto hace unos días. Código:
Explicación:
Pruébalo aquí !
fuente
Pyth,
109 bytesPruebe este violín en línea o verifique todos los casos de prueba a la vez.
Explicación
fuente
rz0
dos veces, ¿no es más corto guardarlo en una variable?q_Jrz0XJG
es un byte más corto.Julia, 96 bytes
Esta es una función lambda que acepta una cadena y devuelve una cadena. Para llamarlo, asígnelo a una variable.
Sin golf:
fuente
Bash + utilidades de Linux, 56
Emite la cadena vacía para Truthy y algo así como
- /dev/fd/63 differ: byte 1, line 1
para Falsey. Si esto no es aceptable, podemos agregar-s
3 bytes adicionales y usar los códigos de retorno estándar de Unix de 0 para Éxito (Verdad) y 1 para Fracaso (Falsey).fuente
Retina , 44 bytes
Impresiones
1
o0
. El recuento de bytes supone que el archivo está codificado como ISO 8859-1.Pruébalo en línea!
Esta respuesta se inspiró en gran medida en la respuesta sed de DigitalTrauma, pero supongo que no hay muchos enfoques para este desafío en primer lugar.
Explicación
Siempre que vea un
¶
, lo primero que hace Retina después de dividir el código en líneas es reemplazar todos esos pilcrows con saltos de línea. Esto permite la inclusión de avances de línea para un solo byte aunque los avances de línea son el separador de etapas de Retina.Comenzamos duplicando la entrada. Hacemos coincidir el final de la entrada
$
e insertamos un salto de línea junto con la entrada en sí (usando$_
).Una etapa de transliteración. Vamos a empezar con la expresión regular:
.+$
. Coincide con la segunda copia de la entrada (asegurando que la coincidencia se extiende hasta el final de la cadena) Entonces solo los caracteres en la segunda copia serán transliterados. La transliteración en sí hace uso de algunas características muy recientes.l
yL
son clases de caracteres para letras mayúsculas y minúsculas, respectivamente.o
se refiere al otro conjunto de caracteres de la transliteración y loR
invierte. Entonces los dos conjuntos de caracteres se expanden a:Notarás que esto cambia el caso mientras haces el cifrado Atbash, pero de todos modos haremos la comparación final sin distinción entre mayúsculas y minúsculas.
Ahora invertimos la segunda copia. Desafortunadamente, Retina aún no tiene una forma conveniente de hacerlo, por lo que tendremos que mover un personaje desde el final al frente a la vez. Esto se hace reutilizando el separador de salto de línea como marcador de qué parte aún no se ha invertido. Emparejamos esa parte pero capturamos el último personaje por separado. Ese personaje va al frente, y el resto no cambia. El
+
le dice a Retina que haga esto repetidamente hasta que ya no sea posible (porque¶
está al final de la cadena).Finalmente, verificamos si las dos cadenas son iguales. Esto
i
hace que el patrón no distinga entre mayúsculas y minúsculas: convenientemente, en .NET, esto significa que las referencias posteriores también distinguen entre mayúsculas y minúsculas. Puede notar que ya no tenemos un separador entre la entrada original y la copia modificada. Sin embargo, no necesitamos uno, porque tienen la misma longitud, y si la cadena ahora consta exactamente de la misma cadena dos veces (hasta el caso), entonces deben ser la cadena original y la modificada. Si se pregunta qué sucedió con el avance de línea final que usamos como marcador, todavía está allí, pero en muchos sabores de expresiones regulares$
también coincide antes del último carácter de la cadena si ese carácter es un avance de línea.Como esta etapa solo consiste en una sola línea, se considera una etapa de coincidencia, que cuenta el número de coincidencias. Si la entrada es un palíndromo Atbash, obtendremos exactamente una coincidencia y la salida es
1
. De lo contrario, esta expresión regular no coincidirá y la salida sí0
.fuente
\n
en expresiones regulares y$n
en sustitución, pero eso es bytes perdidos para jugar al golf. ;)GNU Sed, 105
Salidas 1 para la verdad y 0 para falsey.
Traté de hacer esto en Retina, pero no pude encontrar la manera de guardar la cadena antes de la transcripción de Atbash para una comparación inversa con después. Quizás haya una mejor manera.
El
y
comando de transliteración de Sed deja mucho que desear.fuente
T
- Supuse que se aplicaba a cada personaje por turno, pero si mi comprensión es correcta, se aplica a todo el espacio del patrón, lo cual es mucho más útil[\s\S]+
así, al omitirla, estás transcribiendo todo.-r
indicador por las barras diagonales inversas en\(
y\)
. Estoy de acuerdo contigo en ely
comando!𝔼𝕊𝕄𝕚𝕟, 15 caracteres / 30 bytes
Try it here (Firefox only).
Explicación
fuente
Paréntesis, 658 bytes
Solo funciona para todas las mayúsculas sin espacios en blanco en este momento, usando esta versión modificada del script para que admita la lectura de stdin:
Explicación
fuente
Python 3,
9085 bytesConvertimos la entrada a mayúsculas, y luego calculamos la cadena Atbashed restando todos los ordinales de 155 si están en el rango del alfabeto en mayúsculas.
fuente
Kerf , 73 bytes
Kerf es un lenguaje patentado en la misma familia general que APL, J y K. Es posible escribir líneas enigmáticas, compactas y evitar el uso de bucles explícitos:
Sin embargo, el uso de los alias enunciados para los comandos en lugar de los símbolos abreviados y el uso de identificadores significativos hace que el programa sea mucho más claro y bastante fácil de seguir, incluso si no está familiarizado con Kerf:
En acción:
Kerf probablemente no va a ganar un montón de competiciones de codegolf, especialmente contra lenguajes especialmente diseñados, pero podría valer la pena jugar si le gusta la idea de los lenguajes de la familia APL pero encuentra la sintaxis demasiado extraña. ( Descargo de responsabilidad: soy el autor del manual de referencia para Kerf ) .
fuente
Prólogo, 121 bytes
Esto se llama con un átomo como entrada, por ejemplo
a('WIZARD').
.fuente
JavaScript (ES6), 91
PRUEBA
fuente
C,
10197 bytesComo la pregunta especificaba caracteres ASCII, esto no maneja ninguna otra codificación.
Explicación
Hacemos un puntero
p
que comienza al final de la cadena. Luego hacemos un bucle, moviéndonos amboss
yp
hacia el otros
llega al final. Esto significa que cada par de caracteres se verificará dos veces, pero esto ahorra un par de bytes en comparación con la detención tan pronto como se cruzan los punteros.En cada iteración, verificamos si
*p
es una letra. Si es así, verifique que*s
esté en el rango de letras (ASCII 64 hacia arriba),*p
y*s
agregue hasta 27 (mod 32). Las letras que no sean más de 64 no pasarán esa prueba, por lo que no necesitamos verificarisalpha(*s)
.Si
*p
no es una letra, entonces simplemente probamos si es igual a*s
. En cualquier caso, terminamos el ciclo antess
y lop
cruzamos.Si
s
y sep
han cruzado, cada par de letras coincidió correctamente, por lo que devolvemos verdadero; de lo contrario, devolvemos falso.Programa de prueba
Pase las cadenas a probar como argumentos de línea de comandos. Esto produce la salida correcta para todos los casos de prueba. No hay un requisito proporcionado para la cadena vacía; mi implementación devuelve falso para esa entrada.
fuente
f
la declaración de tipo de un prototipo de estilo K&R:f(char*s)
Perl 5, 70 bytes
Una subrutina:
Véalo en uso:
fuente
MATL, 23 bytes
Utiliza versión actual .
Ejemplos
fuente
CJam, 18 bytes
Pruébalo en línea
Funciona convirtiendo la entrada a mayúsculas, realizando la traducción de letras, voltea la cadena y verifica la igualdad.
fuente
Japt,
3027 bytesPruébalo en línea!
Cómo funciona
Esto se basa en gran medida en mi respuesta de Japt en Swap the Alphabet.
fuente
Python,
156112 bytesBásicamente, crea un diccionario de la traducción con letras mayúsculas y la entrada se escribe con mayúscula (si todo fuera minúscula, eso agregaría 5 bytes). Luego, para cada carácter en la entrada en mayúscula, realice la traducción y agregue a una lista a menos que el carácter no esté en el alfabeto, en cuyo caso agregue el carácter como está. Únase a la lista completa y compárela con la lista invertida.
Un agradecimiento a @Artyer por publicar casi exactamente como iba a publicar antes que yo. Pero necesito confirmar, este es mi trabajo y lo hice de forma independiente .
Basado en la respuesta de Julia de Alex A. Pruébalo aquí
fuente
.get(i,i)
. +1.05AB1E , 8 bytes (no competitivos)
Este lenguaje utiliza características que son posteriores al desafío y, por lo tanto, no compite.
Código:
Explicación:
Pruébalo en línea!
fuente
Factor,
118113 bytesEsta es una función anónima.
No conozco una forma más corta de generar una matriz asociativa del alfabeto: c
fuente
Clojure, 100 bytes
Debería ser posible reducirlo a una sola función anónima, recortando alrededor de 10 bytes más (de declaraciones) pero aún no encontré una manera.
fuente
Ruby,
7977 bytesAcepta la palabra para probar como argumento de línea de comando. Sale con el código 0 (que es verdadero para el shell) si el argumento es un palindrome de atbash, o con el código 1 de lo contrario.
fuente
puts
el resultado más corto que salir con un ternario?$*
es un alias paraARGV
.Ruby, 56 bytes
Es una función anónima que toma una cadena y devuelve
true
ofalse
. Es bastante torpe: para guardar algunos bytes, utiliza la variante destructiva deupcase
(con un!
después).upcase!
desafortunadamente regresanil
si no se cambia nada (como toda la entrada numérica), por lo que se pierden algunos bytes tratando de lidiar con eso. Todavía funciona aunque :)fuente
MATLAB, 61 bytes
No es la solución más corta, pero sigue siendo interesante.
fuente