문제
목표:어떤 언어입니다.최소있는 기능에 대한 반환 여부 문자열은 회문.여기에 내에서 Python:
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
다른 팁
여기 내 것이 있습니다. 'Palindrome'이라는 도메인 별 언어로 작성되었습니다.
p
편집하다: Flippant 버전이 적습니다 (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 숯) :
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
73 깨끗하고 읽기 쉬운, 자바로 쓰여진 숯
boolean p(String s){return s.equals(""+new StringBuffer(s).reverse());}
평화 :)
무의미한 haskell 버전 (15 숯, 컨트롤 및 제어를 포함하지 않으면 실제로 작동하지 않습니다. 모나드 및 단일 형태 제한을 무시하십시오) :
p=ap(==)reverse
Lua 는 것을 목표로에서 더 많은 가독성보다 간결함,아직까 정직한 37chars:
function p(s)return s==s:reverse()end
변형,그냥 재미를위한(동일한 크기):
p=function(s)return s==s:reverse''end
JavaScript 버전은 더욱 자세한 정보(55chars),지 않기 때문에 문자열을 가지고 있 반전 기능:
function p(s){return s==s.split('').reverse().join('')}
(equal p (reverse p))
LISP. 18 자.
좋아, 이것은 특별한 경우이다. 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
언어에서 반대 기능을 사용하지 않습니까? 루비 솔루션을 보면
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
공통 LISP, 짧고 강한 버전 (23 숯) :
#L(equal !1(reverse !1))
#L은 반복 패키지에서 Sharpl-Reader가 구현 한 독자 매크로 문자입니다. 기본적으로 (Lambda (! 1) ...)와 같습니다.
공통 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)))))))
다시 말하지만, 그것은 기본적으로 내장 루프 시설의 더 깨끗한 버전 인 반복을 사용하므로 핵심 언어로 취급하는 경향이 있습니다.
가장 짧고, 매우 이후의 사실은 아니지만, 나는 Matlab에서 시도해 보는 것을 도울 수 없었습니다.
R=@(s)all(s==fliplr(s));
24 숯.
씨# 역 함수없이 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;}
씨# 역 함수없이 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 Regex
/^(.?|(.)(?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);}
이전 게시물에서 영감을 얻은 69 자
p(char*a){char*b=a,q=0;while(*++b);while(*a)q|=*a++!=*--b;return!q;}
편집 : 하나의 숯 :
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;}
Haskell, 28 문자, 제어가 필요합니다.
p=uncurry(==).(id&&&reverse)
표준 라이브러리 기능을 사용하여 C의 간단한 구현, 다른 C 답변의 Strlen에서 영감을 얻었습니다.
문자 수 : 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@_}
그루비 17b :
p={it==it[-1..0]}
단점은 Emptry String에서는 작동하지 않는다는 것입니다.
두 번째로 생각하면, 빈 문자열에 대한 예외를 던지는 것은 팔린 드롬이 아닌지 말할 수 없기 때문에 합리적입니다.
라이브러리 기능을 사용하지 않고 #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으로 줄었습니다.
일부 의견에 대한 응답으로 : 사전 처리기 남용이 계산되는지 확실하지 않습니다. 명령 줄에서 모든 것을 정의하고 함수를 하나의 문자로 만들 수 있습니다.