目標: あらゆる言語。文字列が回文かどうかを返す最小の関数。これがPythonの私のものです:
R=lambda s:all(a==b for a,b in zip(s,reversed(s)))
50文字。
受け入れられた回答は、現在の最小のものになります。これは、より小さなものが見つかると変化します。コードの言語を指定してください。
目標: あらゆる言語。文字列が回文かどうかを返す最小の関数。これがPythonの私のものです:
R=lambda s:all(a==b for a,b in zip(s,reversed(s)))
50文字。
受け入れられた回答は、現在の最小のものになります。これは、より小さなものが見つかると変化します。コードの言語を指定してください。
Jの7文字: これが最善の方法かどうかはわかりません.
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になります。
悲しいことに、私は千の言葉を理解することができません...
(LabVIEW。ええ、彼らはここにほぼすべてのホーボー投稿を許可します;)
Haskell、15文字:
p=ap(==)reverse
より読みやすいバージョン、16文字:
p x=x==reverse x
かなり短い(21文字)別のPythonバージョン:
R=lambda s:s==s[::-1]
票を落とすリスクを冒して、これらのほとんどは、実際のプログラミングロジックをすべて隠すある種のコマンドリバースを呼び出すだけです。
これを行うための最短の手動の方法は、これらの各言語で何であるのだろうか。
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);
}
Perl(27文字):
sub p{$_[0]eq reverse$_[0]}
ルビー(24文字):
def p(a)a==a.reverse end
Java で書かれた 73 のきれいで読みやすい文字
boolean p(String s){return s.equals(""+new StringBuffer(s).reverse());}
平和 :)
無意味な Haskell バージョン (15 文字ですが、Control.Arrow と Control.Monad をインクルードし、モノモーフィズムの制限を無視しない限り、実際には機能しません):
p=ap(==)reverse
もう少し詳しく説明します。完全な 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;}
(equal p (reverse p))
舌足らずの発音。18文字。
わかりました、これは特別なケースです。これは、Lisp インタープリターに直接入力され、p が既に定義されている場合に機能します。
それ以外の場合、これが必要になります。
(defun g () (equal p (reverse p)))
28文字。
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('')}
あなたの言語で逆関数を使っているのはちょっと浮気していませんか?つまり、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
Golfscript、5文字
.-1%=
$ echo -n abacaba | ruby golfscript.rb palindrome.gs
1
$ echo -n deadbeef | ruby golfscript.rb palindrome.gs
0
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
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 を使用するため、コア言語として扱う傾向があります。
前回の投稿に触発され、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;}
18 文字の perl 正規表現
/^(.?|(.)(?1)\2)$/
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);}
最短ではなく、非常に事後的ですが、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
他の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@_}
ライブラリ関数を使用せずに(実際に#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);}
グルービー 17B:
p={it==it[-1..0]}
欠点は、空の文字列では機能しないことです。
よく考えてみると、空の文字列に対して例外をスローすることは合理的です。
Haskell、28 文字、Control.Arrow をインポートする必要があります。
p=uncurry(==).(id&&&reverse)
Perl(21文字):
sub{"@_"eq reverse@_}
ねえ、質問は名前付きサブルーチンを指定していませんでした!
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文字にすることができます。
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
Haskell、独自の逆関数を含めて 36 文字。(実際、セミコロンを使用してワンライナーにし、最後の改行を無視すると、35になります...)
r[]y=y
r(a:x)y=r x$a:y
p s=s==r s[]
他の実装と同様に、「p」は回文述語です。
標準ライブラリを使用する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;}
再帰ラムダ関数を使用し、関数を使用しない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));};
C、ライブラリなし、70文字:
p(char*a){char*b=a-1;while(*++b);while(a<b&&*a++==*--b);return!(a<b);}
言及された別のCソリューションに関するコメントの1つとして、プロトタイプはCでは完全にオプションでありint
、タイプが行くすべての場所で想定されていますが、言及されていません。誰もANSIC以前にプログラムしたことはありませんか?
編集:短く、空の文字列を処理します。
JavaScript: 55 文字
p=function(x){return (x==x.split('').reverse().join())}
で呼び出す必要があるため、上記は機能しませjoin
ん""
JavaScript: 55 文字
function p(s){return s==s.split("").reverse().join("")}
シェルスクリプト (sed + tac + tr):
test "`echo $1|sed -e 's/\(.\)/\1\n/g'|tac|tr -d '\n'`" == "$1"
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;
標準 ML (34 文字と退屈):
fun p s=s=implode(rev(explode(s)))
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()」タイプの回答にはあまり感銘を受けません)
F#: 29 文字
let p(s:string)=s=s.Reverse()
(System.Linq がインポートされていると仮定)
文字列を反転せずに Python で 58 文字:
r="y" for i in range(len(s)): if(s[i]!=s[-i-1]): r="n"
おそらく for ループを最適化できますか? Pythonは私にとって新しい...
CFScript、39 文字:
function y(x){return(x is reverse(x));}
私は決してゴルフが上手ではありませんでした。
ジャワ:
boolean y(StringBuffer x){return x.equals(x.reverse());}
上記は機能しません。
boolean y(StringBuffer x){return x.toString().equals(x.reverse().toString()); }
ええ。
C、68 文字、ライブラリなし:
p(char *s){char *e=s;while(*++e);for(;*s==*--e&&s++<e;);return s>e;}
不可能!language、通常の引数を使用して文字列が渡されると仮定します。
;~=
3文字
間違いなく最小ではありませんが、それでもエントリを追加したかったのです。
sub p{return @_==reverse split//;}
私のperlは錆びていて、これはテストされていません。
上記の Josh の Java スニペットは、毎回 true を返します。