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.