Si alguna vez has intentado escribir código palindrómico antes, sabrías cuántos corchetes tienden a interponerse en tu camino. ()()
no es un palíndromo, a pesar de que se ve un poco como debería ser, al tiempo ())(
, y ()(
son a la vez capicúa y ambos mirando muy tonta. ¿No sería conveniente si fuera al revés?
Una cadena es convenientemente palindrómica si es igual a la cadena derivada cuando su reverso tiene todos sus paréntesis ( ()
), corchetes ( []
) y llaves ( {}
) invertidos. Ningún otro personaje es especial y requiere voltear. (a <>
veces se combinan, pero a menudo no, por lo que se dejan fuera).
Su tarea es escribir, en su idioma, un programa (tomando entradas en STDIN) o una función (tomando un argumento de cadena única) que (a) da un valor verdadero consistente * cuando su argumento es convenientemente palindrómico y un falso falso diferente y consistente valor de otro modo, y (b) es en sí convenientemente palindrómica.
Por ejemplo, las siguientes entradas son convenientemente palindrómicas:
racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov
Y los siguientes no son:
non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni
No puede confiar en ningún estado externo (nombre de archivo específico, estructura de directorio, otra entrada del usuario, acceso web, etc.), excepto las banderas de intérprete / compilador.
Además, no puede usar "el truco de comentarios" en el que comenta o deja sin usar algún fragmento de código aprovechando las funciones de comentarios de su idioma. Por ejemplo, todo lo siguiente no está permitido, porque contienen partes no funcionales que pueden eliminarse o destruirse de manera segura (a costa de perder convenientemente la palindrómica):
{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"
Obviamente, esto podría no cubrir cada uno de estos casos, pero el espíritu del desafío aquí es no usar comentarios y código no analizado ** para lograr palindrominess, en lugar de utilizar los paréntesis y paréntesis corregidos. Te estoy mirando, LISP, Brainfuck.
Este es un código de golf , por lo que gana el código más corto, pero todas las longitudes de código son bienvenidas.
* Por valores consistentes de verdadero y falso, quiero decir que puede devolver uno de un par de valores, como 1
verdadero y 0
falso, o False
verdadero y "no"
falso, siempre que estos valores sean diferentes entre sí y no cambiar de ejecución a ejecución de su programa. Usa lo que te salve personajes.
** No debe confundirse con no ejecutado : el código que es válido y puede hacer cosas raras pero nunca llamado está bien.
fuente
if(false){some code}
o variables no utilizadas? ¿Están permitidos?(eslaf)fi
, puedes usarloif(false)
.()()
no es un palíndromoRespuestas:
J (60)
Esta es una función que toma un argumento:
Explicación:
f :: g
ejecuta la funciónf
sobre la entrada y devuelve el resultado si vuelve sin error. Sif
falla, se ejecuta en sug
lugar.El
f
aquí es(|.-:'())([]][{}}{'&charsub)
, que hace el trabajo real:|.
: marcha atrás-:
: es igual a'())([]][{}}{'&charsub
: reemplazar cada soporte con su soporte opuestog
función es(busrahc&'}{{}][[])(()':-.|)
, que no tiene sentido pero es sintácticamente válida.busrahc
no está definido, pero eso no importa porque solo se resuelve cuando se ejecuta (y no se ejecutará).fuente
f :: g
eng@-@f
.g
es equivalente al gancho(-.|)
debido a:
que las salidas se convierten en -1 y la lista vacía para convenientemente palindrómica y no, respectivamente.GolfScript,
10791Las nuevas líneas son artísticas.
fi
,c43
yc
son noops, pero se ejecuta todo el código.Imprime
-3-1-1
para palíndromos convenientes, de lo-4-1-1
contrario. Pruébalo en línea!Versión alternativa, 155 bytes.
A un costo de 64 bytes, esto se puede mejorar con:
Como antes, se ejecuta todo el código y cada byte afecta la salida.
Imprime
010
para palíndromos convenientes, de lo-100
contrario. Pruébalo en línea!Pruebas y ejemplos.
Cómo funciona
fuente
Ruby, 110
Imprime
true
si la entrada es un palíndromo conveniente yfalse
si no lo es. Tenga en cuenta que esta solución supone que la entrada no termina en una nueva línea, así que pruébela conecho -n
:Este es un puerto algo directo de mi respuesta a Palindromic Palindrome Checker (y hasta ahora no ha jugado golf). El truco principal utilizado es que la primera expresión entre paréntesis siempre regresa
1
, por lo que la segunda mitad de la expresión booleana nunca se evalúa (pero se analiza).La única dificultad para adaptar esto fue descubrir cómo agregar la llamada para
z.tr
que su "reverso conveniente" también fuera sintácticamente válido, pero simplemente podría usar el mismo truco que ya usé put:*
que en la primera mitad se analiza como operador splat (use el contenido de la matriz como parámetros de función) y como operador de multiplicación de matriz (o repitición) en la segunda mitad.Rubí, 157
297, todo el código ejecutadoEsta versión (un poco más larga) ejecuta todo el código, y todas menos dos líneas afectan la salida, que se imprime en la última línea, pero todas las líneas se analizan y ejecutan sin ningún error. Esta versión interpreta cualquier nueva línea final como parte de la entrada, así que úsela
echo -n
para probarla o anteponga su entrada con una nueva línea. Imprimetrue
si la entrada es un palíndromo conveniente, y de lofalse
contrario.Explicación
fuente
GolfScript, 61 caracteres
OK, aquí hay una solución de referencia en GolfScript. Estoy seguro de que podría mejorarse aún más:
Como es habitual en GolfScript, este programa lee su entrada de stdin. Produce:
si la entrada es un palíndromo conveniente, como se define en el desafío anterior, y:
si no es.
Explicación: Este programa se basa en gran medida en la decisión de que el código no ejecutado está bien, siempre que se analice. Se compone de dos bloques de código, delimitados por llaves (
{ }
), que son imágenes especulares entre sí.El primer bloque de código se ejecuta al
~
seguirlo, y comprueba si la entrada es un palíndromo conveniente, generando1
si lo es y0
si no lo es. El segundo bloque de código no se ejecuta, por lo que simplemente permanece en la pila hasta que finaliza el programa y todo el contenido de la pila se encadena e imprime automáticamente por el intérprete de GolfScript.Cabe señalar que el intérprete de GolfScript realiza muy pocas verificaciones de sintaxis en el momento del análisis (o alguna vez, para el caso); un literal de bloque de código GolfScript puede contener casi cualquier cosa, incluso si se bloquea cuando se ejecuta. Aún así, algunos errores de sintaxis, como los literales de cadena no terminados, generan un error incluso en código no ejecutado, por lo que creo que esta solución (apenas) se encuentra dentro de las reglas.
PD. Mirando el código ejecutado real, contiene algunos elementos convenientemente palindrómicos como
@[.]@
el literal de cadena"([{}])"
e incluso el bucle%{ ... }%
. Esto ofrece la sugerencia tentadora de que una solución GolfScript "intrínsecamente palindrómica", donde el programa palindrómico completo sería ejecutado y funcional, podría ser realmente posible. Como todavía no he logrado producir uno, ¡por la presente ofrezco una recompensa de +100 repeticiones a la primera persona que logra inventar una!fuente
"n\";X;";X;"\n"
tipo de comentarios, pero le daré el beneficio de la duda. Sin embargo, en realidad estaba buscando tales soluciones "intrínsecamente palindrómicas", o al menos aquellas en las que la no ejecución de los bloques fuera un poco menos clara.1;
). ¿Eso todavía cuenta como completamente funcional?JavaScript (ES6), 245 bytes
Quería una respuesta JS que pudiera ejecutarse en el navegador, así que aquí está.
Eliminando todo el código que nunca se ejecuta, obtenemos esto:
Lo cual se puede simplificar a esto:
fuente
n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n
(185 bytes)Javascript (ES6) 288
Se ejecuta en la línea de comandos de Spidermonkey . Lee una sola línea de STDIN y las salidas
true
ofalse
dependiendo de si la entrada es un palíndromo conveniente.Este código es sintácticamente válido, pero todo lo que
&&
sigue no se ejecuta, ya que laprint
función devuelve un valor falsey.Puede ejecutar este código en la consola de Firefox ejecutando este calce primero para emular las funciones
readline
yprint
. Edite la entrada dentroreadline
según sea necesario:Y aquí hay un ejemplo rápido de la salida:
fuente
&&
fue realmente inteligente, te felicito (pero parece un poco engañoso)05AB1E, 35 bytes
Pruébalo en línea!
Explicación:
fuente
"()[]{}"
usted puede hacerložu„<>-
q
analiza el resto del programa después de al menos la validez sintáctica? Si no, consideraría esto como comentar la segunda mitad del código.CJam, 38 bytes
Imprime
"=re%W_@%W_q"1
si la entrada es convenientemente palindrómica y de"=re%W_@%W_q"0
otro modo.Pruébelo en línea en el intérprete de CJam .
Cómo funciona
Después de ejecutar el programa, CJam imprime automáticamente los tres elementos en la pila: la cadena inspeccionada, el booleano de la comparación de cadenas y la cadena vacía.
fuente
Perl, 83 + 2 = 85 bytes
Corre con
-nl
El código sale después de imprimir la veracidad de la entrada. Todo después del punto y coma se interpreta (y se bloqueará cuando el script llegue a ese punto si no fuera por el
exit
que encuentra), pero no se ejecuta. Si me quedaraexit;tixe;
fuera del código, aún imprimiría el resultado correctamente antes de que se bloqueara.fuente