Напишите программу для проверки, является ли строка палиндромной, с дополнительным условием, чтобы программа была самой палиндромной.
Напишите программу для проверки, является ли строка палиндромной, с дополнительным условием, чтобы программа была самой палиндромной.
Ответы:
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
.
_
выскакивает и устанавливает временную переменную, которую ;
затем печатает.
@
завершает программу вручную, чтобы она не попала в обратную сторону. Это делает палиндром.