code-golf rosetta-stone palindrome

code golf - Palindrome Golf



code-golf rosetta-stone (30)

7 caracteres en J: no estoy seguro si esta es la mejor manera, soy algo nuevo en J :)

p=:-:|.

explicación: |. invierte la entrada. -: compara los operandos son implícitos.

p ''radar'' 1 p ''moose'' 0

El objetivo: cualquier idioma. La función más pequeña que devolverá si una cadena es un palíndromo. Aquí está el mío en Python :

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

50 caracteres

La respuesta aceptada será la más pequeña actual: esto cambiará a medida que se encuentren las más pequeñas. Por favor, especifique el idioma en el que se encuentra su código.


Haskell, 28 caracteres, necesita Control.Flecha importada.

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


Implementación directa en C usando funciones de biblioteca estándar, inspirada por el strlen en la otra respuesta en C.

Número de caracteres: 57

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

Confesión: estoy siendo el malo al no liberarlo aquí. Mi intento actual de ser bueno:

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

lo trae a 73 caracteres; Estoy pensando en alguna forma de hacerlo más corto.


Lua apunta más a la legibilidad que a la concisión, pero hace un honesto 37 caracteres:

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

variante, solo por diversión (mismo tamaño):

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

La versión de JavaScript es más prolija (55 caracteres), porque no tiene una función inversa de cadena:

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


Otra versión de Python que es bastante más corta (21 caracteres):

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


(equal p (reverse p))

ceceo. 18 caracteres.

ok, este es un caso especial. Esto funcionaría si se escribe directamente en un intérprete de lisp yp ya estaba definido.

de lo contrario, esto sería necesario:

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

28 caracteres.


73 caracteres limpios y legibles escritos en java

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

paz :)


A riesgo de obtener votos, la mayoría de ellos simplemente llaman un comando inverso de algún tipo que oculta toda la lógica de programación real.

Me pregunto cuál es la forma manual más corta de hacer esto en cada uno de estos idiomas.


Aquí está el mío; está escrito en un lenguaje específico de dominio que inventé, llamado ''palindrome''.

p

Edición: versión menos flexible (i386 asm, sintaxis AT & T)

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, el puntero de cadena entra en ESI, el resultado está en EAX.


F # (muy parecido al ejemplo de C #)

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


La versión absurda de Haskell (15 caracteres, aunque realmente no funciona a menos que incluyas Control.Arrow and Control.Monad e ignoras la restricción de monomorfismo):

p=ap(==)reverse


Lo llevaré un poco más lejos: código c completo, compilar y listo.

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;}


PHP:

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

o solo

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


24 caracteres en Perl.

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


Clojure con 37 caracteres:

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


Groovy 17B:

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

Lo malo es que no funciona con cadenas vacías.

Pensándolo bien, es razonable lanzar una excepción para una cadena vacía, ya que no se puede saber si nada es palídrico o no.


Perl (27 caracteres):

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

Ruby (24 caracteres):

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


¿No está usando la función inversa en su tipo de lenguaje de hacer trampa un poco? Quiero decir, mirando la solución Ruby, da como

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

podrías reescribirlo fácilmente como

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

y solo di que hiciste un método de extensión en tu código para que "r" se llame inverso. Me gustaría que las personas publiquen soluciones que no contengan llamadas a otras funciones. Por supuesto, se debe permitir la función de longitud de cuerda.

Rubí sin 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


Mi intento en C (70 caracteres):

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

[Editar] Ahora en realidad trabajando
[Editar 2] Reducido de 74 a 70 utilizando el retorno int por defecto

En respuesta a algunos de los comentarios: no estoy seguro de si el abuso de preprocesador cuenta; podría definir todo en la línea de comando y hacer que la función tenga un carácter.


No es el más corto, y muy posterior al hecho, pero no pude evitar probarlo en MATLAB:

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

24 caracteres


Con operadores C # y LINQ:

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

Si considera Reverse como hacer trampa, puede hacer todo con una reducción:

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


C # sin función 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 # sin función 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)$/


Haskell, 15 caracteres:

p=ap(==)reverse

Versión más legible, 16 caracteres:

p x=x==reverse x


52 caracteres en C, con la advertencia de que hasta la mitad de la cuerda se sobrescribirá:

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

Sin llamadas a la biblioteca, son 64 caracteres:

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


Golfscript, 5 caracteres

.-1%= $ echo -n abacaba | ruby golfscript.rb palindrome.gs 1 $ echo -n deadbeef | ruby golfscript.rb palindrome.gs 0


Sin usar ninguna función de biblioteca (porque realmente debería agregar el costo del #include también), aquí hay una versión de C ++ en 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);}


Lamentablemente, no puedo entender menos de mil palabras ...

(LabVIEW. Sí, dejarán cualquier publicación hobo aquí;)


Inspirado en la publicación anterior, 69 caracteres

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

EDITAR: Abajo un char:

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;}


Common Lisp, versión corta y trampa (23 caracteres):

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

#L es un carácter de macro lector implementado por SHARPL-READER en el paquete de iteración. Es básicamente equivalente a (lambda (! 1) ...).

Common Lisp, versión larga que usa solo primitivas (137 incluyendo espacios en blanco, compresibles hasta 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)))))))

De nuevo, usa iterar, que es básicamente una versión más limpia de las funciones integradas de LOOP, por lo que tiendo a tratarlo como si estuviera en el lenguaje central.