目标:任何语言。返回一个字符串是否为回文的最小函数。这是我用Python写的代码:
R=lambda s:all(a==b for a,b in zip(s,reversed(s)))
50个字符。
被接受的答案将是当前最小的 - 随着发现更小的答案,这将会改变。请指定您的代码所使用的编程语言。
R=lambda s:all(a==b for a,b in zip(s,reversed(s)))
50个字符。
被接受的答案将是当前最小的 - 随着发现更小的答案,这将会改变。请指定您的代码所使用的编程语言。
r[]y=y
r(a:x)y=r x$a:y
p s=s==r s[]
与其他实现一样,“p”是回文谓词。
我的C语言尝试(70个字符):
P(char*s){char*e=s+strlen(s)-1;while(s<e&&*s==*e)s++,e--;return s>=e;}
[编辑] 现在已经正常工作
[编辑2] 通过使用默认的int返回值,将其从74减少到70
针对一些评论:我不确定那种预处理器滥用是否算作 - 你可以在命令行上定义整个函数,并将函数变成一个字符。
P(char*s){char*e=s;while(*++e);while(s<=--e&&*s++==*e);return s>e;}
,但不能使用空字符串调用 P()
。而且不需要 <string.h>
:) - pmgPerl(21个字符):
sub{"@_"eq reverse@_}
嘿,问题没有指定一个命名的子程序!
JavaScript,64字节。
function a(x){for(r='',i=x.length;i>0;i--)r+=x[i-1];return x==r}
测试案例:
a('lolol'); // true
a('haha'); // false
JavaScript递归版本(无反转垃圾)
function p(s){l=s.length;return l<2||(s[0]==s[l-1]&&p(s.substr(1,l-2)))}
或在内部实现反向:
p=function(s,y){return y?(s==p(s)):s[1]?(p(s.substr(1))+s[0]):s[0]}
p("hannah",1);
或者,完全不使用内置函数...
p=function(s,y,i){
return i?s[i]?s[i]+p(s,0,i+1):'':y?(s==p(s)):s[1]?(p(p(s,0,1))+s[0]):s[0]
}
p("hannah",1);
我能想到的最短的代码:(迭代)
function p(s,l){for(c in s){if(s[c]!=s[l-1-c])s=0}return s}
p("hannah",6);// (is this cheating?)
期待看到你在JavaScript中做得更好!
最好不要使用任何内置函数,特别是reverse。
对于“return s==s.reverse()”这种类型的答案并不是很印象深刻。
不妨给出一个使用标准库的C++示例:
bool p(const std::string &s){std::string s2(s);std::reverse(s2);return s==s2;}
bool p(std::string s){std::string x=s;std::reverse(x);return s==x;}
int p(std::string s){std::string t(s);std::reverse(t);return s==t;}
(67) 和 int p(std::string s){return std::equal(s.begin(),s.end(),s.rbegin());}
(70)?C++0x 允许你将前者中的 std::string t
简化为 auto t
,从而节省七个字符。 - Jon PurdyCFScript,39个字符:
function y(x){return(x is reverse(x));}
我从来不擅长高尔夫。
Java:
boolean y(StringBuffer x){return x.equals(x.reverse());}
上述方法不起作用,糟糕!
boolean y(StringBuffer x){return x.toString().equals(x.reverse().toString()); }
呃。
Shell脚本(sed + tac + tr):
test "`echo $1|sed -e 's/\(.\)/\1\n/g'|tac|tr -d '\n'`" == "$1"
C语言,无库,70个字符:
p(char*a){char*b=a-1;while(*++b);while(a<b&&*a++==*--b);return!(a<b);}
int
,但没有提及。难道没有人编写过 ANSI 之前的 C 吗?