質問

目標:どんな言語でも。文字列が回文であるかどうかを返す最小の関数。ここに私のものがあります パイソン:

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

50文字。

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

役に立ちましたか?

解決

Jの7文字:これが最良の方法であるかどうかはわかりませんが、私はJに多少慣れています:)

p=:-:|.

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

p 'radar'
1

p 'moose'
0

他のヒント

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

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になります。

残念なことに、私は1000語未満になることはできません...

alt text

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

Haskell、 15 文字:

p=ap(==)reverse

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

p x=x==reverse x

もう少し短いPythonバージョン(21文字):

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

票を落とす危険性がありますが、これらのほとんどすべては、実際のプログラミングロジックをすべて隠す何らかの種類のコマンド reverse を呼び出します。

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

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

Perl(27文字):

sub p{

Perl(27文字):

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

ルビー(24文字):

<*>[0]eq reverse

Perl(27文字):

<*>

ルビー(24文字):

<*>[0]}

ルビー(24文字):

<*>

73クリーンで読みやすい、javaで記述された文字

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

平和:)

無意味なHaskellバージョン(15文字。ただし、Control.ArrowとControl.Monadを含めて、単相性の制限を無視しない限り、実際には機能しません):

p=ap(==)reverse

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('')}
(equal p (reverse p))

lisp。 18文字。

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

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

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

28文字。

もう少し詳しく説明します。完全な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;}

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

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

PHP:

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

または、ちょうど

$s==strrev($s); // 15 chars

ご使用の言語で逆関数を使用するのは、ちょっとした不正行為ではないですかつまり、Rubyソリューションを見てみると

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

次のように簡単に書き換えることができます

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

コードに拡張メソッドを作成して、「r」がリバースと呼ばれます。他の機能への呼び出しを含まないソリューションを投稿する人々を見てみたいです。もちろん、文字列の長さ関数は許可されるべきです。

リバースなしのルビー-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

ゴルフスクリプト、5文字

.-1%=

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

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

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

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

最も短いものではなく、非常に後付け的なものですが、MATLAB で試してみずにはいられませんでした。

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

24文字。

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

18文字のperl正規表現

/^(.?|(.)(?1)\2)$/

Cで52文字。ただし、文字列の半分までが上書きされることに注意してください:

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

ライブラリ呼び出しなしで64文字です:

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

以前の投稿に触発された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;}

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

p=uncurry(==).(id&&&reverse)

他の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文字になります。短くする方法を考えています。

37文字を使用したClojure:

user=> (defn p[s](=(seq s)(reverse(seq s))))
#'user/p
user=> (p "radar")
true
user=> (p "moose")
false

Perl では 24 文字。

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

Groovy 17B:

  

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

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

考え直せば、空の文字列に例外をスローすることは合理的です。

ライブラリ関数を使用せずに(実際には #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);}

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

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

[編集]現在実際に動作しています
[編集2]デフォルトのint returnを使用して74から70に削減

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top