Pergunta

O objetivo: qualquer idioma. O menor função que irá retornar se uma string é um palíndromo. Aqui é a minha em Python :

R=lambda s:all(a==b for a,b in zip(s,reversed(s)))

50 caracteres.

A resposta aceita será a corrente menor deles - o que irá mudar à medida que os menores são encontrados. Por favor, especifique o idioma seu código está em.

Foi útil?

Solução

7 caracteres em J: Não tenho certeza se este é o melhor caminho, que eu sou um pouco novo para J:)

p=:-:|.

explicação: |. inverte a entrada. -: compara. os operandos estão implícitas.

p 'radar'
1

p 'moose'
0

Outras dicas

Aqui é meu; ele é escrito em uma linguagem específica de domínio I inventado, chamado 'palíndromo'.

p

Editar: Menos versão irreverente (i386 asm, AT & T sintaxe)

xor %eax, %eax
mov %esi, %edi
#cld    not necessary, assume DF=0 as per x86 ABI
repne scasb
scan:
    dec %edi
    cmpsb
    .byte 0x75, 6    #jnz (short) done
    dec %edi
    cmp %esi, %edi
    .byte 0x72, -9    #jb (short) scan
inc %eax
done:

16 bytes, ponteiro de cadeia vai no ESI, resultado é em EAX.

Infelizmente, eu sou incapaz de obter sob um mil palavras ...

text alt

(. LabVIEW Sim, eles vão deixar praticamente qualquer pós hobo aqui;)

Haskell, 15 caracteres:

p=ap(==)reverse

versão mais legível, 16 caracteres:

p x=x==reverse x

Outra versão python que é bastante mais curto (21 caracteres):

R=lambda s:s==s[::-1]

Com o risco de ficar para baixo de votos, a maioria de todos estes apenas chamar um comando reversa de algum tipo que esconde toda a lógica de programação real.

Gostaria de saber o que o mais curto forma manual para fazer isso é em cada um desses idiomas.

Com C operadores # e LINQ:

public bool IsPalindrome(string s)
{
    return s.Reverse().SequenceEqual(s);
}

Se você considerar reversa como trapaça, você pode fazer a coisa toda com uma redução:

public bool IsPalindrome(string s)
{
    return s.Aggregate(new StringBuilder(),
                       (sb, c) => sb.Insert(0, c),
                       (sb) => sb.ToString() == s);
}

Perl (27 caracteres):

sub p{$_[0]eq reverse$_[0]}

Ruby (24 caracteres):

def p(a)a==a.reverse end

73 limpas e legíveis, caracteres escritos em Java

boolean p(String s){return s.equals(""+new StringBuffer(s).reverse());}

paz :)

Versão Pointless Haskell (15 caracteres, embora realmente não funciona, a menos que incluem Control.Arrow e Control.Monad e ignorar a restrição monomorphism):

p=ap(==)reverse

objetivos Lua mais a legibilidade de concisão, mas faz um honesto 37 caracteres:

function p(s)return s==s:reverse()end

variante, apenas por diversão (mesmo tamanho):

p=function(s)return s==s:reverse''end

A versão JavaScript é mais detalhado (55 caracteres), porque ele não tem uma função inversa string:

function p(s){return s==s.split('').reverse().join('')}
(equal p (reverse p))

lisp. 18 caracteres.

ok, este é um caso especial. Isso poderia funcionar, se digitado diretamente em um interpretador LISP e p já foi definido.

caso contrário, este seria necessário:

(defun g () (equal p (reverse p)))

28 caracteres.

Vou levá-lo um pouco mais longe:. Cheia c código, compilação e ir

90 caracteres

main(int n,char**v){char*b,*e;b=e=v[1];while(*++e);for(e--;*b==*e&&b++<e--;);return b>e;}

F # (muito parecido com o exemplo C #)

let p s=let i=0;let l=s.Length;while(++i<l)if(s[i]!=[l-i-1]) 0; 1;;

PHP:

function p($s){return $s==strrev($s);} // 38 chars

ou, simplesmente

$s==strrev($s); // 15 chars

não está usando a função inversa em sua espécie linguagem de enganar um pouco? Quer dizer, olhando para a solução dar Ruby como

def p(a)a==a.reverse end

Você poderia facilmente reescrever isso como

def p(a)a==a.r end

e apenas dizer que você fez um método de extensão em seu código para que "r" chamado reverso. Eu gostaria de ver as pessoas soluções pós que não contêm chamadas para outras funções. Naturalmente, a função comprimento da corda deve ser permitida.

Rubi sem reverso - 41 caracteres

def m(a)a==a.split('').inject{|r,l|l+r}end

VB.Net - 173 Caracteres

Function P(ByVal S As String) As Boolean
    For i As Integer = 0 To S.Length - 1
        If S(i) <> S(S.Length - i - 1) Then
            Return False
        End If
    Next
    Return True
End Function

Golfscript, 5 de char

.-1%=

$ echo -n abacaba | ruby golfscript.rb palindrome.gs
1

$ echo -n deadbeef | ruby golfscript.rb palindrome.gs
0

Lisp comum, curto e enganando versão (23 caracteres):

#L(equal !1(reverse !1))

#L é um personagem macro leitor implementado por SHARPL-READER no pacote iterate. É basicamente equivalente a (lambda (! 1) ...).

Lisp comum, versão longa usando apenas primitivas (137 incluindo espaços em branco, compressível até 108):

(defun p (s)
  (let ((l (1- (length s))))
    (iter (for i from l downto (/ l 2))
          (always (equal (elt s i) (elt s (- l i)))))))

Mais uma vez, ele usa iterate, que é basicamente uma versão mais limpo da instalação embutida LOOP, por isso tendem a tratá-la como sendo a linguagem principal.

Não é o mais curto, e muito after-a-verdade, mas eu não podia deixar de dar-lhe uma tentativa em MATLAB:

R=@(s)all(s==fliplr(s));

24 caracteres.

C # Sem função inversa 84 caracteres

int p(char[]s){int i=0,l=s.Length,t=1;while(++i<l)if(s[i]!=s[l-i-1])t&=0;return t;} 

C # Sem função inversa 86 caracteres

int p(char[]s){int i=0;int l=s.Length;while(++i<l)if(s[i]!=s[l-i-1])return 0;return 1;}

VBScript 41 caracteres

function p:p=s=strreverse(s):end function

18 caracteres perl regex

/^(.?|(.)(?1)\2)$/

52 caracteres em C, com a ressalva de que até metade a corda será substituído:

p(char*s){return!*s||!(s[strlen(s)-1]-=*s)&&p(++s);}

Sem chamadas de biblioteca é 64 caracteres:

p(char*s){char*e=s;while(*e)++e;return!*s||!(*--e-=*s)&&p(++s);}

Inspirado pelo post anterior, 69 caracteres

p(char*a){char*b=a,q=0;while(*++b);while(*a)q|=*a++!=*--b;return!q;}

EDIT: Abaixo um caractere:

p(char*a){char*b=a,q=0;while(*++b);while(*a)q|=*a++%*--b;return!q;}

EDIT2: 65 caracteres:

p(char*a){char*b=a;while(*b)b++;while(*a&&*a++==*--b);return!*a;}

Haskell, 28 caracteres, precisa Control.Arrow importado.

p=uncurry(==).(id&&&reverse)

implementação direta em C usando funções da biblioteca padrão, inspirado pelo strlen na outra resposta C.

Número de personagens: 57

p(char*s){char*r=strdup(s);strrev(r);return strcmp(r,s);}

Confissão: eu estou sendo o cara mau, não liberando r aqui. Minha tentativa atual de ser bom:

p(char*s){char*r=strdup(s);s[0]=strcmp(strrev(r),s);free(r);return s[0];}

traz para 73 caracteres; Estou pensando em alguma maneira de fazê-lo mais curto.

Clojure usando 37 caracteres:

user=> (defn p[s](=(seq s)(reverse(seq s))))
#'user/p
user=> (p "radar")
true
user=> (p "moose")
false

24 caracteres em Perl.

sub p{$_[0]eq+reverse@_}

Groovy 17B:

p={it==it[-1..0]}

desvantagem é que ele não funciona com corda emptry.

Em segundo pensamento, jogando exceção para string vazia é razoável, já que você não pode dizer se nada é palíndromo ou não.

Sem usar quaisquer funções de biblioteca (porque você realmente deve adicionar no custo #include também), aqui está uma versão C ++ em 96:

int p(char*a,char*b=0,char*c=0){return c?b<a||p(a+1,--b,c)&&*a==*b:b&&*b?p(a,b+1):p(a,b?b:a,b);}

Minha tentativa em C (70 caracteres):

P(char*s){char*e=s+strlen(s)-1;while(s<e&&*s==*e)s++,e--;return s>=e;}

[Edit] Agora realmente trabalhando
[Editar 2] Redução de 74-70 usando retorno int padrão

Em resposta a alguns dos comentários:. Eu não tenho certeza se isso conta abuso de pré-processador - você poderia apenas definir a coisa toda na linha de comando e fazer a função de um personagem

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top