Напишите программу для проверки, является ли строка палиндромной, с дополнительным условием, чтобы программа была самой палиндромной.
Напишите программу для проверки, является ли строка палиндромной, с дополнительным условием, чтобы программа была самой палиндромной.
Ответы:
z=gets;puts *z.reverse==z&&1||0||1&&z==esrever.z* stup;steg=z
Печатает 1, если ввод палиндром, 0, если это не так. Ввод без перевода строки.
Не использует никаких комментариев, вместо этого он использует 2 хитрости:
0является истинным в Ruby (только nilи falseоценивается как ложное), поэтому 1&&z==esrever.z* stupне оценивается и, следовательно, не может вызвать исключение времени выполнения*): чтобы избежать синтаксической ошибки в z=esrever.z stup, мы заставляем синтаксический анализатор проанализировать это как z=esrever.z()*stupдобавление a *. С другой стороны, *синтаксический анализ разбирается как оператор splat, который при вызове функции разбивает массив на ряд параметров. Если вместо массива есть только один элемент, он в основном ничего не делает, поэтому puts *fooэквивалентен puts foo.Очевидное решение с использованием комментариев (выводит true / false):
puts gets.reverse==$_#_$==esrever.steg stup
Python без комментариев
"a\";w=]1-::[w trinp;)(tupni_war=w;";w=raw_input();print w[::-1]==w;"\a"
Я удивлен, что никто еще не нашел этот трюк, он должен работать на большинстве языков!
printоператор, и если вы разрешите ввод к указанным в кавычках, raw_input()может быть сокращен до input(). Отсутствует лишний '=' в начале.
"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#
Бегущий пример:
$ gcc -std=c99 c.c && ./a.out
blahalb
yes
echo strrev($z)==$z;#;z$==)z$(verrts ohce
Факты:
$z строка, входная строка для проверки$tлогическое, TRUE, если входная строка $zпалиндром, FALSE в противном случае$tПричина, по которой невозможно реализовать палиндромную палиндромную проверку в PHP, заключается в том, что переменные PHP именуются, начиная с $. Вы не можете завершить имя идентификатора $в 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?>
Использует некоторые странные уловки, чтобы избежать этой $проблемы, технически это не палиндром, так как мне пришлось пробраться ;в конце.
<?php $i = fgets(STDIN,2e9); echo $i == strrev($i);/*\;(i$)verrts == i$ ohce ;(9e2, NIDTS)stegf = $i php?>
Это рабочий, который использует /* */комментарии PHP и тот факт, что вам не нужен конец для них.
evalдолжно быть lave.
print args[0]==args[0].reverse()?1:0//0:1?)(esrever.]0[sgra==]0[sgra tnirp
^Cz.=i_;@;_i=.zC^
Не совсем уверен, как определяется победа, но я поставил счет байтов на первое место.
^ получает входные данные и помещает их в первый стек
C копирует первый стек во второй.
z обратная вершина стека, так что «as» становится «sa».
. смещает активный стек, поэтому активный стек имеет вход, а неактивный - обратный.
=проверяет равенство, возвращая 0равенство.
iинвертирует ToS, так 0становится 1, и все остальное в значительной степени становится False.
_выскакивает и устанавливает временную переменную, которую ;затем печатает.
@завершает программу вручную, чтобы она не попала в обратную сторону. Это делает палиндром.