Palindrome Golf
-
04-07-2019 - |
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.
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 ...
(. 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