Verificador palíndromo palíndrico [fechado]

37

Escreva um programa para testar se uma sequência é palindrômica, com a condição adicional de que o programa seja palindrômico.

marcog
fonte
11
Se o idioma tiver comentários até o fim da linha, isso é trivial, então acho que eles devem ser proibidos.
Joey
11
@Joey, eu ficaria feliz em desencorajar o uso de tais comentários, mas desaprová-los depois de fazer a pergunta é duro para aqueles que já responderam. A resposta de @ Ventero (a única que não os usa) está muito à frente na contagem de votos, então todos parecem concordar.
marcog
11
Bem, para eliminar tais problemas anteriormente (isto também ocorreu em uma tarefa semelhante no SO) você pode usar a caixa de areia ou no laboratório enigma ;-)
Joey
11
Como sobre a imposição de que o programa deve ser ele próprio um Quine palíndromo mal sorriso ;-)
Quixotic
4
Sei que essa é uma pergunta antiga, mas acho que precisa de um critério de vitória arbitrário, como um concurso de popularidade ou código de golfe. A pergunta não especifica nenhum.
mbomb007

Respostas:

34

Rubi

z=gets;puts *z.reverse==z&&1||0||1&&z==esrever.z* stup;steg=z

Imprime 1 se a entrada for um palíndromo, 0 se não for. Entrada sem quebra de linha.

Não usa nenhum comentário, mas usa dois truques:

  • Curto-circuito: 0é true-ish no Ruby (apenas nile é falseavaliado como falso), portanto 1&&z==esrever.z* stupnão é avaliado e, portanto, não pode gerar uma exceção de tempo de execução
  • O operador de splat / multiplicação ( *): Para evitar um erro de sintaxe z=esrever.z stup, forçamos o analisador a analisar isso como z=esrever.z()*stupadicionando a *. Por outro lado, o *é analisado como um operador de splat, que em uma chamada de função divide um array em uma série de parâmetros. Se existe apenas um elemento em vez de uma matriz, basicamente não faz nada, então puts *fooé equivalente a puts foo.

Solução óbvia usando comentários (imprime verdadeiro / falso):

puts gets.reverse==$_#_$==esrever.steg stup
Ventero
fonte
Você pode explicar como isso funciona? Eu não sei Ruby.
mellamokb
@ellamokb: eu adicionei uma breve explicação. Deixe-me saber se ainda não está claro.
Ventero 30/03
26

Python sem comentário

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

Estou surpreso que ninguém tenha encontrado esse truque ainda, ele deve funcionar na maioria dos idiomas!

Jules Olléon
fonte
2
Muito esperto, eu gosto da citação de escape.
Wayne Werner
Solução agradável, você pode até soltar a printinstrução e, se você permitir que a entrada especificada entre aspas raw_input()possa ser reduzida input(). Faltando um '=' extra no início.
Willem
saída final removido depois de Verdadeiro ou Falso:"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$"

truques sem comentários, apenas abusando habilmente do operador de substituição (ei, variáveis ​​perl começam com $ também, e daí?)

Anônimo
fonte
7

Python 2.7

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

C

#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#

Exemplo em execução:

$ gcc -std=c99 c.c && ./a.out 
blahalb
yes
Alexandru
fonte
não vai ganhar por brevidade, mas estou impressionado
Wayne Werner
lol, inteligente-lvl 11/10.
Nymo
5

Golfscript

.-1%=#=%1-.
  • apenas com truque de comentário
  • entrada sem \ n no final
  • executar char correspondente por char (mesmo para pontuação)
  • retorna 1 para sucesso, 0 para falha
VOCÊS
fonte
4

PHP

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

Fatos:

  • $z string, a string de entrada para verificar
  • $tbooleano, TRUE se a sequência de entrada $zfor palíndromo, FALSE caso contrário
  • Usando comentários para me ajudar a tornar o código palíndromo.
  • Saídas $t
  • A própria fonte é um palíndromo

A razão pela qual não será possível implementar o verificador palíndromo palíndromo no PHP é porque as variáveis ​​PHP são nomeadas começando com a $. Você não pode terminar um nome de identificador com $no PHP.

Mauris
fonte
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?>

Usa alguns truques estranhos para evitar o $problema, tecnicamente não é um palíndromo, pois eu tive que me infiltrar ;no final.

 <?php $i = fgets(STDIN,2e9); echo $i == strrev($i);/*\;(i$)verrts == i$ ohce ;(9e2, NIDTS)stegf = $i php?>

Este é um trabalho que usa os /* */comentários do PHP e o fato de que você não precisa do fim para eles.

Kevin Brown
fonte
2
No final, o primeiro código evaldeve ser lave.
Aycan Yaşıt
1

CoffeeScript

Na verdade, lutei com as grafias reversas de 'split', 'reverse' e 'join': \

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

Groovy

print args[0]==args[0].reverse()?1:0//0:1?)(esrever.]0[sgra==]0[sgra tnirp
Vendedor
fonte
Você usou comentários aqui!
Ant
1

Python 3, 55 bytes

Usa um comentário, mas é mais curto que o outro Python que usa comentários.

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

Fuzzy Octo Guacamole , 17 bytes

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

Não sei exatamente como a vitória está definida, mas eu coloco a contagem de bytes no topo.

^ obtém a entrada e a envia para a primeira pilha.

C copia a primeira pilha para a segunda.

z inverta a parte superior da pilha, para que "as" se torne "sa".

. muda a pilha ativa, para que a pilha ativa tenha a entrada e a inativa a entrada reversa.

=verifica a igualdade, retornando 0à igualdade.

iinverte os ToS, 0torna - se 1, e qualquer outra coisa se torna False.

_aparece e define a variável temp que é ;impressa.

@finaliza o programa manualmente, para não atingir a parte invertida. Isso faz o palíndromo.

Rɪᴋᴇʀ
fonte
0

Javascript

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

Difícil de fazer isso sem comentários ...

Spedwards
fonte