문자열이 회문인지 확인하는 가장 짧은 코드


42

회문은 모두 앞뒤로 같은 방식으로 철자가 일부 문자열입니다. 예를 들어, '에바, 동굴에서 박쥐를 찌를 수 있습니까?' 회문 (EVACANISTAB | BATSINACAVE)

이 코드 골프의 경우 선택한 언어를 사용하여 주어진 문자열이 회문인지 여부를 결정하십시오.

가장자리 케이스 :

  • 문장 부호는 회문으로 계산되지 않습니다.
  • 제어 문자는 회상으로 계산되지 않습니다.
  • 공백은 회문으로 계산되지 않습니다.
  • 숫자는 회문으로 계산됩니다.
  • 이 도전의 사례는 맹목적으로 계산되지 않습니다.
  • 선택한 언어에 의해 부과되는 것을 제외하고 평가할 문자열의 길이에는 제한이 없습니다.
  • 이 문제를 해결하려면 ASCII 문자 세트로 제한하십시오.

기술 요구 사항:

  • 분석법 본문 만 필요합니다. 메소드 서명, 데이터 구조 선언 등과 같은 추가 사항은 승리 요구 사항에 포함되지 않습니다.
  • 코드는 컴파일 타임 오류나 예외없이 컴파일하거나 해석해야합니다.
  • 코드는 처리되지 않은 예외 나 충돌을 발생시키지 않아야합니다. (거의 말할 필요도 없습니다. 거의)
  • 코드는 palindrominess를 나타내는 값을 반환해야합니다. 데이터 유형은 사용하는 언어에 따라 다릅니다 (예 : C # 사용자는을 사용할 수 bool있지만 JavaScript 사용자는을 사용할 수 있음 var)
  • 이 작업을 '네이티브'기능으로 수행하는 자신 만의 통역사를 작성해서는 안되므로 거의 승리 한 스코어를 '골프'할 수 있습니다. (발언 할 필요가 없습니다.)

승리 조건 :

  • 문자가 가장 짧은 코드가 이깁니다.

현재 리더 : tmartin (k, 25 자)

...에 의해 마법의 녹색 확인 표시가 원하는 당신의 대답을? 이 남자의 대답을 이길!


1
I / O가 도전의 일부입니까, 아니면 기능기구가 수행합니까?
John Dvorak

1
작업 내역을 수정하는 방법을 보여주는 "빵 부스러기"는 개정 내역을 통해 모든 답변에서 사이트 전체에서 사용 가능합니다. 현재 버전의 답변에서 전체 기록을 볼 필요는 없습니다.
피터 테일러

1
@WernerCD 새 응답을 확인하기 위해 다시 오면 OP가 녹색 체크 표시를받는 사람을 변경할 것이라고 확신합니다.
Gareth

2
언어를 지정하지 않으면 실제로이 문제가 사소 해집니다. 아래에서 볼 수 있듯이, 높은 순서의 텍스트 조작 기능에 중점을 둔 해석 언어는 항상 가장 짧은 결과를 얻습니다. ip ()라는 단일 함수로 내 자신의 인터프리터를 함께 던지는 것을 막을 방법 경쟁 알고리즘은 이제 'ip : i'입니다. 4 자 끝난.
Gusdor

3
@Gusdor는 J와 GolfScript 가이 사이트의 메타에 관한 Code GolfLanguage Handicap 의 모든 즐거움 과 관련 질문을 빨아들이는 것을 본다 .
AakashM

답변:


29

K, 25

{x~|x:_x@&x in,/.Q`a`A`n}

.

k){x~|x:_x@&x in,/.Q`a`A`n}"Eva, can I stab bats in a cave?"
1b

P하십시오 Q의 혼합물 K 같다
skeevey

글쎄, 정확히 .QA 등을 호출하지는 않습니다 .q. 그것들은 단지 문자열 래퍼 일 뿐이며, 그 아래에는 실제 k 코드가 없습니다. 이제 .q.inter라고 말하면 문제가 생길 것입니다.
tmartin

나는 그것이 의미 이상 핑계의 경우 같아요 그러나 그들은 QK에 정의되어 있습니다
skeevey

31에 대해 Q라고 말할 수 있습니다.{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

나는 당신이 1 바이트를 저장할 수 있습니다 ... 이것은 아주 오래 알고 있지만 {#|:\_x@&x in,/.Q`a`A`n}1에 해당하는 2가 거짓이고,
낙서

24

펄, 26 자

s/_|\W//g;uc eq reverse uc

$_회문이 아닌 경우 1로 평가하고 , ""그렇지 않은 경우에는 Perl의 잘못된 값 중 하나입니다.

샘플 사용법 :

sub palin {
    s/_|\W//g;uc eq reverse uc
}
while (<DATA>) {
    chomp;
    print "$_ => ",palin()?"yes":"no","\n";
}
__DATA__
Eva, can I stab bats in a cave?
A man, a plan, a canal. Panama!
Madam, I'm Adam Corolla.
757
Boeing 757
A man, a plan, a big shovel, a canal. Panama!
A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal >> __Panama__

산출:

Eva, can I stab bats in a cave? => yes
A man, a plan, a canal. Panama! => yes
Madam, I'm Adam Corolla. => no
757 => yes
Boeing 757 => no
A man, a plan, a big shovel, a canal. Panama! => no
A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal >> __Panama__ => yes

젠장, 넌 날 이겼어 _문자열에 a 가 있으면 올바르게 작동하지 않습니까? 그리고 입력을받지 않으므로 -p옵션 을 사용할 필요가 없습니까?
Gareth

\W정규 표현식에서 밑줄을 제외합니다. [^a-z\d]정규식에 필요할 것 같습니다 . 어쨌든 내가 두들겨서 두렵습니다.
John Dvorak

3
_|\W대신에 하나를 저장하십시오 [_\W].
Howard

1
당신은 줄일 수 있습니다 _|\W\Pl: ideone.com/0ufdaQ를 . 유니 코드 문자 여야합니다.
Kobi

실제로 다시 생각 \Pl하면 숫자와 일치하지 않으므로 _|\W최선을 다할 것입니다.
Kobi

18

C # 82 만 해당 :)

var x=s.ToLower().Where(char.IsLetterOrDigit);return x.SequenceEqual(x.Reverse());

내가 좋아하는 언어로 상용구없는 프로그램을 작성하려는 유혹에 저항 할 수 없었다.

테스트는 여기에서 가능합니다 : http://ideone.com/8bwz7z


단순하지만 우아합니다!
Andrew Grey

@AndrewGray는 의견과 허용 기술 요구 사항에 대해 감사합니다. C # 상용구는 문자 수를 심각하게 증가시켜 골프에 비현실적입니다.
Cristian Lupascu

2
가능성 없음. 저는 동료 C # 개발자이며 간결하고 효율적인 코드 작성을 좋아합니다. 언어가 너무 많은 보일러 플레이트가 있다는 것은 부끄러운
Andrew Grey

13

골프 공, 36 34 31 30 자

{0"0:A[a{"@{>^}+/},{32|}%.-1%=

이전 (자바 스크립트) 솔루션과 비슷한 알고리즘 .

0"0:A[a{"@{>^}+/-Peter Taylor와 Howard가 최적화했습니다. 내 버전은 "/9@Z"{1$<},,2%\;입니다. Howard는 함수 연결을 기증했으며 Peter Taylor는 모듈로 -2를 위해 XOR을 기증했습니다. 기본적으로 값이 일련의 범위에 있는지 비교하는 일반적인 방법입니다.

{.96>32*-}%(11 문자)는 실제로 자바 스크립트 .toUpperCase()(14 문자) 보다 개선되지는 않습니다 . 특히 zASCII 테이블 ( 다음 은 중요하지 않음)에 나오는 이상한 구두점을 뒤섞기 때문에 특히 그렇습니다 .

그러나 Peter Taylor가 제안한 것처럼 먼저 영숫자를 필터링하면 각 문자에 1 비트를 설정하여 소문자와 숫자로 변환 할 수 있습니다. {32|}

.-1%=회백색의 모든 무거운 리프팅을 수행합니다. 내가 정말로 좋아하지 않는 한 부분은 배열을 뒤집는 방법을 찾는 데 얼마나 걸 렸는지입니다. 나는 문서를 읽었어야했다. 다른 두 문자는 스택 관리 및 비교를 수행합니다.

테스트 : http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7IjA6QVtheyJcez59KywsMiV9LHszMnx9JS4tMSU9


또한 다음 제어 문자 중 어느 것도 존재하지 않는다고 가정 할 수 있다면 (데이터 링크 이스케이프, 장치 제어 1-4, 부정 승인, 동기 유휴, 전송 블록 끝, 취소, 매체 끝) 모두 모호한 경우) 또는 숫자 0-9의 대문자 버전으로 취급 할 수 있으면 다른 두 문자를 저장할 수 있습니다.

GolfScript, 28 자

{32|}%{0"0:a{"@{>^}+/},.-1%=

테스트 : http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7IkB7Pl59Ky99LC4tMSU9


2
정리를 제거하고 두 문자를 저장할 수 있습니다.{"0:A["\{>}+,,2%},
Howard

@Howard 감사합니다. 나는 +블록에 대해 잘못 이해했다고 생각 합니다. 멋진 트릭입니다.
John Dvorak

1
필터와 사례 표준화를 반대로하여 3 개의 문자를 저장할 수 있습니다. a{소문자를 포함하려면 필터의 문자 목록에 추가 해야하지만을 사용하여 대문자를 사용할 수 있습니다 {32|}%. 최종 결과는{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
피터 테일러

필터에 또 다른 절약 효과가 있습니다. 계수 모듈로 2는 xor이므로 계산도 마찬가지 0"0:A[a{"@{>^}+/입니다.
피터 테일러

@PeterTaylor 곧 다른 최적화를하지 않으면 커뮤니티 위키로 전환해야 할 것입니다. 다시 감사합니다 :-)
John Dvorak

8

자바 스크립트, 53 자 :

(x=x.toLowerCase().match(/[a-z\d]/g))+""==x.reverse()

xPalindrome 이면 true로 평가되고 그렇지 않으면 false로 평가되는 Javascript 표현식입니다 . x문자열 이라고 가정 합니다. 이것이 보장되지 않으면 앞에 추가하십시오x+="",

여기 빵 부스러기가 있습니다. reverse()작동 방식 으로 인해

(x=x.toLowerCase().match(/[a-z\d]/g))==""+x.reverse()

실패합니다. 하나,

""+(x=x.toLowerCase().match(/[a-z\d]/g))==x.reverse()

완벽하게 괜찮습니다.


null 문자열을 연결하는 것이 좋습니다! 좋은 infoz에 대한 포인트!
Andrew Grey

3
힌트 : +""문자열로 캐스트, +숫자로 캐스트 |0~~정수로 캐스팅, !!부울에 캐스트.
John Dvorak

정규식으로 짧은 문자입니다/[^\W_]/g
SuperPrograman

7

제 66 화

w=grep("[a-z0-9]",strsplit(tolower(s),"")[[1]],v=T);all(w==rev(w))

용법:

f=function(s){w=grep("[a-z0-9]",strsplit(tolower(s),"")[[1]],v=T);all(w==rev(w))}

f("Eva, can I stab bats in a cave?")
[1] TRUE

7

배쉬 : 52 48 46 자

s=${1,,};s=${s//[^a-z0-9]};[ $s = `rev<<<$s` ]

이것은 첫 번째 매개 변수로 확인하기 위해 찌르는 소리를 내고 회 문의 경우 종료 코드를 0으로 설정하고 그렇지 않은 경우 1로 설정합니다.

샘플 실행 :

bash-4.2$ p() { s=${1,,};s=${s//[^a-z0-9]};[ $s = `rev<<<$s` ]; }

bash-4.2$ p 'Eva, can I stab bats in a cave?'; echo $?
0

bash-4.2$ p 'A man, a plan, a canal. Panama!'; echo $?
0

bash-4.2$ p "Madam, I'm Adam Corolla."; echo $?
1

bash-4.2$ p '757'; echo $?
0

bash-4.2$ p 'Boeing 757'; echo $?
1

bash-4.2$ p 'A man, a plan, a shovel, a canal. Panama!'; echo $?
1

bash-4.2$ p 'A_man,_a_plan, a_caremer, a canal:_Panama!'; echo $?
0

7

파이썬 2:49 (메소드 서명을 세지 않고)

def f(s):
 s=filter(str.isalnum,s.upper())
 return s==s[::-1]

입력과 출력을 포함한 완전한 프로그램은 74 자로 쓸 수 있습니다 .

import sys
s=filter(str.isalnum,sys.stdin.read().upper())
print s==s[::-1]

사용법 예 :

$echo 'Eva,can I stab bats in a cave?' | python palindrome.py
True 
$ cat huge_palindrome.txt | python palindrome.py
True
$echo 'Able was I ere i SaW elBa' | python palindrome.py                                                                   
True                                         

( huge_palindrome.txt포함 17,826 단어 회문를)

이 솔루션은 일부 문자를 추가하여 Python 3에 맞게 조정할 수 있습니다.

파이썬 3:55

def f(s):
 s=list(filter(str.isalnum,s.upper()))
 return s==s[::-1]

sys.stdin.read기본적으로 다음과 같습니다raw_input
CalculatorFeline

파이썬 3.8에서는 이것을 58 바이트로
MilkyWay90

또한 Python 2 & 3 솔루션은 각각 61 바이트와 67 바이트입니다.
MilkyWay90

@ MilkyWay90 메소드 서명을 세지 않고 는 놓쳤을 것입니다 . 2013 년에는 포함시키지 않는 것이 관례였습니다. 다른 언어로 된이 질문의 다른 솔루션에서는 단순히 그것을 생략하고 s변수에 입력이 있다고 가정했습니다 . 나는 완전한 정의를 제공하기로 결정했지만, 2013 년에 관례 적으로, 메소드 서명을 길이에 포함시키지 않았다
Bakuriu

@Bakuriu 아, 알겠습니다. 나는 몇 달 동안 여기에 있었기 때문에 2013 년부터 세관을 모른다
MilkyWay90

7

자바 (혹은 가장 장황한 언어) 102 96 95 자

s=s.replaceAll("\\W|_","");return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString());

사용법 (골프가없는 코드) :

static boolean q(String s) {
    s=s.replaceAll("\\W|_","");
    return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString());
}

public static void main(String[] args) {
    System.out.println(q("'A man, a plan, a canal - Panama!'"));
}

아래의 주석 작성자의 도움으로 단축


1
Java를 알지 못하지만 (나는 C # 녀석이지만 충분히 재미있다) if에 중괄호를 사용하여 1 문자를 저장할 수 없었습니까? 예 : if(s==null) return 1==0;? 또는 Java가 if명령문에 컬을 적용 합니까?
Andrew Gray

3
당신은 절대적으로 맞습니다. 감사합니다. !! 나는 그들이 거기에 있음을 알지 못했습니다. 저는 C #이 아닌 Java 개발자라고 생각합니까?
jsedano

4
1) 매개 변수가 null좋은 습관 인지 확인 하지만 CodeGolf에서는 연습하지 마십시오. 내가 알 수 있듯이, 아무도이 질문에서 그것을하지 않았습니다. 넘겨. 2) 논쟁 사이의 간격은 가독성을 높이지만 골프는 아닙니다. 그것을 제거하십시오; 3) 대신 명시 적으로의 toLowerCase()문자열을 사용 equalsIgnoreCase()나중에 대신 equals(). 이런 식으로 정규식을 조정해야하지만 여전히 1 문자가 짧습니다. pastebin.com/s7H84faj
manatwork

1
replaceAll("[^A-Za-z0-9]","")=>replaceAll("\\W","")
assylias

실제로 : 너무 replaceAll("\\W|_","");제거 _=> 95 자
assylias

7

매스 매 티카 54 53

CatsAreFluffy 덕분에 1 바이트가 절약되었습니다.

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

버전 10.2 이하인 경우 :

#==Reverse@#&@StringCases[ToUpperCase@#,WordCharacter]&

PalindromeQ@StringCases[ToUpperCase@#, WordCharacter]&["Eva,can I stab bats in a cave?"]

참된


PalindromeQ보다 1 바이트 더 짧은#==Reverse@#&
CalculatorFeline

나는 왜 그것을 보지 못했는지 궁금해했다. 버전 10.3!
DavidC

PalindromeQ= #==Reverse@#&
CalculatorFeline

예, 10.4 v 전을 다운로드하여 사용해보십시오.
DavidC

나갔어? OHNO
CalculatorFeline

6

J, 30 자

*/(=|.)tolower(#~'[^_\W]'rxE])

용법:

   */(=|.)tolower(#~'[^_\W]'rxE])'A man, a plan, a canal - Panama!'
1
   */(=|.)tolower(#~'[^_\W]'rxE])'Doc, note: I dissent. A fast never prevents a fatness. I diet on cod'
1

6

k ( 50 48 45 38 자)

모든 오류를 억제하고 기본값은 0b(false)를 반환합니다 .

{X~|X@:&(X:_:x)in 10h$(48+!10),97+!26}

예:

k){X~|X@:&(X:_:x)in 10h$(48+!10),97+!26} "Eva, can I stab bats in a cave?"
1b

편집 : 중간 변수를 피하여 3 문자를 더 면도했습니다. H / T, CS. -7 : 오류를 억제 할 필요가 없습니다.


1
불과 3 자 이상에서 그 흥미, 내 코드는 훨씬 더 읽기 :-)입니다
존 드보락

여분의 숯이 미끄러 져 들어갔습니다.
skeevey

5

루비 : 43 38 자

s=s.upcase.tr'^A-Z0-9','';s==s.reverse

샘플 실행 :

irb(main):001:0> p=->s{s=s.upcase.tr'^A-Z0-9','';s==s.reverse}
=> #<Proc:0x854592c@(irb):1 (lambda)>

irb(main):002:0> p['Eva, can I stab bats in a cave?']
=> true

irb(main):003:0> p['A man, a plan, a canal. Panama!']
=> true

irb(main):004:0> p["Madam, I'm Adam Corolla."]
=> false

irb(main):005:0> p['757']
=> true

irb(main):006:0> p['Boeing 757']
=> false

irb(main):007:0> p['A man, a plan, a shovel, a canal. Panama!']
=> false

irb(main):009:0> p['A_man,_a_plan, a_caremer, a canal:_Panama!']
=> true

1
당신은 쓸 수 있습니다s.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard

남자, 내가 방법을 사용하는 데 얼마나 오래 걸렸 !습니까! 당신은 당신의 트릭으로 @Howard 날 놀라게 유지합니다.
manatwork

작은 문제이지만, @Howard. trtr!: 그들은 음역에 아무것도없는 경우 다른 행동을 보인다 pastebin.com/4YThW2qN 차종 p['757']NoMethodError "로 충돌 테스트를! 정의되지 않은 메서드를`upcase을 ' nil : NilClass”오류입니다.
manatwork

앗 미안 해요. 그 사건에 대해서는 생각하지 않았습니다.
Howard

1
s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu

5

C ++, 107 (실패), 100 (실패), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • ASCII 비트 패턴을 이용합니다.
  • 악에 의지한다 using namespace std;.
  • 논리 연산자 대신 비트 AND 및 OR을 사용합니다.
  • 또는 int보다 짧기 때문에 사용합니다 .charauto

    #include <string>
    using namespace std;
    
    bool IsPalindrome(const string & t) {
    string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
    }
    
    #include <cassert>
    
    int main() {
        assert(!IsPalindrome("gorilla"));  // simple failure
        assert( IsPalindrome("racecar"));  // simple success
        assert( IsPalindrome("Hannah"));   // case blind
        assert(!IsPalindrome("1999"));     // digit failure
        assert( IsPalindrome("2002"));     // digit success
        // Ignore spacing, punctuation, and case:
        assert( IsPalindrome(" \t09AZ/:@[`{za90"));  // boundaries
        assert( IsPalindrome("A man, a plan, a canal: Panama."));
        assert( IsPalindrome("Eva, can I stab bats in a cave?"));
        assert( IsPalindrome(""));  // empty string
        return 0;
    }
    

4

루아, 56

a=io.read"*l":lower():gsub("%W","")print(a:reverse()==a)

경우 %W이런 건입니다 \W밑줄과 같은 정규 표현식에서, 그것은 또한 제외 문자. 이것은 원치 않는 것입니다.
John Dvorak

내가 확인, %w포함하지 않습니다 _( %W명확히 포함)
mniip

1
함수 본문 만 필요합니다. s=s:lower():gsub('%W','')return s:reverse()==s 46 문자
Egor Skriptunoff

하지만 function(s)
어쩌면

4

파이썬 3/2 59 문자 :

def pld(i):
   p=[c for c in i.lower() if c.isalnum()]
   return(p == p[::-1])

4

하스켈, 43

표준 라이브러리를 사용하여 Control.Monad, Control.Monad.InstancesData.Char:

ap(==)reverse.map toLower.filter isAlphaNum

나는 이것을 ghci에서 작동시킬 수 없다. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNum공백을 추가하거나 그런 식으로하지도 않습니다. 죄송합니다. Haskell에 관심이 없습니다 :)
SlimJim

1
@SlimJim : 죄송합니다 Control.Monad.Instances. (와 함께 Reader 모나드 인스턴스를 사용 ap하고 있지만 해당 인스턴스는에서 내 보내지 않습니다 Control.Monad.)
Jon Purdy

4

PHP 60 자

먼저 codegolf를 사용해보십시오.

//thank you manatwork
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x); 

예:

$c='Eva, can I stab bats in a cave?';
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
//prints 1

삼항 연산자의 첫 번째 피연산자 주위의 괄호는 필요하지 않습니다. 실제로 삼항 연산자는 필요하지 않습니다. 언어 표현에서 true 또는 false 만 출력하십시오. 그리고 $ x 1에 할당하는 별도의 진술을 피함으로써 더 많은 문자를 줄일 수 있습니다 echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
manatwork

3

파이썬 2 64 문자 :

i =''.join(re.findall('[a-z0-9]+',i.lower()))
return i==i[::-1]

@manatwork 모든 식별자를 하나의 문자 식별자로 바꾸면 77문자 버전 을 얻습니다 . abhiram이 왜 ungolfed 버전을 게시했는지 전혀 모릅니다.
Bakuriu

@Bakuriu, 신경 쓰지 마라. 나는 질문에서 한 가지 진술을 놓쳤다.“메소드 본문 만 필요하다.” 2 행과 3 행은 73 자만 제공합니다. 추가 길이 감소와 관련하여 원시 문자열 및 캡처 그룹이 필요하지 않으므로 re.findall('[a-z0-9]+',input.lower())파트 3 문자가 더 짧아집니다.
manatwork

@manatwork, 게시물을 편집하고 변수를 약간 변경했습니다. 그것은 66으로 떨어졌습니다. 그렇습니다. 원시 문자열 속성은 여기에서 사용되지 않습니다.
abhiram

하지만 정규식에서 캡처 그룹을 고집하는 이유는 무엇입니까? 없이 제대로 작동 : pastebin.com/JzpNRRZU
manatwork

나는 최근 re 's :) 관련 파이썬 프로젝트 후에 나에게 붙잡힌 것 같아서 지적 해 주셔서 감사합니다.
abhiram

3

하스켈 48

(\x->x==reverse x).map toLower.filter isAlphaNum

이처럼 사용 :

(\x->x==reverse x).map toLower.filter isAlphaNum$"Eva, can I stab bats in a cave?"

3

탭이있는 기존 형식을 사용하는 스몰 토크 , 스 que 크 / 파로 맛
116

문자열에 두 가지 방법을 추가합니다.

selffles
    ^self = self reverse
isPalindrome
    ^(self asUppercase asDecomposedUnicode select: #isAlphaNumeric) selffles

물론 일부 공백을 제거하거나 더 짧은 메소드 이름을 사용할 수 있지만 스몰 토크의 정신을 배신하지 마십시오.

또한 http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais 와 같이 프랑스어 회문을 처리하므로이 페이지의 답변은 많지 않습니다.

['Léon a trop par rapport à Noël' isPalindrome] assert.

영리하고 유용한 답변!
Andrew Grey

3

파이썬 3 (51 자)

파이썬 2 일 수 있습니다.

abhiram 솔루션 기반 (보다 공격적인 골프)

from re import findall

def palindrome(i):
 i=findall('[a-z\d]',i.lower())
 return i==i[::-1]

print(palindrome(input('Phrase: ')))

RE '\ w'를 사용하여 46 자로 단축 될 수 있습니다.

함수 본문이 매우 단축 된 변형 (27 자)

import re
l=str.lower
f=re.compile('[a-z\d]').findall

def palindrome(i):i=f(l(i));return i==i[::-1]

print(palindrome(input('Phrase: ')))

2

Windows PowerShell, 56 47 45 자

업데이트 (댓글 참조)하고 정규 표현식 주위에 괄호를 제거 할 수 있습니다.

($s=$s-replace'\W')-eq(-join$s[$s.length..0])

원본 (56)

$s=$s-replace'[^\w]','';$s-eq($s[-1..-$s.length]-join'')

원래 언 골프 :

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev

당신은 이것을 다음과 같이 47 문자까지 골프 수 있습니다 :($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD

@ 철자 : 니스! 개선을위한 코드 골프를
처음 접했습니다.

오른쪽 괄호를 제거 할 수도 있습니다 ($s=$s-replace'\W')-eq-join$s[$s.length..0]..
mazzy

2

C ++, 74 바이트

이 코드는 실제로 매우 우아하고 이해하기 쉽습니다 (올바르게 포맷 된 경우). C ++에서 더 짧아 질 수는 없으며 표준 라이브러리 함수를 사용하지 않습니다.

p(auto c){auto e=c;while(*e)++e;--e;while(*e==*c&e>c)--e,++c;return e<=c;}

사용법 예 :

p("Hello"); //Outputs 0
p(""); //Outputs 1
p("a"); //Outputs 1
p("HellolleH"); //Outputs 1

멋진 형식의 버전 :

p(auto c)
{
    auto e=c;
    while(*e) ++e;
    --e;
    while(*e==*c & e>c)--e,++c;
    return e<=c;
}

1
error: ISO C++ forbids declaration of ‘p’ with no type함수는 리턴 타입을 가져야합니다.
Karl Napf

대소 문자, 공백 및 제어 문자를 무시하지 않는 것이 좋습니다.
Titus

while(*++e);대신에 문자를 저장할 수 있습니다 while(*e)++e;. 그러나 디도서에서 언급했듯이이 답변은 유효하지 않습니다.
Nick Matteo

2

PHP, 26 84 80 78 62 63 바이트

<?=strrev($s=strtolower(preg_replace("#\W#","",$argv[1])))==$s;

첫 번째 명령 행 인수에서 입력을받습니다. 인쇄 1truthy를 들어, falsy 빈 문자열입니다.


strrev(18 바이트;로 실행 -r)에 대한 멀티 바이트 대안이 없기 때문에 I18n은 매우 광범위합니다 .

preg_match_all("#.#us",$s=strtolower(preg_replace("#\W#u","",$argv[1])),$m);echo$s==join(array_reverse($m[0]);

utf8_strrev 는 PHP 매뉴얼에서 훔친 것 입니다. 이 블로그 게시물을 살펴볼 수도 있습니다 .


타이터스로 오세요 ... 사양에 실패했습니다.
Christoph

1
@ 크리스토프 그래, 나는 때때로 그것을 완전히 읽어야한다. 결정된.
Titus

-R문자열 테스트에서 줄 바꿈 문제가 발생하지 않습니까? "-R <code> 스펙에서 모든 입력 라인에 대해 PHP <code>를 실행하십시오". 또한 <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;더 짧을 것입니다.
Christoph

1
@Christoph 멋진 아이디어,하지만 존재하지 $argn않고 -R.
Titus

$argv[1]="O Genie, der Herr ehre dein Ego!"; # :D
Titus

1

루비, 48

p((g=gets.upcase.gsub /[^A-Z\d]/,'')==g.reverse)

아주 간단하고 성급하게 너무 많은 골프를하지 않았다. 나중에 골프를하겠습니다.


1

Pylongolf2 , 24 바이트

c╨2"[^a-zA-Z]"-_╨1=~

c╨2소문자로 변환하기 위해 입력을받습니다 .
그런 다음 정규 표현식을 스택에 푸시 -하고 입력에서 알파벳이 아닌 모든 문자를 제거 하는 데 사용 합니다.
_입력을 복제합니다.
╨1그것을 뒤집은 =다음 비교합니다.
~인쇄 중 어느 단부에서 스택 인쇄 true또는 false.


구두점, 공백 및 제어 문자를 무시합니까?
MickyT

내 나쁜,이 버전은하지 않습니다. 내가 고칠 게

문제를 해결했습니다.

1

PowerShell, 194190 바이트

명명되지 않은 PowerShell 스크립트 블록이 자신을 호출하는 방법을 보여주기위한 재귀 구현입니다.

$P={param([string]$s)$s=($s-replace'[^a-z]').tolower();if(!$s){return $true};if($s.length-lt4){return $s[0]-eq$s[-1]};$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))}

언 골프 :

$P={
param([string]$s)
$s=($s-replace'[^a-z]').tolower();
if(!$s){return $true};
if($s.length-lt4){return $s[0]-eq$s[-1]};
$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))
}

테스트 :

&$P "Eva, can I stab bats in a cave?"
&$P "Eva, can I stab cats in a cave?"
&$P "A man, a plan, a canal. Panama!"
&$P "A man, a plan, a big shovel, a canal. Panama!"
&$P "Madam, I'm Adam."
&$P "Madam, I'm Adam Corolla."
&$P "757"
&$P "Boeing 757"

그럴까요 [^a-z0-9]?
Titus

1

05AB1E , 4 바이트 (비경쟁)

언어가 도전 과제를 게시하기 때문에 비경쟁 . 암호:

álÂQ

설명:

á     # Only keep the alphabetic characters.
 l    # Lowercase the characters.
  Â   # Bifurcate, which duplicates the letters and reverses the duplicate.
   Q  # Check if they are equal.

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .


링크를 통해 실행하려고했습니다. 프로그램 출력은 "1"입니다.
Christopher Perry

1

젤리, 10 자 (비경쟁)

fØBŒl
UÇ⁼Ç

참이면 1, 거짓이면 0을 반환

온라인으로 사용해보십시오!


대소 문자, 공백 및 제어 문자를 무시합니까? 고장이 좋을 것입니다.
Titus

젤리의 현재 상태는 7 바이트로이 해결 가능 : fØBŒlŒḂ: f필터 유지 ØB세트 [A-ZA-Z0-9]와 Œl다음 소문자로 변환을 ŒḂ회문 경우 시험.
steenbergh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.