Schreiben Sie ein Programm, um zu testen, ob eine Zeichenfolge palindrom ist, mit der zusätzlichen Bedingung, dass das Programm selbst palindrom ist.
Schreiben Sie ein Programm, um zu testen, ob eine Zeichenfolge palindrom ist, mit der zusätzlichen Bedingung, dass das Programm selbst palindrom ist.
Antworten:
z=gets;puts *z.reverse==z&&1||0||1&&z==esrever.z* stup;steg=z
Gibt 1 aus, wenn die Eingabe ein Palindrom ist, und 0, wenn dies nicht der Fall ist. Eingabe ohne Zeilenumbruch.
Verwendet keine Kommentare, sondern zwei Tricks:
0
Ist in Ruby wahr (nur nil
und wird false
als falsch ausgewertet), wird also 1&&z==esrever.z* stup
nicht ausgewertet und kann daher keine Laufzeitausnahme auslösen*
): Um einen Syntaxfehler in zu vermeiden z=esrever.z stup
, erzwingen wir, dass der Parser dies analysiert, z=esrever.z()*stup
indem wir a hinzufügen *
. Auf der anderen Seite wird das *
als Splat-Operator analysiert, der in einem Funktionsaufruf ein Array in eine Reihe von Parametern aufteilt. Wenn es nur ein Element anstelle eines Arrays gibt, tut es im Grunde nichts und puts *foo
ist äquivalent zu puts foo
.Offensichtliche Lösung mit Kommentaren (druckt wahr / falsch):
puts gets.reverse==$_#_$==esrever.steg stup
Python ohne Kommentar
"a\";w=]1-::[w trinp;)(tupni_war=w;";w=raw_input();print w[::-1]==w;"\a"
Ich bin überrascht, dass noch niemand diesen Trick gefunden hat, er sollte in den meisten Sprachen funktionieren!
print
Anweisung fallen lassen und wenn man die in Anführungszeichen gesetzten Eingaben zulässt, raw_input()
kann auf gekürzt werden input()
. Am Anfang fehlt ein zusätzliches '='.
"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#
Laufendes Beispiel:
$ gcc -std=c99 c.c && ./a.out
blahalb
yes
echo strrev($z)==$z;#;z$==)z$(verrts ohce
Fakten:
$z
string, die zu überprüfende Eingabezeichenfolge$t
Boolescher Wert, TRUE, wenn die Eingabezeichenfolge $z
palindrom ist, andernfalls FALSE$t
Der Grund, warum es nicht möglich sein wird, palindromic palindrome checker in PHP zu implementieren, liegt darin, dass PHP-Variablen mit einem beginnend benannt werden $
. Sie können einen Bezeichnernamen nicht mit $
in PHP beenden .
<?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?>
Benutzt einige seltsame Tricks, um das $
Problem zu umgehen , technisch gesehen ist es kein Palindrom, da ich mich ;
am Ende einschleichen musste .
<?php $i = fgets(STDIN,2e9); echo $i == strrev($i);/*\;(i$)verrts == i$ ohce ;(9e2, NIDTS)stegf = $i php?>
Dies ist eine funktionierende, die PHP- /* */
Kommentare und die Tatsache verwendet, dass Sie das Ende für sie nicht brauchen.
eval
sein lave
.
^Cz.=i_;@;_i=.zC^
Ich bin mir nicht ganz sicher, wie der Gewinn definiert ist, aber ich habe die Byteanzahl nach oben gesetzt.
^
Ruft die Eingabe ab und schiebt sie zum ersten Stapel.
C
kopiert den ersten Stapel in den zweiten.
z
kehren Sie die Oberseite des Stapels um, so dass "as" zu "sa" wird.
.
verschiebt den aktiven Stapel, so dass der aktive Stapel den Eingang und der inaktive den umgekehrten Eingang hat.
=
prüft auf Gleichheit, kehrt 0
auf Gleichheit zurück.
i
invertiert den ToS, 0
wird also 1
, und alles andere wird so ziemlich False
.
_
Pops und legt die Temp-Variable fest, die ;
dann gedruckt wird.
@
Beendet das Programm manuell, damit es den umgekehrten Teil nicht berührt. Dies macht das Palindrom.