Frage

Das Ziel: Jede Sprache. Die kleinste Funktion, die zurückkehren wird, ob ein String ein Palindrom ist. Hier ist mein in Python :

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

50 Zeichen.

Die akzeptierte Antwort wird die aktuelle kleinste sein - dies wird sich ändern, wie kleinere gefunden werden. Bitte geben Sie die Sprache der Code ist in.

War es hilfreich?

Lösung

7 Zeichen in J: Nicht sicher, ob dies der beste Weg ist, ich bin etwas Neues zu J:)

p=:-:|.

Erklärung: |. kehrt die Eingabe. -: vergleicht. die Operanden implizit.

p 'radar'
1

p 'moose'
0

Andere Tipps

Hier ist mein; ist in einer domänenspezifischen Sprache geschrieben ich erfunden, genannt ‚Palindrom‘.

p

Edit: Weniger flippant Version (i386 asm, AT & T-Syntax)

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, string Zeiger in ESI geht, das Ergebnis ist in EAX.

Leider, ich bin nicht in der Lage, unter tausend Worten zu bekommen ...

alt text

(. LabVIEW Ja, werden sie fast jede Hobo Post lassen hier;)

Haskell, 15 Zeichen:

p=ap(==)reverse

Mehr lesbare Version, 16 Zeichen:

p x=x==reverse x

Eine andere Python-Version, die eher kürzer (21 Zeichen) ist:

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

Auf die Gefahr der Stimmen immer nach unten, die meisten alle diese nennen nur einen Befehl Reverse von einer Art, die alle echte Programmierlogik verbirgt.

Ich frage mich, was der kürzeste manuelle Weg, dies in jedem dieser Sprache zu tun ist.

Mit C # und LINQ-Operatoren:

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

Wenn Sie umge als Betrug betrachten, können Sie die ganze Sache mit einer Reduktion tun:

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

Perl (27 Zeichen):

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

Rubin (24 Zeichen):

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

73 sauber, gut lesbare Zeichen in Java geschrieben

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

Frieden :)

Pointless Haskell-Version (15 Zeichen, ist aber nicht wirklich funktionieren, wenn Sie Control.Arrow und Control.Monad und ignorieren die Monomorphie Einschränkung enthalten):

p=ap(==)reverse

Lua zielt darauf ab, mehr auf der Lesbarkeit als Prägnanz, noch tut ein ehrlichen 37 Zeichen:

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

Variante, nur zum Spaß (gleiche Größe):

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

Die JavaScript-Version ist ausführlicher (55 Zeichen), weil es nicht eine Zeichenfolge Reverse-Funktion nicht hat:

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

Lispeln. 18 Zeichen.

ok, das ist ein Sonderfall. Dies würde, wenn sie direkt in ein Lisp-Interpreter eingegeben arbeiten und p wurde bereits definiert.

sonst wäre dies notwendig:

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

28 Zeichen.

Ich werde es ein wenig dauern weiter: Voll C-Code, kompilieren und gehen

.

90 Zeichen

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

F # (viel wie das C # Beispiel)

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

oder nur

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

Ist die Verwendung nicht die umgekehrte Funktion in Ihrer Sprache Art ein bisschen betrügt? Ich meine, bei der Lösung Ruby-Suche geben als

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

Sie könnten leicht, dass umschreiben als

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

und nur sagen, dass Sie eine Erweiterungsmethode in Ihrem Code vorgenommen, so dass „r“ reverse genannt. Ich möchte Leute Post Lösungen sehen, die keine Anrufe an andere Funktionen enthalten. Natürlich sollte die String-Länge-Funktion zulässig.

Rubin ohne reverse - 41 Zeichen

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

VB.Net - 173 Chars

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 char

.-1%=

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

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

Common Lisp, Kurz- und Betrug Version (23 Zeichen):

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

# L ist ein Leser Makro Zeichen von SHARPL-READER im Iterierte Paket implementiert. Es ist im Grunde gleichwertig (Lambda (! 1) ...).

Common Lisp, lange Version mit nur Primitiven (137 einschließlich Leerzeichen, komprimierbar bis 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)))))))

Auch hier nutzt es Iterierte, die im Grunde eine sauberere Version der eingebauten LOOP-Anlage ist, so neige ich dazu, sie zu behandeln wie in der Kernsprache zu sein.

Nicht die kürzeste und sehr After-the-fact, aber ich konnte nicht helfen, es zu versuchen in MATLAB geben:

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

24 Zeichen.

C # Ohne Reverse-Funktion 84 Zeichen

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 # Ohne Reverse-Funktion 86 Zeichen

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 Zeichen

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

18 Zeichen perl regex

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

52 Zeichen in C, mit dem Vorbehalt, dass die Saite bis zur Hälfte überschrieben werden:

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

Ohne Bibliothek Anrufe es 64 Zeichen:

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

Inspiriert von früheren Post, 69 Zeichen

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

EDIT: Unten ein Zeichen:

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

EDIT2: 65 Zeichen:

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

Haskell, 28 Zeichen, muss Control.Arrow importiert werden.

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

Einfache Implementierung in C-Standardbibliothek Funktionen, durch die Strlen in der anderen C Antwort inspiriert.

Anzahl der Zeichen: 57

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

Geständnis: Ich bin sein die Schlechteren nicht r hier zu befreien. Mein aktueller Versuch, gut zu sein:

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

bringt es auf 73 Zeichen; Ich bin irgendwelcher Art und Weise denke, es kürzer zu machen.

Clojure mit 37 Zeichen:

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

24 Zeichen in Perl.

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

Groovy 17B:

  

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

Nachteil ist, dass es nicht mit emptry String funktioniert.

Am zweiten Gedanken, Ausnahme für leere Zeichenfolge zu werfen ist sinnvoll, da man nicht sagen kann, wenn nichts Palindrom ist oder nicht.

Ohne irgendwelche Bibliotheksfunktionen verwendet (weil Sie wirklich in den #include Kosten als auch hinzufügen sollen), ist hier ein C ++ Version in 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);}

Mein Versuch in C (70 Zeichen):

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

[Bearbeiten] Jetzt arbeitet tatsächlich
[Edit 2] reduzierte 74-70 standardmäßig int Rückkehr mit

Als Antwort auf einige der Kommentare. Ich bin nicht sicher, ob der Präprozessor Missbrauch zählt - Sie könnten nur die ganze Sache auf der Kommandozeile definieren und die Funktion ein Zeichen machen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top