Tulis sebuah program untuk menguji apakah suatu string adalah palindromik, dengan syarat tambahan bahwa program tersebut menjadi palindromik itu sendiri.
Tulis sebuah program untuk menguji apakah suatu string adalah palindromik, dengan syarat tambahan bahwa program tersebut menjadi palindromik itu sendiri.
Jawaban:
z=gets;puts *z.reverse==z&&1||0||1&&z==esrever.z* stup;steg=z
Mencetak 1 jika inputnya adalah palindrome, 0 jika tidak. Masukan tanpa linebreak.
Tidak menggunakan komentar apa pun, melainkan menggunakan 2 trik:
0
adalah true-ish di Ruby (hanya nil
dan false
bernilai false), jadi 1&&z==esrever.z* stup
tidak dievaluasi dan dengan demikian tidak dapat meningkatkan pengecualian runtime*
): Untuk menghindari kesalahan sintaksis dalam z=esrever.z stup
, kami memaksa pengurai untuk mem-parsing ini z=esrever.z()*stup
dengan menambahkan a *
. Di sisi lain, *
diurai sebagai operator percikan, yang dalam panggilan fungsi membagi array dalam serangkaian parameter. Jika hanya ada satu elemen, bukan array, pada dasarnya tidak melakukan apa-apa, jadi puts *foo
setara dengan puts foo
.Solusi jelas menggunakan komentar (cetak benar / salah):
puts gets.reverse==$_#_$==esrever.steg stup
Python tanpa komentar
"a\";w=]1-::[w trinp;)(tupni_war=w;";w=raw_input();print w[::-1]==w;"\a"
Saya terkejut bahwa belum ada yang menemukan trik itu, itu seharusnya bekerja di sebagian besar bahasa!
print
pernyataan dan jika Anda membiarkan input yang ditentukan terlampir dalam kutipan raw_input()
dapat dipersingkat input()
. Kehilangan '=' ekstra di awal.
"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#
Contoh menjalankan:
$ gcc -std=c99 c.c && ./a.out
blahalb
yes
echo strrev($z)==$z;#;z$==)z$(verrts ohce
Fakta:
$z
string, string input untuk diperiksa$t
boolean, TRUE jika string input $z
adalah palindrome, FALSE sebaliknya$t
Alasan mengapa tidak mungkin untuk mengimplementasikan palindrome palindromic checker di PHP itu karena variabel PHP diberi nama dimulai dengan a $
. Anda tidak dapat mengakhiri nama pengenal dengan $
di 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?>
Menggunakan beberapa trik aneh untuk menghindari $
masalah ini, secara teknis bukanlah sebuah palindrom karena saya harus menyelinap ;
masuk pada akhirnya.
<?php $i = fgets(STDIN,2e9); echo $i == strrev($i);/*\;(i$)verrts == i$ ohce ;(9e2, NIDTS)stegf = $i php?>
Ini adalah yang berfungsi yang menggunakan /* */
komentar PHP dan fakta bahwa Anda tidak memerlukannya.
eval
seharusnya lave
.
^Cz.=i_;@;_i=.zC^
Tidak begitu yakin bagaimana kemenangan didefinisikan, tetapi saya menempatkan jumlah byte di bagian atas.
^
mendapatkan input dan mendorongnya ke tumpukan pertama.
C
menyalin tumpukan pertama ke tumpukan kedua.
z
membalikkan bagian atas tumpukan, jadi "as" menjadi "sa".
.
menggeser tumpukan aktif, sehingga tumpukan aktif memiliki input, dan yang tidak aktif memiliki input terbalik.
=
memeriksa kesetaraan, mengembalikan 0
kesetaraan.
i
membalik ToS, jadi 0
menjadi 1
, dan apa pun menjadi cukup banyak False
.
_
muncul dan atur variabel temp yang ;
kemudian dicetak.
@
mengakhiri program secara manual, sehingga tidak mengenai bagian yang terbalik. Ini membuat palindrome.