palíndromo Golf
-
04-07-2019 - |
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.
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 ...
(. 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
.-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