Escriba un programa para probar si una cadena es palindrómica, con la condición adicional de que el programa sea palindrómico.
Escriba un programa para probar si una cadena es palindrómica, con la condición adicional de que el programa sea palindrómico.
Respuestas:
z=gets;puts *z.reverse==z&&1||0||1&&z==esrever.z* stup;steg=z
Imprime 1 si la entrada es un palíndromo, 0 si no lo es. Entrada sin salto de línea.
No usa ningún comentario, en su lugar usa 2 trucos:
0
es verdadero-ish en Ruby (solo nil
y false
evaluar como falso), por 1&&z==esrever.z* stup
lo que no se evalúa y, por lo tanto, no puede generar una excepción de tiempo de ejecución*
): para evitar un error de sintaxis z=esrever.z stup
, forzamos al analizador a analizar esto z=esrever.z()*stup
al agregar a *
. Por otro lado, *
se analiza como un operador splat, que en una llamada a la función divide una matriz en una serie de parámetros. Si solo hay un elemento en lugar de una matriz, básicamente no hace nada, por lo que puts *foo
es equivalente a puts foo
.Solución obvia usando comentarios (imprime verdadero / falso):
puts gets.reverse==$_#_$==esrever.steg stup
Python sin comentarios
"a\";w=]1-::[w trinp;)(tupni_war=w;";w=raw_input();print w[::-1]==w;"\a"
Me sorprende que nadie haya encontrado ese truco todavía, ¡debería funcionar en la mayoría de los idiomas!
print
declaración y si permite que la entrada especificada entre comillas raw_input()
se acorte input()
. Falta un '=' extra al comienzo.
"a\"#;w==]1-::[w;)(tupni_war=w;";w=raw_input();w[::-1]==w;#"\a"
#include <stdio.h> //
#include <string.h> //
int main() { //
char str[1024]; //
fgets(str, sizeof(str), stdin); //
int i = 0, j = strlen(str) - 2; //
for (; i < j; i++, j--) //
if (str[i] != str[j]) { //
printf("no\n"); //
return 0; //
} //
printf("yes\n"); //
} //
// }
// ;)"n\sey"(ftnirp
// }
// ;0 nruter
// ;)"n\on"(ftnirp
// { )]j[rts =! ]i[rts( fi
// )--j ,++i ;j < i ;( rof
// ;2 - )rts(nelrts = j ,0 = i tni
// ;)nidts ,)rts(foezis ,rts(stegf
// ;]4201[rts rahc
// { )(niam tni
// >h.gnirts< edulcni#
// >h.oidts< edulcni#
Ejecutando ejemplo:
$ gcc -std=c99 c.c && ./a.out
blahalb
yes
echo strrev($z)==$z;#;z$==)z$(verrts ohce
Hechos:
$z
string, la cadena de entrada para verificar$t
boolean, TRUE si la cadena de entrada $z
es palíndromo, FALSO de lo contrario$t
La razón por la cual no será posible implementar el verificador de palíndromo palindrómico en PHP es porque las variables de PHP se nombran comenzando con a $
. No puede finalizar un nombre de identificador con $
en PHP.
<?php eval/*/*/(';{$i=fgets(STDIN,2e9);};{$a="strrev";}{var_dump("{$i}"=="{$a($i)}");}/*}{*\{;("{(tupni$)a$}"=="{putni$}")ohce}{;"verrts"==a$};{;(9e2,NIDTS)stegf=i$);');/*\*\eval php?>
Utiliza algunos trucos extraños para evitar el $
problema, técnicamente no es un palíndromo ya que tuve que introducirlo ;
al final.
<?php $i = fgets(STDIN,2e9); echo $i == strrev($i);/*\;(i$)verrts == i$ ohce ;(9e2, NIDTS)stegf = $i php?>
Este es un trabajo que utiliza los /* */
comentarios de PHP y el hecho de que no necesita el final para ellos.
eval
debería ser lave
.
^Cz.=i_;@;_i=.zC^
No estoy seguro de cómo se define la victoria, pero puse el conteo de bytes en la parte superior.
^
obtiene la entrada y la empuja a la primera pila.
C
copia la primera pila a la segunda.
z
invierta la parte superior de la pila, de modo que "as" se convierta en "sa".
.
desplaza la pila activa, de modo que la pila activa tiene la entrada y la inactiva tiene la entrada invertida.
=
comprueba la igualdad, volviendo 0
por la igualdad.
i
invierte el ToS, entonces se 0
convierte 1
, y cualquier otra cosa se convierte prácticamente False
.
_
aparece y establece la variable temporal que ;
luego imprime.
@
finaliza el programa manualmente, por lo que no golpea la parte invertida. Esto hace que el palíndromo.