Напишіть програму, щоб перевірити, чи є рядок паліндромною, з додатковою умовою, що програма сама буде паліндромною.
Напишіть програму, щоб перевірити, чи є рядок паліндромною, з додатковою умовою, що програма сама буде паліндромною.
Відповіді:
z=gets;puts *z.reverse==z&&1||0||1&&z==esrever.z* stup;steg=z
Друкує 1, якщо вхід є паліндром, 0, якщо це не так. Введення без розриву рядків
Не використовує жодних коментарів, натомість використовує 2 прийоми:
0
є справжнім-ish в Ruby (тільки nil
і false
оцінюється до false), тому 1&&z==esrever.z* stup
не оцінюється і, таким чином, не може підняти виняток з виконання*
): Щоб уникнути помилки синтаксису z=esrever.z stup
, ми змушуємо аналізатор проаналізувати це як z=esrever.z()*stup
шляхом додавання *
. З іншого боку, the *
аналізується як оператор splat, який у виклику функції розбиває масив на ряд параметрів. Якщо замість масиву є лише один елемент, він в основному нічого не робить, тому puts *foo
еквівалентний puts foo
.Очевидне рішення за допомогою коментарів (друкує правду / хибність):
puts gets.reverse==$_#_$==esrever.steg stup
Пітон без коментарів
"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
булева, ІСТИНА, якщо вхідний рядок $z
паліндром, ЛІЖНІ в іншому випадку$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
.
^Cz.=i_;@;_i=.zC^
Не зовсім впевнений, як визначається виграш, але я ставлю кількість байтів вище.
^
отримує вхід і натискає на перший стек.
C
копіює перший стек до другого.
z
перевернути верхню частину стека, так що "як" стає "sa".
.
зміщує активний стек, тому активний стек має вхід, а неактивний - зворотний вхід.
=
перевірки рівності, повернення 0
на рівність.
i
інвертує ToS, так 0
стає1
, і все інше в значній мірі стає False
.
_
з'являється і встановлює змінну temp, яка ;
потім друкує.
@
закінчує програму вручну, щоб вона не потрапила на зворотну частину. Це робить паліндром.