Палиндромная палиндромная проверка [закрыто]


37

Напишите программу для проверки, является ли строка палиндромной, с дополнительным условием, чтобы программа была самой палиндромной.


1
Если у языка есть комментарии «до конца строки», это тривиально, так что я думаю, что они должны быть запрещены.
Джои

1
@ Джой, я бы с радостью воспрепятствовал использованию таких комментариев, но запретить их после постановки вопроса резко для тех, кто уже ответил. @ Ответ Ventero (единственный, кто их не использует) - далеко впереди в подсчете голосов, поэтому, похоже, все с этим согласны.
Marcog

1
Ну, чтобы отсеять такие проблемы раньше (это также произошло в аналогичной задаче на SO), вы можете использовать песочницу или Лабораторию головоломок ;-)
Joey

1
Как насчет навязывания, что программа должна быть палиндромной, сама по себе злая усмешка ;-)
Quixotic

4
Я знаю, что это старый вопрос, но я думаю, что ему нужен произвольный критерий выигрыша, такой как конкурс популярности или код-гольф. Вопрос не указывает ни один.
mbomb007

Ответы:


34

Рубин

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не оценивается и, следовательно, не может вызвать исключение времени выполнения
  • Оператор splat / multiplication ( *): чтобы избежать синтаксической ошибки в z=esrever.z stup, мы заставляем синтаксический анализатор проанализировать это как z=esrever.z()*stupдобавление a *. С другой стороны, *синтаксический анализ разбирается как оператор splat, который при вызове функции разбивает массив на ряд параметров. Если вместо массива есть только один элемент, он в основном ничего не делает, поэтому puts *fooэквивалентен puts foo.

Очевидное решение с использованием комментариев (выводит true / false):

puts gets.reverse==$_#_$==esrever.steg stup

Можете ли вы объяснить, как это работает? Я не знаю рубина.
mellamokb

@mellamokb: я добавил краткое объяснение. Дайте мне знать, если это все еще не ясно.
Вентеро

26

Python без комментариев

"a\";w=]1-::[w trinp;)(tupni_war=w;";w=raw_input();print w[::-1]==w;"\a"

Я удивлен, что никто еще не нашел этот трюк, он должен работать на большинстве языков!


2
Очень умно, мне нравится экранирующая цитата.
Уэйн Вернер

Хорошее решение, вы можете даже удалить printоператор, и если вы разрешите ввод к указанным в кавычках, raw_input()может быть сокращен до input(). Отсутствует лишний '=' в начале.
Виллем

удален конечный результат после True или False:"a\"#;w==]1-::[w;)(tupni_war=w;";w=raw_input();w[::-1]==w;#"\a"
Willem

13

Perl

perl -nle "$s=$_ eq+reverse;print$s;s$tnirp;esrever+qe _$=s$"

без комментариев, просто ловко злоупотребляя оператором подстановки (эй, переменные perl тоже начинаются с $, ну и что?)


7

Python 2.7

s=raw_input();print'YNEOS'[s!=s[::-1]::2]#]2::]1-::[s=!s['SOENY'tnirp;)(tupni_war=s

6

С

#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

не выиграю для краткости, но я впечатлен
Уэйн Вернер

LOL, умный уровень 11/10.
nymo

5

Golfscript

.-1%=#=%1-.
  • просто с комментариями
  • ввод без \ n в конце
  • выполнить сопоставление символа за символом (даже для пунктуации)
  • возвращает 1 за успех, 0 за неудачу

4

PHP

echo strrev($z)==$z;#;z$==)z$(verrts ohce

Факты:

  • $z строка, входная строка для проверки
  • $tлогическое, TRUE, если входная строка $zпалиндром, FALSE в противном случае
  • Использование комментариев, чтобы помочь мне сделать код палиндрома.
  • Выходы $t
  • Сам источник - палиндром

Причина, по которой невозможно реализовать палиндромную палиндромную проверку в PHP, заключается в том, что переменные PHP именуются, начиная с $. Вы не можете завершить имя идентификатора $в PHP.


2

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 и тот факт, что вам не нужен конец для них.


2
В конце первый код, evalдолжно быть lave.
Aycan Yaşıt

1

CoffeeScript

Я на самом деле боролся с обратным написанием слов «split», «reverse» и «join»: \

p=(s)->s.split('').reverse().join('')==s#s==)''(nioj.)(esrever.)''(tilps.s>-)s(=p


1

Python 3, 55 байт

Использует комментарий, но короче, чем другой Python, который использует комментарии.

s=input();print(s==s[::-1])#)]1-::[s==s(tnirp;)(tupni=s

1

Нечеткое окто гуакамоле , 17 байтов

^Cz.=i_;@;_i=.zC^

Не совсем уверен, как определяется победа, но я поставил счет байтов на первое место.

^ получает входные данные и помещает их в первый стек

C копирует первый стек во второй.

z обратная вершина стека, так что «as» становится «sa».

. смещает активный стек, поэтому активный стек имеет вход, а неактивный - обратный.

=проверяет равенство, возвращая 0равенство.

iинвертирует ToS, так 0становится 1, и все остальное в значительной степени становится False.

_выскакивает и устанавливает временную переменную, которую ;затем печатает.

@завершает программу вручную, чтобы она не попала в обратную сторону. Это делает палиндром.


0

Javascript

function a(b){return b==b.split('').reverse().join('')}//})''(nioj.)(esrever.)''(tilps.b==b nruter{)b(a noitcnuf

Трудно сделать это без комментариев ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.