سياق متناظر الجولف
-
04-07-2019 - |
سؤال
الهدف:أي لغة.أصغر وظيفة الذي سيعود إذا كانت سلسلة هو سياق متناظر.هنا هو لي في بيثون:
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.
للأسف أنا غير قادر على الحصول على تحت ألف كلمة...
(ابفيف.نعم, أنها سوف تسمح فقط عن أي المتشرد وظيفة هنا ;)
هاسكل ، 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 باستخدام الافتراضي الباحث العودة
ردا على بعض التعليقات:أنا لست متأكدا إذا كان هذا المعالج الاعتداء التهم - يمكنك فقط تحديد كل شيء في سطر الأوامر وجعل وظيفة حرف واحد.