回文高尔夫

29
目标:任何语言。返回一个字符串是否为回文的最小函数。这是我用Python写的代码:
R=lambda s:all(a==b for a,b in zip(s,reversed(s)))

50个字符。

被接受的答案将是当前最小的 - 随着发现更小的答案,这将会改变。请指定您的代码所使用的编程语言。


第一个发布PDA的人将获得额外积分。 - Kyle Cronin
请将其设为社区维基可编辑。 - aku
这不是完全的重复!另一个问题并没有要求最小实现。密切相关?是的。重复 - 不是!!! - Jonathan Leffler
我们是否关心回文中标点和空格的变化通常是允许的?这里的一些解决方案似乎忽略了这一点。 - bmb
http://codegolf.stackexchange.com/ - Marek Grzenkowicz
显示剩余3条评论
50个回答

1
Haskell,包括自己的反转函数在内共有36个字符。(实际上,如果您使用分号将其变成一行,并忽略末尾的换行符,则为35个字符...)
r[]y=y
r(a:x)y=r x$a:y
p s=s==r s[]

与其他实现一样,“p”是回文谓词。


1

我的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

针对一些评论:我不确定那种预处理器滥用是否算作 - 你可以在命令行上定义整个函数,并将函数变成一个字符。


你可以将它简化为...好吧,我数了72个字符,包括一个换行符。 int P(chars){chare=s+strlen(s)-1;while(s<e&&*s++==*e--);return s>=e;} 在字符串“xyx”,“xyzx”,“xyyx”和“yxx”上进行了测试。 - Jonathan Leffler
当然,你可以将其简化为:i P(cs){ce=s+l(s)-1;w(s<e&&*s++==*e--);r s>=e;}编译器命令行(gcc)如下:gcc -Di=int -Dc=char -Dl=strlen -Dw=while -Dr=return palindrome.c - Jonathan Leffler
@Jonathan:对于字符串“ab”和“abb”会失败。 - Adam Rosenfield
@Adam:好的,这就是我列出测试用例的原因(它们确实起作用),以防我错过了那些不起作用的。谢谢!(对不起!) - Jonathan Leffler
已保存三个字符:P(char*s){char*e=s;while(*++e);while(s<=--e&&*s++==*e);return s>e;},但不能使用空字符串调用 P()。而且不需要 <string.h> :) - pmg

1

Perl(21个字符):

sub{"@_"eq reverse@_}

嘿,问题没有指定一个命名的子程序!


0

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

0

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()”这种类型的答案并不是很印象深刻。


0

不妨给出一个使用标准库的C++示例:

bool p(const std::string &s){std::string s2(s);std::reverse(s2);return s==s2;}

感谢Jon指出如果我们避免一些不必要的复制,这段代码可以更短。总共67个字符。
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 Purdy

0

CFScript,39个字符:

function y(x){return(x is reverse(x));}

我从来不擅长高尔夫。


0

Java:

boolean y(StringBuffer x){return x.equals(x.reverse());}

上述方法不起作用,糟糕!

boolean y(StringBuffer x){return x.toString().equals(x.reverse().toString()); }

呃。


你总是可以使用""+x代替x.toString(),但这并没有太大的改善。 - Tyler

0

Shell脚本(sed + tac + tr):

test "`echo $1|sed -e 's/\(.\)/\1\n/g'|tac|tr -d '\n'`" == "$1"

0

C语言,无库,70个字符:

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

作为对另一个 C 解决方案的评论之一提到的,C 中的原型是完全可选的,在类型应该出现的任何位置上都假定为 int,但没有提及。难道没有人编写过 ANSI 之前的 C 吗?
编辑:更短并处理空字符串。

这个不太对 - 你需要再将 b 减一次才能移动到终止的 NUL 前面,这会增加额外的4个字符。 - Adam Rosenfield
啊,我打错了——我应该从我正在测试的C文件中复制并粘贴。如果我用*++b替换*b ++,它就行了(只要字符串非空)。 - ephemient
有人使用了ANSI C之前的版本,但他肯定不认为那是一个“特性”! - gbarry
该函数对于仅在中间有不同字符的偶数长度的非回文字符串失败。例如:"ab","abca","abcdezdcba" - 它会误报这些字符串为回文。 - Deadcode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接