문제

목표:어떤 언어입니다.최소있는 기능에 대한 반환 여부 문자열은 회문.여기에 내에서 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입니다.

슬프게도, 나는 천 단어 미만을 얻을 수 없습니다 ...

alt text

(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으로 줄었습니다.

일부 의견에 대한 응답으로 : 사전 처리기 남용이 계산되는지 확실하지 않습니다. 명령 줄에서 모든 것을 정의하고 함수를 하나의 문자로 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top