文字列が回文であるかどうかを判断する最短のコード


42

回文は、両方の前後に同じように綴られているいくつかの文字列です。たとえば、「エヴァ、洞窟でコウモリを刺すことはできますか?」は回文です(EVACANISTAB | BATSINACAVE)

このコードゴルフでは、選択した言語を使用して、特定の文字列が回文であるかどうかを判断します。

エッジケース:

  • 句読点は回文にカウントされません。
  • 制御キャラクターは回文性にカウントされません。
  • ホワイトスペースは回文性にカウントされません。
  • 数字は回文にカウントされます。
  • この課題のケースは回文性にカウントされません。
  • 選択する言語によって課されるものを除き、評価する文字列の長さに制限はありません。
  • この課題では、ASCII文字セットに制限してください。

技術要件:

  • メソッド本体のみが必要です。メソッドの署名、データ構造の宣言などの追加事項は、勝利の要件にはカウントされません。
  • コードは、コンパイル時エラーまたは例外なしでコンパイルまたは解釈する必要があります。
  • コードは未処理の例外やクラッシュをスローしてはなりません。(ほぼ言うまでもない。ほぼ。)
  • コードは回文性を示す何らかの値を返さなければなりません。データ型は、使用する言語によって異なります(たとえば、C#ユーザーはを使用するbool場合がありますが、JavaScriptユーザーはを使用できますvar)。
  • このタスクを「ネイティブ」機能として実行する独自のインタープリターを作成して、ほぼ勝ち取ったスコアを「ゴルフ」することはできません。(言うまでもないことです。)

勝利条件:

  • 文字の最短コードが勝ちです。

現在のリーダー:tmartin(k、25文字)

...によって魔法の緑のチェックマークをしたいあなたの答えは?この男の答えを打ち負かす!


1
I / Oは課題の一部ですか、それとも機能団体が行いますか?
ジョンドヴォルザーク

1
作業がどのように洗練されているかを示すための「ブレッドクラム」は、改訂履歴を介してすべての回答でサイト全体で利用可能です。現在のバージョンの回答では、完全な履歴を表示する必要はありません。
ピーターテイラー

1
@WernerCD OPは、新しい応答を確認するために戻ってきたときに緑のチェックマークを取得する人を変更するはずです。
ガレス

2
言語を指定しないことは、私にとってこの挑戦を本当に困難にします。以下に示すように、高次のテキスト操作関数に焦点を当てたインタープリター言語は、常に最短の結果を取得します。単一の関数ip()で独自のインタープリターを一緒に投げることを止めるのは何ですか 私の競合アルゴリズムは現在「ip:i」です。4文字。できた。
ガスドール

3
@Gusdorは、JとGolfScriptがCode Golf and Language Handicapのすべての楽しみと、このサイトのメタに関する関連する質問を吸うのを見てください。
AakashM

回答:


29

K、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

まあ、私は正確に.QAなどを呼び出さないq それらは単なる文字列ラッパーであり、その下に実際のkコードはありません。今、私が.q.interと言った場合、私は困っています。
tmartin

私はそれがセマンティクスをめぐる事件だと思うが、それらは
qkで

ちょうど31のQを言うことができます:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

私はあなたが持つ1バイト保存することができます...これは非常に古いです知っているが、{#|:\_x@&x in,/.Q`a`A`n}1がtrueで、2が偽で、
走り書き

24

Perl、26文字

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

$_回文がパリンドロームの場合は1に評価され""、そうでない場合はPerlの偽の値の1つに評価されます。

サンプル使用法:

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オプションを使用する必要はありませんか?
ガレス

\W正規表現では、アンダースコアは除外されます。[^a-z\d]正規表現で必要になると思います。とにかくbeatられているのではないかと心配しています。
ジョンドボラック

3
_|\W代わりにを保存します[_\W]
ハワード

1
あなたは短縮することができます_|\W\Plideone.com/0ufdaQ。Unicode文字のみである必要があります。
コビ

実際、もう一度考えてみてください- \Pl数字と一致しないので_|\W、あなたができる最善の方法だと思います。
コビ

18

C#82のみ:)

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

私の好きな言語で定型のないプログラムを書く誘惑に抵抗できませんでした。

テストはこちらから入手できます:http : //ideone.com/8bwz7z


シンプル...しかしエレガント!
アンドリューグレイ

@AndrewGrayは、コメントと寛容な技術要件に感謝します。C#ボイラープレートは、文字数に深刻な影響を与えます。それ以外の場合、ゴルフでは実用的ではありません。
クリスティアンルパスク2013

2
問題ありません。私は仲間のC#開発者であり、簡潔で効率的なコードを書くのが好きです。それはそんなに定型が...言語であります残念だ
アンドリュー・グレイ

13

GolfScript、 36 34 31 30文字

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

以前の(Javascript)ソリューションと同様のアルゴリズム。

0"0:A[a{"@{>^}+/-Peter TaylorとHowardにより最適化されています。私のバージョンはでした"/9@Z"{1$<},,2%\;。ハワードは関数の連結を寄付し、ピーターテイラーはモジュロ2のXORを寄付しました。基本的に、値が一連の範囲内にあるかどうかを比較する一般的な方法です。

{.96>32*-}%(11文字)は、実際にはJavaScript .toUpperCase()(14文字)の改善ではありません。特にz、ASCIIテーブルに続くいくつかの奇妙な句読点を混乱させるためです(ここでは関係ありません)。

ただし、Peter Taylorが提案したように、最初に英数字を除外すると、各文字に1ビットを設定するだけで小文字と数字に変換できます。 {32|}

.-1%=すべてのパリンドロームの重荷を持ち上げます。私があまり好きではない部分の1つは、配列を逆にする方法を見つけるのにどれくらい時間がかかったかです。私はドキュメントを読むべきでした。他の2つの文字は、スタック管理と比較を実行します。

テスト:http : //golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7IjA6QVtheyJcez59KywsMiV9LHszMnx9JS4tMSU9


さらに、次の制御文字が存在しないと仮定できる場合:(データリンクエスケープ、デバイス制御1-4、否定応答、同期アイドル、送信ブロックの終了、キャンセル、メディアの終了)(これらはすべて同意しますすべてかなりわかりにくい)または数字0〜9の大文字バージョンとして扱うことができる場合は、さらに2文字を保存できます。

GolfScript、28文字

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

テスト:http : //golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7IkB7Pl59Ky99LC4tMSU9


2
クリーンアップを解除して、2つの文字を保存できます。– {"0:A["\{>}+,,2%},
ハワード

@Howardありがとう。+ブロックについて誤解したと思う。それはクールなトリックです。
ジョンドボラック

1
フィルターとケースの標準化を逆にすると、3つの文字を保存できます。a{小文字を含めるには、フィルターの文字リストに追加する必要がありますが、その後だけで大文字にすることができます{32|}%。最終結果は{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
ピーターテイラー

また、フィルターに別の保存が行われます。モジュロ2のカウントはxorであるため0"0:A[a{"@{>^}+/、仕事も同じです。
ピーターテイラー

@PeterTaylorすぐに別の最適化を思い付かない場合は、おそらくコミュニティwikiに変換する必要があります。再びありがとう:-)
ジョンドヴォルザーク

8

JavaScript、53文字:

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

は、x回文である場合はtrue、そうでない場合はfalseに評価されるJavaScript式です。x文字列であると想定しています。保証されていない場合は、先頭に追加しますx+="",

パンくずリストは次のとおりです。仕組みによりreverse()

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

失敗します。しかしながら、

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

まったく問題ありません。


null文字列の連結に関するちょっとしたアドバイス!良いinfozのポイント!
アンドリューグレー

3
ヒント:+""文字列への+キャスト、数値|0への~~キャスト、整数への!!キャスト、ブール値へのキャスト。
ジョンドヴォルザーク

正規表現と文字短い/[^\W_]/g
SuperPrograman

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                                         

この 17,826語の回文をhuge_palindrome.txt含む)

このソリューションは、いくつかの文字を追加する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

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文にカーリーを強制しますか?
アンドリューグレイ

3
あなたは絶対に正しいです、私はそれをありがとうございました!! ...彼らがそこにいたことに気づいていません、私はC#ではないJava開発者だと思いますか?
jsedano

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

7

Mathematica 54 53

CatsAreFluffyのおかげで1バイト節約できました。

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

バージョン10.2以前の場合:

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

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

本当


PalindromeQより1バイト短い#==Reverse@#&
CalculatorFeline

なぜ見たことがなかったのかと思いました。バージョン10.3!
DavidC

PalindromeQ= #==Reverse@#&
電卓

はい、v 10.4をダウンロードして試してみました。
-DavidC

出た?大野
電卓

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

編集:中間変数を回避することにより、さらに3文字削りました。H / T、CS。-7:エラーを抑制する必要はありません。


1
おもしろいことに、3文字以上あれば、コードがはるかに読みやすくなります:
ジョンドヴォルザーク

余分な文字が入り込んだので、削除しました。
skeevey

5

ルビー: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のトリックで私を驚かせ続けます。
マナトワーク

小さな問題ですが、@ Howard。trそして、tr!:彼らはTRANSLITERATEに何も持っていないときに、異なる動作をするようですpastebin.com/4YThW2qNなりp['757']NoMethodError」でクラッシュするテストを!:未定義のメソッドを`UPCASEを」for nil:NilClass」エラー。
マナトワーク

おっと、ごめんなさい。その場合について考えませんでした。
ハワード

1
さらに短くすることができます:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
クリスチャンルパスク

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より短いために使用します。charauto

    #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である場合、アンダースコアなどの文字も除外されます。これは望ましくありません。
ジョンドヴォルザーク

私はチェックし、含まれて%wいません_%W明らかに含まれています)
mniip

1
関数本体のみが必要です。 s=s:lower():gsub('%W','')return s:reverse()==s 46文字
エゴールスクリプチュノフ

しかし、どうfunction(s)
ですか-mniip


4

ハスケル、43

標準ライブラリを使用してControl.MonadControl.Monad.InstancesData.Char

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

これをghciで動作させることはできません。import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumスペースの追加なども行いません。申し訳ありませんが、Haskellにはあまり
興味

1
@SlimJim:おっと、あなたも必要Control.Monad.Instancesです。(私はReaderモナドインスタンスをapで使用していますが、そのインスタンスはによってエクスポートされませんControl.Monad。)
ジョンパーディ

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

三項演算子の第1オペランドを囲む括弧は不要です。実際、三項演算子は必要ありません。言語の表現でtrueまたはfalseを出力するだけです。そして、$ x 1への割り当てのための別個のステートメントを避けることにより、さらに文字を短縮できます:echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
マナトワーク

3

Python 2 64文字:

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

@manatworkすべての識別子を1文字の識別子に置き換えると、77文字バージョンが取得されます。しかし、abhiramがなぜungolfed版を投稿したのかわかりません。
バクリウ

@Bakuriu、気にしないで、「メソッド本体だけが必要です」という質問の1つのステートメントを見逃しました。2行目と3行目では73文字しか表示されませんが。さらに長さを短縮することに関して、生の文字列とキャプチャグループが不要になり、re.findall('[a-z0-9]+',input.lower())パート3の文字が短くなりました。
マナトワーク

@manatwork、投稿を編集し、変数を少し変更しました。これで66になりました。はい、ここでは生の文字列属性は役に立ちません。
abhiram

わかりましたが、なぜ正規表現でキャプチャグループを主張するのですか?なくても正常に動作します:pastebin.com/JzpNRRZU
manatwork

reを含む最近のpythonプロジェクトの後、それが私に広まったと思います:)それを指摘してくれてありがとう。
abhiram

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文字

2つのメソッドを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の場合もあります

アビラムソリューションに基づく(より積極的なゴルフ)

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:いいね!私はコードゴルフの
初心者

右括弧も削除できます($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関数には戻り値の型が必要です。
カールナップ

これは大文字小文字、空白、制御文字を無視しないに違いない。
タイタス

while(*++e);代わりにを使用してキャラクターを保存できますwhile(*e)++e;。しかし、タイタス​​が言及したように、この答えは無効です。
ニックマッテオ

2

PHP、26 84 80 78 62 63バイト

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

最初のコマンドライン引数から入力を受け取ります。プリント1truthyため、falsy空の文字列。


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マニュアルから露骨に盗まれました。あなたも見てみたいかもしれませんこのブログ投稿もご覧ください


タイタスに来て...これは仕様に失敗します。
クリストフ

1
@Christophええ、私は時々それを完全に読むべきです。一定。
タイタス

Hm -Rは、テストする文字列の改行で問題を引き起こしませんか?仕様から「-R <code>すべての入力行に対してPHP <code>を実行」。さらに<?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;短くなります。
クリストフ

1
@Christophいい考えですが、$argnなしはありません-R
タイタス

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

1

ルビー、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

私の悪い、このバージョンはそうではありません。私はそれを修正します。

問題を修正しました。

1

パワーシェル、 194 190バイト

名前のない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」
クリストファーペリー

1

ゼリー、10キャラクター(非競合)

fØBŒl
UÇ⁼Ç

trueの場合は1、falseの場合は0を返します

オンラインでお試しください!


大文字小文字、空白、制御文字は無視されますか?故障はいいだろう。
タイタス

Jellyの現在の状態では、これを7バイトで解決できます。fØBŒlŒḂfフィルターを使用しØBてセット[a-zA-Z0-9] を保持し、Œl小文字に変換してから、ŒḂ回文をテストします。
-steenbergh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.