确定字符串是否为回文的最短代码


42

一个回文是一些字符串既前后拼写相同。例如,“伊娃,我可以在山洞里刺蝙蝠吗?” 是回文(EVACANISTAB | BATSINACAVE)

对于此代码高尔夫球,使用您选择的语言,确定给定的字符串是否是回文。

边缘案例:

  • 标点不算为回文症。
  • 控制字符不计入回文。
  • 空格不计入回文错误。
  • 数字计入回文错误。
  • 此挑战中的案例不计入回文症。
  • 除您选择的语言所施加的限制外,要评估的字符串的长度没有限制。
  • 对于此挑战,请将自己限制为ASCII字符集。

技术要求:

  • 仅需要方法主体;方法签名,数据结构声明等其他内容不计入胜诉要求。
  • 代码必须在编译或解释时没有编译时错误或异常。
  • 代码不得抛出任何未处理的异常或崩溃。(几乎不用说。几乎。)
  • 代码必须返回一些指示回文的值。数据类型取决于您使用的语言(例如C#用户可能使用bool,而JavaScript用户可能使用var。)
  • 您可能不会编写自己的解释程序来以“本机”功能执行此任务,因此您可以“推销”接近获胜的分数。(希望不用多说。)

胜利条件:

  • 以字符中最短的代码为准。

现任领导人:tmartin(k,25个字符)

... 您的答案是否想要神奇的绿色复选标记?打败这个家伙的答案!


1
I / O是挑战的一部分,还是功能主体会做?
John Dvorak

1
通过修订历史记录,可以在整个站点范围内的所有答案中找到用于显示如何改进工作的“面包屑”。无需在当前版本的答案中查看完整的历史记录。
彼得·泰勒

1
@WernerCD我敢肯定,当他回来检查新的回复时,OP将更改谁获得绿色对勾。
Gareth 2013年

2
不指定语言确实对我来说是一个小挑战。如下所示,侧重于高阶文本操作功能的解释型语言总是得到最短的结果。是什么使我无法将自己的解释器与单个函数ip()放在一起。我的竞争算法现在是“ ip:i”。4个字符。完成。
Gusdor

3
@Gusdor看到J和GolfScript从Code GolfLanguage Handicap以及该网站的meta上的相关问题中吸取了所有乐趣
AakashM 2013年

Answers:


29

25岁

{x~|x:_x@&x in,/.Q`a`A`n}

k){x~|x:_x@&x in,/.Q`a`A`n}"Eva, can I stab bats in a cave?"
1b

看起来像Q和k的混合体:P
skeevey 2013年

好吧,我不会完全称呼.QA等q。它们只是字符串包装器,它们下面没有真正的k代码。现在,如果我说.q.inter,我会遇到麻烦的。
tmartin

我想这是一个对语义的争论,但是它们是在qk中定义的
skeevey 2013年

可以说31的Q:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

我知道这已经很老了,但是...您可以使用保存1个字节{#|:\_x@&x in,/.Q`a`A`n},其中1为true,2为false
抓取

24

Perl,26个字符

s/_|\W//g;uc eq reverse uc

如果$_是回文,则计算为1;如果不是,则计算""为Perl的假值之一。

用法示例:

sub palin {
    s/_|\W//g;uc eq reverse uc
}
while (<DATA>) {
    chomp;
    print "$_ => ",palin()?"yes":"no","\n";
}
__DATA__
Eva, can I stab bats in a cave?
A man, a plan, a canal. Panama!
Madam, I'm Adam Corolla.
757
Boeing 757
A man, a plan, a big shovel, a canal. Panama!
A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal >> __Panama__

输出:

Eva, can I stab bats in a cave? => yes
A man, a plan, a canal. Panama! => yes
Madam, I'm Adam Corolla. => no
757 => yes
Boeing 757 => no
A man, a plan, a big shovel, a canal. Panama! => no
A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal >> __Panama__ => yes

该死,你击败了我。尽管如果_字符串中包含a ,这将无法正常工作?而且它不需要任何输入,因此您不需要使用该-p选项吗?
Gareth 2013年

\W在正则表达式中不包括下划线。恐怕您需要[^a-z\d]使用正则表达式。恐怕我还是被打。
John Dvorak

3
_|\W代替保存一个[_\W]
霍华德

1
您可以缩短_|\W\Plideone.com/0ufdaQ。应该只是Unicode字母。
Kobi 2013年

其实,再想一想- \Pl不会匹配数字,所以我想这_|\W是您最好的选择。
Kobi 2013年

18

仅C#82 :)

var x=s.ToLower().Where(char.IsLetterOrDigit);return x.SequenceEqual(x.Reverse());

无法抗拒用我最喜欢的语言编写无样板程序的诱惑。

可在此处进行测试:http : //ideone.com/8bwz7z


简单...但是优雅!
安德鲁·格雷

@AndrewGray感谢您的评论和宽容的技术要求。C#样板会严重增加字符数,否则会使高尔夫不切实际。
Cristian Lupascu 2013年

2
没问题。我是C#开发人员,我喜欢编写简洁高效的代码。可惜的是,语言太多了……
Andrew Gray

13

GolfScript, 36 34 31 30个字符

{0"0:A[a{"@{>^}+/},{32|}%.-1%=

我以前的(Javascript)解决方案类似的算法。

0"0:A[a{"@{>^}+/-由Peter Taylor和Howard优化。我的版本是"/9@Z"{1$<},,2%\;。霍华德捐赠了函数级联,彼得·泰勒捐赠了XOR模2。基本上,这是比较值是否在一系列范围内的通用方法。

{.96>32*-}%(11个字符)并不是对Javascript .toUpperCase()(14个字符)的真正改进,特别是因为它破坏z了ASCII表中的一些奇怪的标点符号(此处无关紧要)。

正如彼得·泰勒(Peter Taylor)的建议,但是,如果我们首先过滤掉字母数字,那么只需在每个字符中设置一位就可以转换为小写和数字: {32|}

.-1%=完成所有回文的繁重任务。我不真正喜欢的一部分是我花了多长时间才发现如何反转数组。我应该已经阅读了文档。另外两个字符执行堆栈管理和比较。

测试:http//golfscript.apphb.com/?c = IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7IjA6QVtheyJcez59KywsMiV9LHszMnx9JS4tMSU9


此外,如果我可以假定不存在以下任何控制字符:(数据链接转义,设备控制1-4,否定应答,同步空闲,传输块结束,取消,介质结束)(我们都同意这些是都不太清晰),或者如果我可以将它们视为数字0-9的大写形式,我们可以保存另外两个字符:

GolfScript,28个字符

{32|}%{0"0:a{"@{>^}+/},.-1%=

测试:http//golfscript.apphb.com/?c = IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7IkB7Pl59Ky99LC4tMSU9


2
您可以摆脱清理并保存两个字符:{"0:A["\{>}+,,2%},
Howard

@霍华德谢谢。我想我误解+了。那是一个很酷的把戏。
John Dvorak

1
通过反转过滤器和大小写标准化,可以节省三个字符。您必须将其添加a{到过滤器的字符列表中,以包含小写字母,但是您可以使用just来大写{32|}%。最终结果是{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
彼得·泰勒

在过滤器上还有另一项节省。对模2进行计数是异或,因此0"0:A[a{"@{>^}+/工作也是如此。
彼得·泰勒

@PeterTaylor如果我自己不久之后不提出其他优化,我可能应该转换为社区Wiki。再次感谢:-)
John Dvorak

8

Javascript,53个字符:

(x=x.toLowerCase().match(/[a-z\d]/g))+""==x.reverse()

是一个JavaScript表达式,如果x是回文,则计算结果为true,否则为false。它假定x是一个字符串。如果不能保证,请添加x+="",

这是一个面包屑:由于reverse()工作原理,

(x=x.toLowerCase().match(/[a-z\d]/g))==""+x.reverse()

失败。然而,

""+(x=x.toLowerCase().match(/[a-z\d]/g))==x.reverse()

很好。


串联空字符串的好习惯!好的信息点!
安德鲁·格雷

3
提示:+""转换为字符串,+类型转换为数字,|0~~强制转换为整数,!!强制转换为布尔。
John Dvorak

用正则表达式可以缩短字符数吗/[^\W_]/g
SuperPrograman 2015年

7

R:66

w=grep("[a-z0-9]",strsplit(tolower(s),"")[[1]],v=T);all(w==rev(w))

用法:

f=function(s){w=grep("[a-z0-9]",strsplit(tolower(s),"")[[1]],v=T);all(w==rev(w))}

f("Eva, can I stab bats in a cave?")
[1] TRUE

7

重击:52 48 46个字符

s=${1,,};s=${s//[^a-z0-9]};[ $s = `rev<<<$s` ]

这将检查字符串作为第一个参数,并将回文码的退出代码设置为0,否则将退出代码设置为1。

样品运行:

bash-4.2$ p() { s=${1,,};s=${s//[^a-z0-9]};[ $s = `rev<<<$s` ]; }

bash-4.2$ p 'Eva, can I stab bats in a cave?'; echo $?
0

bash-4.2$ p 'A man, a plan, a canal. Panama!'; echo $?
0

bash-4.2$ p "Madam, I'm Adam Corolla."; echo $?
1

bash-4.2$ p '757'; echo $?
0

bash-4.2$ p 'Boeing 757'; echo $?
1

bash-4.2$ p 'A man, a plan, a shovel, a canal. Panama!'; echo $?
1

bash-4.2$ p 'A_man,_a_plan, a_caremer, a canal:_Panama!'; echo $?
0

7

Python 2:49(不计算方法签名)

def f(s):
 s=filter(str.isalnum,s.upper())
 return s==s[::-1]

带有输入和输出的完整程序可以用74个字符编写。

import sys
s=filter(str.isalnum,sys.stdin.read().upper())
print s==s[::-1]

用法示例:

$echo 'Eva,can I stab bats in a cave?' | python palindrome.py
True 
$ cat huge_palindrome.txt | python palindrome.py
True
$echo 'Able was I ere i SaW elBa' | python palindrome.py                                                                   
True                                         

huge_palindrome.txt包含 17,826字回文)

此解决方案可以适应python 3添加一些字符:

的Python 3:55

def f(s):
 s=list(filter(str.isalnum,s.upper()))
 return s==s[::-1]

sys.stdin.read基本上与raw_input
CalculatorFeline'Mar

在Python 3.8中,您可以将其缩短为58个字节
MilkyWay90

另外,您的Python 2和3解决方案分别为61字节和67字节。
MilkyWay90

@ MilkyWay90您可能没有计入方法签名而错过了。在2013年,习惯上不包含它。在其他语言的该问题的其他解决方案中,他们只是将其省略,并假定您将输入包含在s变量中。我决定提供完整的定义,但按照2013年的惯例,长度不包括方法签名
Bakuriu

@Bakuriu啊,我明白了。我来这里仅几个月,所以我不知道2013
MilkyWay90

7

JAVA(或迄今为止最冗长的语言), 102 96 95个字符

s=s.replaceAll("\\W|_","");return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString());

用法(带有未编码的代码):

static boolean q(String s) {
    s=s.replaceAll("\\W|_","");
    return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString());
}

public static void main(String[] args) {
    System.out.println(q("'A man, a plan, a canal - Panama!'"));
}

在以下评论者的帮助下缩短了


1
虽然我不了解Java(我是C#家伙,很有趣),但您不能通过在if上花括号将1个字符保存下来吗?EG: if(s==null) return 1==0;?还是Java对if语句强制执行curly ?
Andrew Gray

3
您说的很对,谢谢您!!! ...我还没注意到他们在那儿,我想我是不是C#的Java开发人员?
jsedano 2013年

4
1)检查该参数是否null是一个好习惯,但是在CodeGolf中不进行此操作。如我所知,在这个问题上没有其他人做过。跳过它。2)参数之间的空间有助于提高可读性,但不能提高高尔夫水平。去掉它; 3)代替显式地toLowerCase()使用字符串,equalsIgnoreCase()稍后再用equals()。这样,您必须调整正则表达式,但仍要短1个字符。pastebin.com/s7H84faj
manatwork

1
replaceAll("[^A-Za-z0-9]","")=>replaceAll("\\W","")
assylias

实际上:replaceAll("\\W|_","");也要删除_=> 95个字符
assylias 2013年

7

Mathematica 54 53

多亏了CatsAreFluffy,节省了一个字节:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

对于版本10.2或更早版本的用户:

#==Reverse@#&@StringCases[ToUpperCase@#,WordCharacter]&

PalindromeQ@StringCases[ToUpperCase@#, WordCharacter]&["Eva,can I stab bats in a cave?"]

真正


PalindromeQ#==Reverse@#&
CalculatorFeline

我想知道为什么我从未见过。版本10.3!
DavidC

PalindromeQ= #==Reverse@#&
CalculatorFeline

是的,我下载了10.4版进行试用。
DavidC

出来了吗 OHNO
CalculatorFeline

6

J,30个字符

*/(=|.)tolower(#~'[^_\W]'rxE])

用法:

   */(=|.)tolower(#~'[^_\W]'rxE])'A man, a plan, a canal - Panama!'
1
   */(=|.)tolower(#~'[^_\W]'rxE])'Doc, note: I dissent. A fast never prevents a fatness. I diet on cod'
1

6

k(50 48 45 38个字符)

禁止所有错误,返回默认值0b(false)。

{X~|X@:&(X:_:x)in 10h$(48+!10),97+!26}

例:

k){X~|X@:&(X:_:x)in 10h$(48+!10),97+!26} "Eva, can I stab bats in a cave?"
1b

编辑:通过避免中间变量,剃了另外三个字符。H / T,CS。-7:无需排除错误。


1
有趣的是,仅增加3个字符,我的代码就更具可读性:-)
John Dvorak

一个额外的字符滑入,我将其删除。
skeevey 2013年

5

Ruby:43个 38个字符

s=s.upcase.tr'^A-Z0-9','';s==s.reverse

样品运行:

irb(main):001:0> p=->s{s=s.upcase.tr'^A-Z0-9','';s==s.reverse}
=> #<Proc:0x854592c@(irb):1 (lambda)>

irb(main):002:0> p['Eva, can I stab bats in a cave?']
=> true

irb(main):003:0> p['A man, a plan, a canal. Panama!']
=> true

irb(main):004:0> p["Madam, I'm Adam Corolla."]
=> false

irb(main):005:0> p['757']
=> true

irb(main):006:0> p['Boeing 757']
=> false

irb(main):007:0> p['A man, a plan, a shovel, a canal. Panama!']
=> false

irb(main):009:0> p['A_man,_a_plan, a_caremer, a canal:_Panama!']
=> true

1
您甚至可以写s.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard

伙计,我结合使用这些!方法多久了!你让我的霍华德惊呆了。
manatwork 2013年

小问题,@霍华德。tr并且tr!在没有可音译的情况下表现似乎有所不同:pastebin.com/4YThW2qN这使p['757']测试因“ NoMethodError:未定义的方法'upcase!”而崩溃。for nil:NilClass”错误。
manatwork 2013年

哎呀,对不起。没想到那件事。
霍华德

1
可以进一步缩短:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu 2013年

5

C ++ 107 (错误), 100 (误报)81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • 利用ASCII位模式。
  • 依靠邪恶using namespace std;
  • 使用按位AND和OR代替逻辑运算符。
  • 用途,int因为它比char或短auto

    #include <string>
    using namespace std;
    
    bool IsPalindrome(const string & t) {
    string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
    }
    
    #include <cassert>
    
    int main() {
        assert(!IsPalindrome("gorilla"));  // simple failure
        assert( IsPalindrome("racecar"));  // simple success
        assert( IsPalindrome("Hannah"));   // case blind
        assert(!IsPalindrome("1999"));     // digit failure
        assert( IsPalindrome("2002"));     // digit success
        // Ignore spacing, punctuation, and case:
        assert( IsPalindrome(" \t09AZ/:@[`{za90"));  // boundaries
        assert( IsPalindrome("A man, a plan, a canal: Panama."));
        assert( IsPalindrome("Eva, can I stab bats in a cave?"));
        assert( IsPalindrome(""));  // empty string
        return 0;
    }
    

4

卢阿(56岁)

a=io.read"*l":lower():gsub("%W","")print(a:reverse()==a)

如果%W\W正则表达式中的内容,则还会排除下划线之类的字符。这是不需要的。
John Dvorak

我检查了,%w不包括_%W显然包括在内)
mniip

1
只需要功能主体。 s=s:lower():gsub('%W','')return s:reverse()==s 46个字符
Egor Skriptunoff 2013年

但是呢function(s)
mniip


4

Haskell,43岁

使用标准库Control.MonadControl.Monad.Instances以及Data.Char

ap(==)reverse.map toLower.filter isAlphaNum

我无法使它在ghci中工作。import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNum既不添加空格也不是这样,对不起,我不太喜欢Haskell :)
SlimJim 2013年

1
@SlimJim:糟糕,您也需要Control.Monad.Instances。(我将Reader monad实例与一起使用ap,但该实例未由导出Control.Monad。)
Jon Purdy 2013年

4

PHP 60个字符。

首先尝试使用codegolf。

//thank you manatwork
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x); 

例:

$c='Eva, can I stab bats in a cave?';
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
//prints 1

不需要三元运算符的第一个操作数周围的括号。实际上,不需要三元运算符-只需在您的语言表示中输出true或false即可。并且通过避免为$ x 1赋值的单独语句,可以缩短更多字符:echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
manatwork

3

Python 2 64个字符:

i =''.join(re.findall('[a-z0-9]+',i.lower()))
return i==i[::-1]

@manatwork如果将所有标识符替换为一个字符标识符,则会获得一个77字符版本。不知道为什么abhiram发布了ungolfed版本。
Bakuriu

@Bakuriu,没关系,我错过了一个问题:“仅需要方法主体”。尽管第2行和第3行仅给我73个字符。关于进一步的长度减少,不需要原始字符串和捕获组,从而使re.findall('[a-z0-9]+',input.lower())第3部分字符更短。
manatwork

@manatwork,我编辑了帖子并稍微更改了变量。这使它降至66。是的,这里的原始字符串属性没有用。
2013年

好的,但是为什么您坚持使用正则表达式中的捕获组?在没有以下情况的情况下可以正常工作:pastebin.com/JzpNRRZU
manatwork

在最近涉及re's的python项目之后,我认为它引起了我的注意:)感谢指出。
2013年

3

哈斯克尔48

(\x->x==reverse x).map toLower.filter isAlphaNum

像这样使用:

(\x->x==reverse x).map toLower.filter isAlphaNum$"Eva, can I stab bats in a cave?"

3

Smalltalk,Squeak / Pharo风味
116个字符,使用带有制表符的传统格式

您将两个方法添加到String:

selffles
    ^self = self reverse
isPalindrome
    ^(self asUppercase asDecomposedUnicode select: #isAlphaNumeric) selffles

我们当然可以消除一些空格,或者使用较短的方法名称,但是我们不要背叛Smalltalk的精神。

此外,这将处理法国回文,例如http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais,此页面中没有很多答案。

['Léon a trop par rapport à Noël' isPalindrome] assert.

聪明有用的答案!
安德鲁·格雷

3

Python 3(51个字符)

可能是Python 2

基于abhiram解决方案(高尔夫运动更加积极

from re import findall

def palindrome(i):
 i=findall('[a-z\d]',i.lower())
 return i==i[::-1]

print(palindrome(input('Phrase: ')))

可以使用RE'\ w'缩短为46个字符

和功能主体大大缩短的变体(27个字符)

import re
l=str.lower
f=re.compile('[a-z\d]').findall

def palindrome(i):i=f(l(i));return i==i[::-1]

print(palindrome(input('Phrase: ')))

2

Windows PowerShell,56 47 45个字符

已更新(请参阅评论),并且可以删除正则表达式周围的括号:

($s=$s-replace'\W')-eq(-join$s[$s.length..0])

原创(56)

$s=$s-replace'[^\w]','';$s-eq($s[-1..-$s.length]-join'')

原始的非高尔夫:

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev

您可以像这样打高尔夫球至47个字符:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD

@SpellingD:太好了!我是Code打高尔夫球的新手,感谢您的改进
goric

您还可以删除右括号:($s=$s-replace'\W')-eq-join$s[$s.length..0]
mazzy

2

C ++,74个字节

该代码实际上非常优雅,并且易于理解(格式正确时)。我不相信在C ++中有可能变得更短,并且它不使用任何标准库函数。

p(auto c){auto e=c;while(*e)++e;--e;while(*e==*c&e>c)--e,++c;return e<=c;}

用法示例:

p("Hello"); //Outputs 0
p(""); //Outputs 1
p("a"); //Outputs 1
p("HellolleH"); //Outputs 1

格式良好的版本:

p(auto c)
{
    auto e=c;
    while(*e) ++e;
    --e;
    while(*e==*c & e>c)--e,++c;
    return e<=c;
}

1
error: ISO C++ forbids declaration of ‘p’ with no type您的函数应具有返回类型。
Karl Napf

我敢打赌这不会忽略大小写,空格和控制字符。
泰特斯

您可以使用while(*++e);代替来保存字符while(*e)++e;。但是正如提多斯所说,这个答案是无效的。
尼克·马特奥

2

PHP,26 84 80 78 62 63字节

<?=strrev($s=strtolower(preg_replace("#\W#","",$argv[1])))==$s;

从第一个命令行参数获取输入;打印1为真,打印为空字符串,为假。


I18n有点小,因为strrev(110字节;运行-r)没有多字节替代:

preg_match_all("#.#us",$s=strtolower(preg_replace("#\W#u","",$argv[1])),$m);echo$s==join(array_reverse($m[0]);

utf8_strrev 从PHP手册中被公然盗窃。您可能还想看看此博客文章


来吧,泰特斯……这不符合规格。
Christoph'Apr

1
@Christoph是的,我有时应该完全阅读该内容。固定。
泰特斯

-R会导致字符串测试中的换行问题,不是吗?从规范“ -R <code>为每个输入行运行PHP <code>”。而且<?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;会更短。
Christoph'Apr

1
@Christoph不错的主意,但并非$argn没有-R
泰特斯

$argv[1]="O Genie, der Herr ehre dein Ego!"; # :D
Titus

1

Ruby,48岁

p((g=gets.upcase.gsub /[^A-Z\d]/,'')==g.reverse)

很简单,草草做得很快,所以不要打太多球。我待会再打高尔夫球。


1

Pylongolf2,24个字节

c╨2"[^a-zA-Z]"-_╨1=~

c接受输入,╨2将其转换为小写。
然后,我将一个正则表达式压入堆栈,并用于-删除输入中的所有非字母字符。
_复制输入。
╨1反转它,=然后比较它们。
~在最后打印堆栈,然后打印truefalse


这会忽略标点符号,空格和控制字符吗?
MickyT '16

我不好,这个版本没有。我会修好它。

解决了问题。

1

PowerShell,194字节

递归实现,以显示未命名的PowerShell脚本块如何调用自身。

$P={param([string]$s)$s=($s-replace'[^a-z]').tolower();if(!$s){return $true};if($s.length-lt4){return $s[0]-eq$s[-1]};$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))}

松散

$P={
param([string]$s)
$s=($s-replace'[^a-z]').tolower();
if(!$s){return $true};
if($s.length-lt4){return $s[0]-eq$s[-1]};
$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))
}

测试:

&$P "Eva, can I stab bats in a cave?"
&$P "Eva, can I stab cats in a cave?"
&$P "A man, a plan, a canal. Panama!"
&$P "A man, a plan, a big shovel, a canal. Panama!"
&$P "Madam, I'm Adam."
&$P "Madam, I'm Adam Corolla."
&$P "757"
&$P "Boeing 757"

那不是[^a-z0-9]吗?
泰特斯

1

05AB1E,4个字节(非竞争)

禁止竞争,因为该语言推迟了挑战。码:

álÂQ

说明:

á     # Only keep the alphabetic characters.
 l    # Lowercase the characters.
  Â   # Bifurcate, which duplicates the letters and reverses the duplicate.
   Q  # Check if they are equal.

使用CP-1252编码。在线尝试!


试图通过您的链接运行它。节目输出为“ 1”
Christopher Perry

1

果冻,10个字符(不竞争)

fØBŒl
UÇ⁼Ç

如果为true,则返回1;如果为false,则返回0

在线尝试!


它会忽略大小写,空格和控制字符吗?细分将是很好。
泰特斯

Jelly的当前状态允许使用7个字节解决此问题fØBŒlŒḂ::f过滤器以保留ØB集合[a-zA-Z0-9]并Œl转换为小写,然后ŒḂ测试回文。
steenbergh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.