回文高尔夫

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

49

J中有7个字符:不确定这是否是最好的方法,我对J还比较陌生 :)

p=:-:|.

说明: | 表示反转输入,- 表示比较,操作数是隐式的。

p 'radar'
1

p 'moose'
0

4
哇,那真是神秘啊。就我个人而言,我还没有见过更神秘的语言了。 - Robert K
1
邪恶的跳蚤:哦,还有更加神秘的语言,比如unlambda、befunge或者INTERCAL。我的一个朋友甚至写了一个编译器来编译unlambda... - wnoise
1
@wnoise:编译成奇怪的语言并不太难。它们非常简单,所以你只需要正确设置并使用递归处理即可。 - Claudiu
1
令人印象深刻......但我讨厌用那种语言编写真正的程序! - Thomas Levesque
2
@Thomas 写 J 代码实际上非常有趣。阅读它(即使你自己写的)才是难点。 - cobbal
显示剩余2条评论

42
这是我的代码,它用我发明的一种特定领域语言“回文”编写而成。
p

编辑:更严谨的版本(i386汇编语言,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中。


2
为什么要加上p呢?你应该使用字符串作为参数运行解释器。 - Vinko Vrsalovic
10
你可能把回文(palindrome)和回文++(palindrome++)混淆了,后者是一种相关但不同的语言。 - Menkboy
你必须指定一些东西 - 你是使用英特尔的语法还是AT&T的语法?我猜是后者,否则第二行将用EDI上的任何内容擦除寄存器ESI中的先前内容:(而且我不明白为什么你需要先清除EAX。 - Joe Pineda
@Joe:是的,这是AT&T;我手头唯一的汇编器是GNU的as。我必须清除EAX以使rep scasb起作用,并为两种可能结果之一提供结果值。 - Menkboy
17个字节,不错!Haskell仍然领先1个字节,但你的优势在于...不需要Haskell解释器。 - Claudiu
显示剩余4条评论

37

很遗憾,我无法用不到一千个单词来表达......

alt text

(这是关于LabVIEW的内容。没错,他们会让任何流浪汉在这里发帖 ;)


3
哈哈哈,这是什么鬼?也许我不应该边喝酒边看SO论坛... +1 哈哈。 - Nope
LabView是一种数据流编程语言,用于编程硬件控制器等。您正在查看源代码(它全部都是图标和箭头)。 - 1800 INFORMATION
顺便提一句,它还被用在有史以来最极客和最酷的玩具之一:乐高积木中。乐高机器人 Mindstorms 是用 LabView 编程的。 - flolo
2
LabView只是另一种让非程序员更容易接触编程的尝试。它有其用途,也许作为教学工具,但我不会将其用于严肃的目的...(这不是编程LEGO的唯一方式)。 - Artelius
...<耸肩>http://www.ni.com/solutions。里面可能有一些严肃的内容。 - Joe Z
类似的数据流语言被用于编程嵌入式系统。 - swegi

29

Haskell,15 个字符:

p=ap(==)reverse

更易读的版本,16个字符:

p x=x==reverse x

就目前而言,这与Perl具有相同数量的字符,但执行“p x=x==reverse x”只需16个字符(去掉空格)。如果可以的话,请修改您的答案。 - Claudiu

28

另一个Python版本,这个版本相对更短(21个字符):

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

哇,虽然我不会Python,但这真的很厉害。 - harpo

18

冒着被踩的风险,它们中大多数只调用了某种名为reverse的命令,隐藏了所有真正的编程逻辑。

我想知道在每种语言中最短的手动实现方法是什么。


原来这是平台核心库的一部分。可能需要进行算法高尔夫。不过还需要进一步思考。 - OscarRyz
那么对于内置反向迭代的语言呢?从技术上讲,Python的string[::-1]并不是“内置反转”...它更加通用。 - Jimmy
请看我对Kibbee的回答。在Lua中,如果没有使用字符串库,你无法访问字符串的单个字符!现在,如果有两个版本(对于能够执行两种语言的语言),最短和最短的算法版本可能会很有趣。 - PhiLho

12

使用 C# 和 LINQ 运算符:

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

如果你认为 Reverse 是作弊的,你可以通过缩减整个流程来完成:

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

+1,非常创造性地使用了Aggregate... 但我不认为使用Reverse算作作弊,因为它是一个标准的Linq操作符,几乎每个其他答案都使用了它。 - Thomas Levesque
你可以把第一个写得更简短一些,如s.Reverse().ToString() == s;,而第二个则是!s.Where((c,i)=>c!=s[s.Length-i-1]).Any() - Gabe

10

Perl(27个字符):

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

Ruby(24个字符):

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

你在reverse(反转)上浪费了两个字符的括号...干得好;我用Perl的初始尝试是39个字符。 - Jonathan Leffler
这个 Perl 变种已经走得太远了。反例:sub p{$_ eq reverse}while (<>) { chomp; $x = $; $ = "aaaaaaaab"; print "$x 是回文\n" if p($x); } - Jonathan Leffler
@Jonathan,感谢您的纠正,20个字符版本是错误的。 - Robert Gamble
@_[0] 在这里可以工作,但这清楚地表明了某人不理解 Perl 的符号;此外,我只用了一个 24 字符的 Perl 解决方案来回答。 - ephemient
@ephemient,感谢您指出这一点,我很惊讶之前没有人注意到它。 - Robert Gamble
在 Ruby 1.9 中,你可以将其作为 proc ->(e){e.reverse==e},但我不知道它是否被视为“函数”(我猜它是)。 - Chubas

9

使用Java编写的73个整洁易读的字符

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

祝平安 :)


既然代码如此易读,为什么还要加上“+”呢?如果你想要可读性强的代码,我建议使用Haskell解决方案。 - 1800 INFORMATION
提醒:给“没用”的回答投反对票(请仔细阅读工具提示!);这个回答既正确又有帮助。请负责任地投反对票。+1 以取消没有思考的路过投反对票的行为。 - Steven A. Lowe
不,它不是,这是一个comwiki的答案。 :P - eyelidlessness
我的负评既不是没有想过就乱点,也不是马虎地评价。我留下了评论来解释它。 - 1800 INFORMATION

6

无意义的Haskell版本(15个字符,但如果包括Control.Arrow和Control.Monad并忽略单态限制,则不会真正起作用):

p=ap(==)reverse

这里的'ap'来自哪里? - Claudiu
它在Control.Monad中,虽然需要Control.Arrow来为(Monad ((->) a))提供实例。ap也可以写成/理解为“ap f g h = f h (g h)”,并在这种情况下像S组合子(SKI演算法)一样运作。将其视为在另一个环境中应用函数。 - Steven Dee

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