29

目標: あらゆる言語。文字列が回文かどうかを返す最小の関数。これがPythonの私のものです:

R=lambda s:all(a==b for a,b in zip(s,reversed(s)))

50文字。

受け入れられた回答は、現在の最小のものになります。これは、より小さなものが見つかると変化します。コードの言語を指定してください。

4

50 に答える 50

49

Jの7文字: これが最善の方法かどうかはわかりません.

p=:-:|.

説明: |。入力を反転します。-: 比較します。オペランドは暗黙的です。

p 'radar'
1

p 'moose'
0
于 2008-10-23T20:34:43.133 に答える
42

これが私のものです。それは私が発明した「パリンドローム」と呼ばれるドメイン固有言語で書かれています。

p

編集:より軽快なバージョン(i386 asm、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になります。

于 2008-10-23T04:19:56.407 に答える
37

悲しいことに、私は千の言葉を理解することができません...

代替テキスト

(LabVIEW。ええ、彼らはここにほぼすべてのホーボー投稿を許可します;)

于 2008-10-25T02:14:54.417 に答える
29

Haskell、15文字:

p=ap(==)reverse

より読みやすいバージョン、16文字:

p x=x==reverse x
于 2008-10-23T06:30:54.163 に答える
28

かなり短い(21文字)別のPythonバージョン:

R=lambda s:s==s[::-1]
于 2008-10-23T04:23:55.993 に答える
18

票を落とすリスクを冒して、これらのほとんどは、実際のプログラミングロジックをすべて隠すある種のコマンドリバースを呼び出すだけです。

これを行うための最短の手動の方法は、これらの各言語で何であるのだろうか。

于 2008-10-24T03:30:13.823 に答える
12

C# および LINQ 演算子の場合:

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

リバースを不正行為と見なす場合は、リダクションですべてを実行できます。

public bool IsPalindrome(string s)
{
    return s.Aggregate(new StringBuilder(),
                       (sb, c) => sb.Insert(0, c),
                       (sb) => sb.ToString() == s);
}
于 2008-10-24T14:53:33.590 に答える
10

Perl(27文字):

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

ルビー(24文字):

def p(a)a==a.reverse end
于 2008-10-23T04:26:43.540 に答える
9

Java で書かれた 73 のきれいで読みやすい文字

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

平和 :)

于 2008-10-23T05:56:26.667 に答える
6

無意味な Haskell バージョン (15 文字ですが、Control.Arrow と Control.Monad をインクルードし、モノモーフィズムの制限を無視しない限り、実際には機能しません):

p=ap(==)reverse
于 2008-10-24T06:06:27.923 に答える
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;}
于 2008-10-24T09:53:38.310 に答える
5
(equal p (reverse p))

舌足らずの発音。18文字。

わかりました、これは特別なケースです。これは、Lisp インタープリターに直接入力され、p が既に定義されている場合に機能します。

それ以外の場合、これが必要になります。

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

28文字。

于 2008-10-23T05:58:59.827 に答える
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('')}
于 2008-10-23T13:04:49.220 に答える
4

あなたの言語で逆関数を使っているのはちょっと浮気していませんか?つまり、Rubyソリューションを見ると次のようになります

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

あなたはそれを簡単に書き直すことができます

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

「r」がreverseと呼ばれるように、コードで拡張メソッドを作成したとだけ言ってください。他の関数への呼び出しを含まないソリューションを投稿してもらいたいです。もちろん、文字列の長さ関数は許可する必要があります。

リバースなしの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
于 2008-10-23T20:52:04.470 に答える
4

Golfscript、5文字

.-1%=

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

$ echo -n deadbeef | ruby golfscript.rb palindrome.gs
0
于 2010-10-07T21:54:52.957 に答える
4

F# (C# の例によく似ています)

let p s=let i=0;let l=s.Length;while(++i<l)if(s[i]!=[l-i-1]) 0; 1;;
于 2008-10-24T03:54:39.390 に答える
4

PHP:

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

あるいは単に

$s==strrev($s); // 15 chars
于 2008-10-23T06:38:32.277 に答える
3

Common Lisp、短くて不正なバージョン (23 文字):

#L(equal !1(reverse !1))

#L は iterate パッケージの 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)))))))

繰り返しになりますが、これは基本的に組み込みの LOOP 機能のよりクリーンなバージョンである iterate を使用するため、コア言語として扱う傾向があります。

于 2008-10-24T11:11:05.190 に答える
3

前回の投稿に触発され、69 文字

p(char*a){char*b=a,q=0;while(*++b);while(*a)q|=*a++!=*--b;return!q;}

編集:1文字下:

p(char*a){char*b=a,q=0;while(*++b);while(*a)q|=*a++%*--b;return!q;}

EDIT2: 65 文字:

p(char*a){char*b=a;while(*b)b++;while(*a&&*a++==*--b);return!*a;}
于 2008-10-25T21:16:24.993 に答える
3

18 文字の perl 正規表現

/^(.?|(.)(?1)\2)$/
于 2009-10-22T07:51:19.730 に答える
3

C では 52 文字で、文字列の最大半分が上書きされるという注意事項があります。

p(char*s){return!*s||!(s[strlen(s)-1]-=*s)&&p(++s);}

ライブラリ呼び出しがなければ、64 文字です。

p(char*s){char*e=s;while(*e)++e;return!*s||!(*--e-=*s)&&p(++s);}

于 2010-02-24T06:03:49.207 に答える
3

最短ではなく、非常に事後的ですが、MATLAB で試してみることにしました。

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

24文字。

于 2009-01-23T04:02:44.480 に答える
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
于 2008-10-23T21:41:39.067 に答える
2

他のCの回答のstrlenに触発された、標準ライブラリ関数を使用したCでの簡単な実装。

文字数:57

p(char*s){char*r=strdup(s);strrev(r);return strcmp(r,s);}

告白:ここでrを解放しないことで、私は悪者になっています。良いことへの私の現在の試み:

p(char*s){char*r=strdup(s);s[0]=strcmp(strrev(r),s);free(r);return s[0];}

73文字になります。私はそれをもっと短くする方法を考えています。

于 2008-10-23T15:12:40.850 に答える
2

37文字を使用したClojure:

user=> (defn p[s](=(seq s)(reverse(seq s))))
#'user/p
user=> (p "radar")
true
user=> (p "moose")
false
于 2008-10-25T03:12:01.133 に答える
2

Perlでは24文字。

sub p{$_[0]eq+reverse@_}
于 2008-10-25T03:54:16.273 に答える
2

ライブラリ関数を使用せずに(実際に#includeコストも追加する必要があるため)、96のC++バージョンは次のとおりです。

int p(char*a,char*b=0,char*c=0){return c?b<a||p(a+1,--b,c)&&*a==*b:b&&*b?p(a,b+1):p(a,b?b:a,b);}
于 2008-10-23T15:52:33.063 に答える
2

グルービー 17B:

p={it==it[-1..0]}

欠点は、空の文字列では機能しないことです。

よく考えてみると、空の文字列に対して例外をスローすることは合理的です。

于 2008-10-24T03:05:26.620 に答える
2

Haskell、28 文字、Control.Arrow をインポートする必要があります。

p=uncurry(==).(id&&&reverse)
于 2008-10-23T12:56:38.330 に答える
1

Perl(21文字):

sub{"@_"eq reverse@_}

ねえ、質問は名前付きサブルーチンを指定していませんでした!

于 2010-02-24T06:38:06.523 に答える
1

Cでの私の試み(70文字):

P(char*s){char*e=s+strlen(s)-1;while(s<e&&*s==*e)s++,e--;return s>=e;}

[編集]実際に機能するようになりました
[編集2]デフォルトのintreturnを使用して74から70に減少しました

いくつかのコメントに応えて:そのプリプロセッサの悪用が重要かどうかはわかりません-コマンドラインですべてを定義して、関数を1文字にすることができます。

于 2008-10-23T04:22:48.273 に答える
1

F#、LINQ なし、Reverse メソッド。シーケンシャルフォールド:

let p (s : string) = 
  fst(s |> Seq.fold (fun (r, i) c -> (r && c = s.[s.Length - 1 - i], i + 1)) (true, 0))

同じですが、Seq.fold の代わりに Seq.iteri と ref 変数を使用します。

let p (s : string) = 
  let r = ref true
  Seq.iteri (fun i c -> r :=  (!r && c = s.[s.Length - 1 - i])) s
  !r
于 2011-05-14T22:46:28.193 に答える
1

Haskell、独自の逆関数を含めて 36 文字。(実際、セミコロンを使用してワンライナーにし、最後の改行を無視すると、35になります...)

r[]y=y
r(a:x)y=r x$a:y
p s=s==r s[]

他の実装と同様に、「p」は回文述語です。

于 2009-01-23T08:14:28.620 に答える
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;}
于 2009-01-23T04:18:04.150 に答える
0

再帰ラムダ関数を使用し、関数を使用しないC#Reverse(115文字):

Func<string,bool>p=null;p=w=>{if(w.Length<2)return true;return w[0]==w[w.Length-1]&&p(w.Substring(1,w.Length-2));};
于 2010-10-08T22:12:27.717 に答える
0

C、ライブラリなし、70文字:

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

言及された別のCソリューションに関するコメントの1つとして、プロトタイプはCでは完全にオプションでありint、タイプが行くすべての場所で想定されていますが、言及されていません。誰もANSIC以前にプログラムしたことはありませんか?

編集:短く、空の文字列を処理します。

于 2008-10-25T03:49:06.597 に答える
0

JavaScript: 55 文字

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

で呼び出す必要があるため、上記は機能しませjoin""

JavaScript: 55 文字

function p(s){return s==s.split("").reverse().join("")}
于 2008-10-26T02:44:11.913 に答える
0

シェルスクリプト (sed + tac + tr):

test "`echo $1|sed -e 's/\(.\)/\1\n/g'|tac|tr -d '\n'`" == "$1"
于 2008-10-23T19:20:23.797 に答える
0

Java、リバースを使用しない場合:

boolean p(String s){int i=0,l=s.length();while(i<l){if(s.charAt(i++)!=s.charAt(--l))l=-1;}return l>=0;
于 2008-10-26T04:47:58.420 に答える
0

標準 ML (34 文字と退屈):

fun p s=s=implode(rev(explode(s)))
于 2008-10-26T06:39:17.790 に答える
0

javascript 再帰版 (逆ジャンクなし)

function p(s){l=s.length;return l<2||(s[0]==s[l-1]&&p(s.substr(1,l-2)))}

(72文字)

または内部で逆を実装します:

p=function(s,y){return y?(s==p(s)):s[1]?(p(s.substr(1))+s[0]):s[0]}

p("hannah",1);

(67文字)

または、組み込み関数をまったく使用しない...

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);

(92文字)

私が思いつくことができる最短:(反復)

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?)

(59文字)

あなたがJavaScriptでそれをより良くするのを見るのを楽しみにしています!

(できれば組み込み関数を使用せずに、特に逆)

(「return s==s.reverse()」タイプの回答にはあまり感銘を受けません)

于 2010-08-22T02:45:47.170 に答える
0

F#: 29 文字

let p(s:string)=s=s.Reverse()

(System.Linq がインポートされていると仮定)

于 2010-10-07T22:22:39.040 に答える
0

文字列を反転せずに Python で 58 文字:

r="y"
for i in range(len(s)):
 if(s[i]!=s[-i-1]):
  r="n"

おそらく for ループを最適化できますか? Pythonは私にとって新しい...

于 2009-09-27T11:53:05.337 に答える
0

CFScript、39 文字:

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

私は決してゴルフが上手ではありませんでした。

于 2008-10-23T12:40:32.543 に答える
0

ジャワ:

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

上記は機能しません。

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

ええ。

于 2008-10-23T12:55:31.703 に答える
0

C、68 文字、ライブラリなし:

p(char *s){char *e=s;while(*++e);for(;*s==*--e&&s++<e;);return s>e;}
于 2008-10-27T10:20:51.257 に答える
0

不可能!language、通常の引数を使用して文字列が渡されると仮定します。

;~=

3文字

于 2010-10-08T22:59:47.740 に答える
0

間違いなく最小ではありませんが、それでもエントリを追加したかったのです。

sub p{return @_==reverse split//;}

私のperlは錆びていて、これはテストされていません。

于 2008-10-23T21:52:36.673 に答える
-1

上記の Josh の Java スニペットは、毎回 true を返します。

于 2008-10-24T05:56:04.653 に答える