質問
目標:どんな言語でも。文字列が回文であるかどうかを返す最小の関数。ここに私のものがあります パイソン:
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語未満になることはできません...
(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文字にすることができます。