回文高尔夫

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个回答

5
(equal p (reverse p))

Lisp. 18个字符。

好的,这是一个特殊情况。如果直接在Lisp解释器中输入并且“p”已经定义,则可以使用此方法。

否则,需要执行以下操作:

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

28个字符。


ADEpt,你的defun在哪里? - mhawke
缺少参数会导致它无法工作(至少在SBCL中),这让我们只能用"(defun g (p)(equal p (reverse p)))"(35个字符(您的28实际上是34))。通过删除不必要的空格,可以将其缩减为32: "(defun g(p)(equal p(reverse p)))"。所有都需要p是一个字符串。 - John
不,它们不是。reverse适用于任何序列,equal适用于字符串、位向量和conses(列表)等其他类型,但与回文无关。 - Svante
1
由于Common Lisp是lisp-2,您可以像这样编写它:(defun p(p)(equal p(reverse p))) :o) - Svante

5
Lua更注重可读性而非简洁性,但仍然可以做到诚实的37个字符:
function p(s)return s==s:reverse()end

变量,只是为了好玩(相同大小):

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

JavaScript版本比较冗长(55个字符),因为它没有字符串反转函数:

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

我喜欢JS版本..没想到那样做。 - neonski
1
说实话,我在 JS 常见问题解答中找到了这个,我认为这是一个常见的习语,所以我没有提到它。 - PhiLho

5
我会更进一步:完整的C代码,编译并运行。90个字符。
main(int n,char**v){char*b,*e;b=e=v[1];while(*++e);for(e--;*b==*e&&b++<e--;);return b>e;}

4

PHP:

function p($s){return $s==strrev($s);} // 38 chars

或者,只需
$s==strrev($s); // 15 chars

4

在你的语言中使用reverse函数是不是有点作弊呢?我的意思是,看看Ruby解决方案给出的

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

你可以轻松地将其重写为

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

假设您在代码中创建了一个扩展方法,使得“r”调用反转。我希望看到人们发布的解决方案不包含对其他函数的调用。当然,字符串长度函数应该是允许的。

不使用反转的 Ruby - 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

你可以在if语句的末尾加上return false,然后删除endif来使代码更简洁。 - osp70
3
不,那不是作弊,只要反转是标准分发的一部分(但它有利于具有丰富库的语言)。请注意,Lua无法在没有库的情况下访问字符串中的单个字符!扩展参数不能成立,因为代码应该可以开箱即用。 - PhiLho
有些编程语言几乎整个标准通常都是以函数的形式实现的。 - Svante

4

F#(非常类似于C#的例子)

let p s=let i=0;let l=s.Length;while(++i<l)if(s[i]!=[l-i-1]) 0; 1;;

4

Golfscript, 5 char

.-1%=

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

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

3

虽然不是最短的方法,而且有些迟来了,但我还是在MATLAB中尝试了一下:

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

24个字符。


3

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

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;} 84个字符 - Dykam

3
常用的Lisp,简化版(23个字符):
#L(equal !1(reverse !1))

#L是SHARPL-READER在迭代包中实现的读取宏字符。它基本等同于(lambda (!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)))))))

它再次使用了iterate,这实际上是一个更干净的内置LOOP工具,因此我倾向于将其视为核心语言。


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