سؤال

الهدف:أي لغة.أصغر وظيفة الذي سيعود إذا كانت سلسلة هو سياق متناظر.هنا هو لي في بيثون:

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

50 حرفا.

الجواب المقبول سيتم الحالي أصغر واحد - وهذا سوف تتغير أصغر وجدت.يرجى تحديد اللغة التعليمات البرمجية الخاصة بك في.

هل كانت مفيدة؟

المحلول

7 شخصيات في ي:لست متأكدا إذا كان هذا هو أفضل وسيلة ، أنا جديدة إلى حد ما إلى ي :)

p=:-:|.

التفسير:|.عكس الإدخال.-:يقارن.المعاملات ضمنية.

p 'radar'
1

p 'moose'
0

نصائح أخرى

وهنا الألغام ؛ إنه مكتوب في المجال-لغة معينة اخترعت يسمى 'لفظة'.

p

تحرير: أقل وقح الإصدار (i386 asm, 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 بايت ، سلسلة يذهب المؤشر في ESI, النتيجة في EAX.

للأسف أنا غير قادر على الحصول على تحت ألف كلمة...

alt text

(ابفيف.نعم, أنها سوف تسمح فقط عن أي المتشرد وظيفة هنا ;)

هاسكل ، 15 حرف:

p=ap(==)reverse

أكثر قابلية للقراءة الإصدار ، 16 حرف:

p x=x==reverse x

الثعبان آخر إصدار بدلا أقصر (21 حرف):

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

في خطر من الحصول على أسفل الأصوات أكثر من جميع هذه مجرد دعوة القيادة عكس من نوع أن يخفي كل منطق البرمجة الحقيقي.

وأتساءل ما أقصر دليل طريقة للقيام بذلك في كل من هذه اللغات.

مع C# و LINQ المشغلين:

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

إذا كنت ترى عكس هذا الغش يمكنك أن تفعل الشيء كله مع تخفيض:

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

بيرل (27 حرف):

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

روبي (24 حرف):

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

73 نظيفة للقراءة حرف مكتوب في جافا

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

السلام :)

لا طائل هاسكل الإصدار (15 حرف ، على الرغم من لا يعمل إلا إذا كنت تشمل السيطرة.السهم والتحكم.الكائن الدقيق الاحادي الخلية و تجاهل monomorphism تقييد):

p=ap(==)reverse

لوا أهداف أكثر في القراءة من الايجاز ، ولكن هل صادق 37 حرف:

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

البديل, للمتعة فقط (نفس الحجم):

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

جافا سكريبت الإصدار هو أكثر مطول (55 بوصة) ، لأنه لا يحتوي على سلسلة عكس وظيفة:

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

lisp.18 حرفا.

حسنا, هذا هو حالة خاصة.هذا من شأنه أن يعمل إذا كتبته مباشرة في اللثغة مترجم و ف سلفا.

وإلا فإن هذا من شأنه أن يكون ضروريا:

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

28 حرفا.

سآخذ قليلا كذلك:الكامل ج كود وتجميع الذهاب.

90 الشخصيات

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

F# (الكثير مثل 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

أو فقط

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

لا تستخدم الدالة العكسية في اللغة نوع من الغش قليلا ؟ أعني النظر في روبي حل تعطي

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

يمكنك بسهولة كتابة هذا النحو

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

و أقول لك أن جعلت طريقة التمديد في التعليمات البرمجية الخاصة بك حتى أن "r" ودعا العكسي.أود أن أرى الناس بعد الحلول التي لا تحتوي على المكالمات إلى وظائف أخرى.طبعا طول سلسلة وظيفة ينبغي السماح به.

روبي دون عكس 41 الشخصيات

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

VB.Net - 173 حرف

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 شار

.-1%=

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

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

Common Lisp, قصيرة و الغش الإصدار (23 حرف):

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

#L هو قارئ الكلي حرف تنفذها SHARPL القارئ في تكرار الحزمة.انها في الاساس ما يعادل (لامدا (!1) ...).

Common Lisp, نسخة طويلة فقط باستخدام الأوليات (137 بما بيضاء الأول وصولا الى 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)))))))

مرة أخرى, ويستخدم تكرار, الذي هو في الأساس نسخة أنظف من builtin حلقة مرفق لذا أنا أميل إلى التعامل معها باعتبارها جوهر اللغة.

لا أقصر جدا بعد حقيقة ، ولكن لم أستطع تجربته في MATLAB:

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

24 حرف.

C# دون عكس وظيفة 84 حرف

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# دون عكس وظيفة 86 حرف

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 حرف

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

18 حرف بيرل regex

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

52 الشخصيات في ج ، مع التنبيه إلى أن ما يصل إلى نصف السلسلة سوف تكون الكتابة:

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

دون مكتبة المكالمات من 64 حرفا:

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

مستوحاة من الوظيفة السابقة, 69 الشخصيات

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

تحرير:أسفل أحد شار:

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

EDIT2:65 حرف:

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

هاسكل, 28 حرف ، يحتاج إلى مراقبة.السهم المستوردة.

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

مباشرة التنفيذ في C باستخدام معيار وظائف المكتبة ، مستوحاة من strlen في الآخر C الإجابة.

عدد الأحرف:57

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

اعتراف:أنا الرجل السيء بعدم تحرير r هنا.بلدي الحالي محاولة جيدة:

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

يجلب 73 حرفا ؛ أنا أفكر في أي الطرق للقيام بذلك أقصر.

Clojure باستخدام 37 الشخصيات:

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

24 حرفا في بيرل.

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

رائع 17B:

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

الجانب السلبي هو أنه لا يعمل مع emptry السلسلة.

على الفكرة الثانية ، رمي استثناء سلسلة فارغة معقول منذ كنت لا أستطيع أن أقول إذا كان أي شيء هو سياق متناظر أو لا.

دون استخدام أي مهام المكتبة (لأنه يجب أن تضيف في #include التكلفة وكذلك), وهنا C++ الإصدار في 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);}

محاولتي في ج (70 حرف):

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

[تحرير] الآن تعمل في الواقع
[عدل 2] انخفض من 74 إلى 70 باستخدام الافتراضي الباحث العودة

ردا على بعض التعليقات:أنا لست متأكدا إذا كان هذا المعالج الاعتداء التهم - يمكنك فقط تحديد كل شيء في سطر الأوامر وجعل وظيفة حرف واحد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top