Ha habido un par de intentos anteriores para hacer esta pregunta, pero ninguno se ajusta a los estándares modernos en este sitio. Según el debate sobre Meta , lo vuelvo a publicar de una manera que permita una competencia leal bajo nuestros modernos conjuntos de reglas.
Antecedentes
Un palíndromo es una cadena que "lee lo mismo hacia adelante y hacia atrás", es decir, el reverso de la cadena es el mismo que la cadena misma. No estamos hablando de "palíndromos convenientes" aquí, sino de una inversión estricta de carácter por carácter; por ejemplo, ()()
no es un palíndromo, pero lo ())(
es.
La tarea
Escriba un programa o función que tome una cadena S (o el equivalente apropiado en su idioma) como entrada, y tenga una salida Q (del tipo que elija). Puede utilizar cualquier medio razonable para tomar la entrada y proporcionar la salida.
- Cuando la entrada S es un palíndromo, la salida Q debe tener un valor A (que es el mismo para cualquier S palindrómico ).
- Cuando la entrada S no es un palíndromo, la salida Q debe tener un valor B (que es el mismo para cualquier S no palindrómico ).
- A y B deben ser distintos entre sí.
O en otras palabras: mapear todos los palíndromos a un valor, y todos los no palíndromos a otro.
Además, el programa o función que escriba debe ser un palíndromo en sí mismo (es decir, su código fuente debe ser palindrómico), lo que lo convierte en un desafío de fuente restringida .
Aclaraciones
- Aunque
true
yfalse
son opciones obvias para A y B , puede usar dos valores distintos para sus salidas "es un palíndromo" y "no es un palíndromo", que no necesitan ser booleanos. - Aquí estamos definiendo la inversión de cadena a nivel de personaje ;
éé
es palindrómico independientemente de si el programa está codificado en UTF-8 o Latin-1, a pesar de que no es una secuencia palindrómica de octetos después de la codificación UTF-8. - Sin embargo, incluso si su programa contiene caracteres no ASCII, solo necesita trabajar para la entrada ASCII. Específicamente, la entrada S solo contendrá caracteres ASCII imprimibles (incluido el espacio, pero no la nueva línea). Entre otras cosas, esto significa que si trata la entrada como una secuencia de bytes en lugar de una secuencia de caracteres, es probable que su programa cumpla con la especificación (a menos que la codificación de E / S de su idioma sea muy extraña). Como tal, la definición de un palíndromo en la viñeta anterior solo importa cuando se verifica que el programa tenga la forma correcta.
- Ocultar la mitad del programa en un comentario o cadena literal, sin ser creativo, es legal; se te califica por la longitud, no por la creatividad, así que siéntete libre de usar métodos "aburridos" para asegurarte de que tu programa sea un palíndromo. Por supuesto, debido a que su puntaje se basa en la duración, las partes de su programa que no hacen nada empeorarán su puntaje, por lo que poder usar ambas mitades de su programa probablemente sea útil si puede manejarlo. .
- Debido a que el criterio de victoria se mide en bytes, deberá especificar la codificación en la que está escrito su programa para poder calificarlo (aunque en muchos casos será obvio qué codificación está usando).
Criterio de victoria
Aunque el programa necesita ser un palíndromo a nivel de personaje, estamos usando bytes para ver quién gana. Específicamente, cuanto más corto sea su programa, medido en bytes, mejor; Este es un desafío de código de golf . Para permitir que se comparen los envíos (especialmente los envíos en el mismo idioma), coloque un recuento de bytes para su programa en el encabezado de su envío (más un recuento de caracteres, si difiere del número de bytes).
(
cona
y)
conb
. ¿Esabab
un palíndromo? No, tendría que ser asíabba
. Entonces()()
tampoco es un palíndromo; Tendría que ser())(
.()() is not a palindrome, but ())( is.
¡Felicitaciones, lo hiciste en reddit!Respuestas:
Brachylog (2), 3 bytes en la página de códigos de Brachylog
Pruébalo en línea!
Este es un programa completo que toma la entrada a través de la entrada estándar (usando la sintaxis de Brachylog para constantes, es decir, las cadenas están entre comillas dobles) y las salidas a través de la salida estándar. Las salidas son
true.
para una entrada palindrómica yfalse.
para una entrada no palindrómica.Este programa no solo es palindrómico, sino que también tiene simetría de espejo izquierda / derecha (y probablemente en algunas fuentes arriba / abajo).
Explicación
En Brachylog, las letras mayúsculas marcan puntos en el programa que tienen valores idénticos; esto se usa casi como un circuito eléctrico para transportar información de una parte del programa a otra. Una consecuencia de esto es que si encierra un comando entre un par idéntico de letras mayúsculas, efectivamente está afirmando que la entrada y la salida del comando son las mismas. Brachylog toma entrada implícitamente, por lo que en este caso también estamos afirmando que la entrada al comando es la misma que la entrada al programa. En este programa, estamos usando el comando
↔
, que invierte las cosas (en este caso, cadenas); entonces el programa efectivamente afirma que la entrada es la misma hacia adelante y hacia atrás.Un programa completo (en oposición a una función) en Brachylog devuelve un valor booleano,
false.
si no hay forma de hacer que todas las aserciones en el programa sean correctas a la vez, otrue.
si las aserciones en el programa son compatibles entre sí. Aquí solo tenemos una afirmación: que invertir la entrada no la cambia, por lo que el programa actúa como un verificador de palíndromo.fuente
Pyth , 3 bytes
Devuelve verdadero o falso .
Pruébalo en línea!
Cómo funciona
fuente
_
?Python , 39 bytes
Pruébalo en línea!
Aburrido, pero si hay Python más corto será impresionante.
fuente
(
,)
fueron algunos buenos (y confusos) entradas :)Jalea , 5 bytes
Devuelve 1 o 0 . La primera línea es un enlace auxiliar no ejecutado, la segunda línea llama a la prueba de palíndromo.
Pruébalo en línea!
fuente
Jalea , 5 bytes
Pruébalo en línea!
Es igual a reversa e inversa a igual.
O el más eficiente pero menos estéticamente agradable:
o
fuente
Mathematica, 23 bytes
No muy interesante, pero en aras de la integridad ...
Lo anterior es un
CompoundExpression
que se evalúa comoPalindromeQ
un incorporado que resuelve el desafío.QemordnilaP
es simplemente un identificador indefinido, que se ignora debido a;
.fuente
Haskell,
87854434 bytesExplicación:
((->) a)
es una instancia de aplicativo (gracias @faubiguy), con<*>
definido comoEntonces, sustituyendo en los argumentos uno puede ver por qué esto funciona.
fuente
--
es un comentario.(==)
,reverse
yid
funciones (id
es la función identidad).<*>
lugar de<$>
y eliminando el<*>id
05AB1E , 3 bytes
Código:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
ÂQ
PHP, 55 bytes
Además, el nombre del idioma es un palíndromo, así que ... ¡puntos extra!
fuente
MATL , 7 bytes
Pruébalo en línea!
Devuelve [1; 1] para entrada palindrómica y [0; 0] de lo contrario.
fuente
Pip ,
1211 bytesAhora sin comentarios!
Toma entrada como un argumento de línea de comando; salidas
1
para palíndromo,0
para no palíndromo.Pruébalo en línea!El núcleo de lo que queremos hacer es
RVaQa
:reverse(a) string-equals a
. El códigox:RVaQa
calcula este resultado y se lo asignax
. LuegoVR:x
asigna el valor dex
a la variableVR
. Dado que esta asignación es la última instrucción del programa, su valor también se imprime automáticamente. Voila!Para ver una versión interesante anterior que utiliza un comportamiento indefinido, consulte el historial de revisiones.
fuente
Perl 6 , 25 bytes / caracteres utf8
Intentalo
fuente
R,
111103bytesNo es la respuesta más original.
#
es el carácter de comentario en RSin golf:
La cadena de caracteres de
scan
se convierte en bytes sin formato gracias a lacharToRaw
función. Estos bytes sin procesar se comparan uno por uno con sus contrapartes de larev()
función, que invierte el orden de su argumento. La salida de esta parte es un vector deTRUE
y / oFALSE
.La
all
función luego emiteTRUE
si todos esos elementos sonTRUE
Aquí,
"\n"
en lascan
función es necesario para entradas con más de una palabra.Respuesta anterior (byte-wise), 81 bytes
con - 24 bytes gracias a @rturnbull .
fuente
charToRaw
conversión antes de la asignacións
y cambiando la forma en que configura elsep
argumento parascan
:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
éé
bajo una codificación UTF-8, pero no creo que rompe las reglas del desafío.)éé
con unalatin1
codificación.RProgN , 11 bytes
La primera mitad de esto hace todo el trabajo pesado, y por conveniencia de RProgN, la segunda mitad es un No-op.
Pruébalo en línea!
fuente
Retina , 53 bytes
El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
Estoy bastante seguro de que esto aún no es óptimo (la
»
línea parece particularmente derrochadora, y tengo una solución de 45 bytes que es palindrómica, excepto por un personaje), pero supongo que es un comienzo.fuente
GNU sed ,
6459 + 1 (r flag) = 60 bytes UTF-8Me tomó un tiempo encontrar una respuesta sed que no esté usando una sección de comentarios para convertir el código en un palíndromo. En cambio, uso el
c
comando que imprimiría la primera mitad del código en orden inverso, solo me aseguro de que no se alcance esta instrucción.El script se imprime
1
si la cadena de entrada no es un palíndromo (considérelo como un error). Si la cadena es un palíndromo, entonces no se da salida (piense en ella como si se hubiera salido con éxito).Ejecute ejemplos: o ¡ Pruébelo en línea!
Explicación:
fuente
-r
no funciona, pero puedes envolver todo en BASH. Pruébalo en línea!Alice , 19 bytes
Pruébalo en línea!
Huellas dactilares
Jabberwocky
para palíndromos y nada para los no palíndromos. Funciona para entradas arbitrarias UTF-8.Explicación
Como se trata de una tarea de procesamiento de cadenas, Alice tendrá que operar en modo ordinal para resolverlo. Eso a su vez significa que el puntero de instrucciones tiene que moverse en diagonal y, por lo tanto, necesitamos al menos dos líneas para que la IP pueda rebotar hacia arriba y hacia abajo. El avance de línea en dicho programa lo convierte en una buena posición para colocar el carácter medio del palíndromo. Eso significa que la segunda línea debe ser la inversa de la primera. Pero como solo estamos ejecutando todos los demás caracteres en cada línea, si nos aseguramos de que la longitud de la línea sea impar, el reverso del código encajará perfectamente en sus propios espacios. El único carácter que no se usa en absoluto es la barra diagonal inversa, pero como era arbitrario, lo elegí para que el programa se viera agradable y simétrico.
De todos modos, el código relevante real es este:
El cual se ejecuta en zigzag de izquierda a derecha.
fuente
Haskell , 34 bytes
Pruébalo en línea! Llamar con
f "some string"
, devolucionesTrue
oFalse
.El
=<<
operador en funciones funciona de manera similarf=<<g = \s -> f (g s) s
, por lo que el código es equivalente af s=s==reverse s
, lo que, como acabo de notar, daría como resultado el mismo recuento de bytes.Versión sin comentario: (49 bytes)
Pruébalo en línea!
Llamada con
p "some string"
. Esto salidasFalse
si la cadena dada es un palíndromo, yTrue
si es no un palíndromo.Explicación:
Encontré este comentario libre de palíndromo comenzando con la versión del comentario y reemplazando el comentario con una nueva línea:
La segunda línea falla porque los paréntesis no coinciden, por lo que debemos deshacernos de ellos. Si tuviéramos una función
e
que verificara la igualdad, entoncesambos compilarán con la segunda línea que define un operador infijo
<<=
que toma dos argumentosesrever
ye
y devuelve la funciónp
.Para definir
e
como la función de igualdad, normalmente se escribiríae=(==)
, pero)==(=e
nuevamente no se compilará. En vez podríamos tener explícitamente dos argumentos y pasarlos a==
:e x y=x==y
. Ahora el código invertido sey==x=y x e
compila pero redefine al==
operador, lo que hace que la definicióne x y=x==y
falle. Sin embargo, si cambiamos al operador de desigualdad/=
, la definición inversa se conviertey=/x=y x e
y define un=/
operador que no interfiere con el/=
operador original .fuente
ACEITE , 178 bytes
Lee una entrada, la explota, agrega lentamente su longitud (a través del incremento y la disminución) a la dirección para conocer la dirección después de la cadena, salta a una parte diferente del código (en el medio), invierte la dirección de la banda, implosiona la cadena nuevamente, y comprueba si es lo mismo que la cadena original. TL; DR: Es un dolor, como siempre.
Salidas
40
si la cadena no es un palíndromo,0
si lo es.fuente
Javascript, 64 bytes
Función de llamada
f
con cadenafuente
f
, su código no asigna la función de su flecha a una variable por lo que no se puede llamarJapt ,
72 bytesEjecutarlo
Vieja solución:
Pruébalo en línea!
Explicación
Japt no escapa de las funciones a menos que se llegue a un paréntesis de cierre (o espacio).
Esto puede reescribirse:
U¥Uw(U¥U)
→U¥Uw
→U==Uw
. En Japt, el paréntesis dejado al principio y al final de una función se inserta automáticamente.fuente
w
es una función que no toma argumentos, ¿cómo se aplicaU
? ¿Es algo asíU.reverse()
?U
de la misma manera queU.reverse()
.Bash + Unix utilities, 49 bytes
La entrada se pasa como argumento.
La salida se devuelve en el código de resultado: 0 para un palíndromo, 1 para un no palíndromo.
Quizás alguien pueda hacerlo mejor y no solo confiar en un comentario para hacer que el código sea palindrómico.
Pruébalo en línea!
fuente
[[ $1 = `rev<<<$1` ]]
Es más corto. ([[
Sintaxis Bash , no se necesita presupuesto)rev<<<$1
son necesarias incluso en la[[...]]
solución. Pruébelo con una cadena de entrada'[$]]$['
(que es un palíndromo). Con esas citas agregadas para que funcione, su solución tiene la misma longitud que mi solución.==
in[[
se interpretaría como uncase
patrón similar.> <>, 11 bytes
Pruébalo aquí!
Devuelve "\ nalgo huele a pescado ..." en un palíndromo válido, sin salida en un palíndromo no válido. Coloque el palíndromo en la pila.
fuente
Java -
171169160 bytesEl comentario al final es convertirlo en un palíndromo. Devuelve
P(alindrome)
cuando la entrada es palíndromo yN(ot)
cuando no.Versión sin golf:
2 bytes guardados gracias a @DLosc
¡Gracias a @Olivier Grégoire por señalar la cantidad incorrecta de bytes! Arreglado ahora
fuente
int
s en lugar dechar
s.'P'
y 78 para'N'
o usar caracteres diferentes para guardar aún más bytes.new StringBuffer(s).reverse()+""
lugar denew StringBuffer(s).reverse().toString()
int
lugar debool
?Java 8,
9290 bytesEsta es una versión de comentario. Si una cadena contiene su reverso, entonces es un palíndromo (
true
) de lo contrario no lo es (false
).Pruébalo en línea!
Actualizar
;
'sfuente
s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s
. Pruébelo en línea 90 bytes .En realidad , 5 bytes
Pruébalo en línea!
La salida verdadera es
[1]\n[1]
, y la salida falsey es[]\n[]
(en ambas salidas,\n
representa una nueva línea literal).Explicación:
fuente
C ++, 154 bytes
Tengo que decir que la declaración inversa fue costosa, pero no puedo imaginar mucho que pueda hacer para cambiar eso. Ser capaz de cortar los símbolos std :: me ahorraría alrededor de 10 caracteres, pero "usar el espacio de nombres std;" son bastantes más
Supongo que C ++ no estaba realmente destinado a la brevedad.
fuente
Prólogo, 44 bytes
Esto usa gramáticas de cláusulas definidas. En realidad es una gramática libre de contexto completo:
Uso:
fuente
CJam, 13 bytes
Explicación:
Ejemplo:
fuente
l_W%#e#%W_l
J, 15 bytes, 15 caracteres
Devuelve 1 si palíndromo, 0 si no.
Salida:
Explicación:
fuente