Mã ngắn nhất để xác định xem một chuỗi có phải là một palindrom không


42

Một palindrom là một số chuỗi được đánh vần theo cùng một cách cả ngược và xuôi. Chẳng hạn, 'Eva, tôi có thể đâm dơi trong hang không?' là một bảng màu (EVACANISTAB | BATSINACAVE)

Đối với môn đánh gôn này, sử dụng ngôn ngữ bạn chọn, xác định xem một chuỗi đã cho có phải là một bảng màu hay không.

Vỏ cạnh:

  • Dấu câu không được tính vào sự nhạt nhẽo.
  • Nhân vật điều khiển không được tính vào sự nhạt nhẽo.
  • Khoảng trắng không được tính vào sự nhạt nhẽo.
  • Số được tính vào palindrominess.
  • Trường hợp trong thử thách này không được tính vào sự nhạt nhẽo.
  • Không có giới hạn về độ dài của chuỗi để đánh giá, ngoại trừ những gì được áp đặt bởi ngôn ngữ bạn chọn.
  • Đối với thử thách này, hãy giới hạn bản thân trong bộ ký tự ASCII.

Yêu cầu kỹ thuật:

  • Chỉ có cơ thể phương pháp là cần thiết; những thứ bổ sung như chữ ký phương thức, khai báo cấu trúc dữ liệu, v.v. không được tính vào yêu cầu chiến thắng.
  • Mã phải biên dịch hoặc giải thích mà không có lỗi thời gian biên dịch hoặc ngoại lệ.
  • Mã không được ném bất kỳ trường hợp ngoại lệ chưa xử lý hoặc sụp đổ. (Hầu như không cần phải nói. Hầu như.)
  • Mã phải trả về một số giá trị cho thấy sự nhạt nhẽo. Kiểu dữ liệu tùy thuộc vào ngôn ngữ bạn sử dụng (ví dụ: người dùng C # có thể sử dụng a bool, trong khi người dùng JavaScript có thể sử dụng a var.)
  • Bạn không được viết trình thông dịch riêng để thực hiện nhiệm vụ này như một khả năng 'bản địa' để bạn có thể 'đánh gôn' một số điểm gần chiến thắng. (Hy vọng không cần phải nói.)

Điều kiện chiến thắng:

  • Mã ngắn nhất trong các ký tự chiến thắng.

Nhà lãnh đạo hiện tại: tmartin (k, 25 ký tự)

... Muốn có dấu kiểm màu xanh kỳ diệu bằng câu trả lời của bạn ? Đánh bại câu trả lời của anh chàng này!


1
Là I / O là một phần của thử thách, hay một cơ quan chức năng sẽ làm gì?
John Dvorak

1
"Bánh mì" cho thấy cách thức tinh chỉnh tác phẩm có sẵn trên toàn bộ trang web trong tất cả các câu trả lời thông qua lịch sử sửa đổi. Không cần phải có một lịch sử đầy đủ hiển thị trong phiên bản hiện tại của câu trả lời.
Peter Taylor

1
@WernerCD Tôi chắc chắn OP sẽ thay đổi người được đánh dấu xanh khi anh ấy quay lại để kiểm tra các phản hồi mới.
Gareth

2
Không chỉ định một ngôn ngữ thực sự tầm thường thách thức này đối với tôi. Như được thấy dưới đây, các ngôn ngữ được giải thích tập trung vào các chức năng thao tác văn bản bậc cao luôn nhận được kết quả ngắn nhất. Điều gì ngăn cản tôi kết hợp trình thông dịch của riêng mình với một hàm duy nhất, ip (). Thuật toán cạnh tranh của tôi bây giờ là 'ip: i'. 4 ký tự. làm xong.
Gusdor

3
@Gusdor thấy J và GolfScript thu hút mọi sự thích thú từ Code GolfLanguage Handicap và các câu hỏi liên quan trên meta của trang web này.
AakashM

Câu trả lời:


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

Trông giống như một hỗn hợp của Q và k: P
skeevey

Chà, tôi sẽ không gọi chính xác .QA vv q. Chúng chỉ là các hàm bao chuỗi, không có mã k thực sự bên dưới chúng. Bây giờ, nếu tôi nói .q.inter tôi sẽ gặp rắc rối.
tmartin

Tôi đoán đó là một trường hợp ngụy biện về ngữ nghĩa nhưng chúng được định nghĩa trong qk
skeevey

Chỉ có thể nói Q cho 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

Tôi biết điều này rất cũ nhưng ... bạn có thể lưu 1 byte với {#|:\_x@&x in,/.Q`a`A`n}, trong đó 1 là đúng và 2 là sai
nguệch ngoạc

24

Perl, 26 char

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

Đánh giá thành 1 khi $_là một palindrom, ""(một trong những giá trị sai của Perl) khi nó không.

Sử dụng mẫu:

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__

đầu ra:

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

Chết tiệt, bạn đánh tôi với nó. Mặc dù điều này sẽ không hoạt động đúng nếu có một _chuỗi trong nó? Và nó không nhận bất kỳ đầu vào nào nên bạn sẽ không cần sử dụng -ptùy chọn chứ?
Gareth

\Wtrong regexes không bao gồm gạch dưới. Tôi sợ bạn sẽ cần [^a-z\d]trong regex của bạn. Tôi sợ rằng tôi đã bị đánh bại.
John Dvorak

3
Lưu một với _|\Wthay vì [_\W].
Howard

1
Bạn có thể rút ngắn _|\Wthành \Pl: ideone.com/0ufdaQ . Chỉ nên là các chữ cái Unicode.
Kobi

Trên thực tế, suy nghĩ lại - \Plsẽ không khớp với các chữ số, vì vậy tôi đoán _|\Wlà điều tốt nhất bạn có thể làm.
Kobi

18

Chỉ C # 82 :)

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

Không thể cưỡng lại sự cám dỗ của việc viết một chương trình không có bản tóm tắt bằng ngôn ngữ yêu thích của tôi.

Một bài kiểm tra có sẵn ở đây: http://ideone.com/8bwz7z


Đơn giản ... nhưng thanh lịch!
Andrew Gray

@AndrewGray cảm ơn bạn đã bình luận và cho các Yêu cầu kỹ thuật cho phép. C # nồi hơi bổ sung nghiêm túc vào số char, làm cho nó không thực tế cho golf.
Cristian Lupascu

2
Không thành vẫn đề. Tôi là đồng nghiệp C # dev và tôi thích viết mã ngắn gọn, hiệu quả. Thật xấu hổ khi có quá nhiều ngôn ngữ sôi nổi trong ngôn ngữ ...
Andrew Gray

13

GolfScript, 36 34 31 30 ký tự

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

Thuật toán tương tự với giải pháp (Javascript) trước đây của tôi .

0"0:A[a{"@{>^}+/- Tối ưu hóa bởi Peter Taylor và Howard. Phiên bản của tôi là "/9@Z"{1$<},,2%\;. Howard đã quyên góp chức năng và Peter Taylor đã tặng XOR cho modulo-2. Về cơ bản, đây là một phương pháp chung để so sánh nếu giá trị nằm trong một chuỗi các phạm vi.

{.96>32*-}%(11 ký tự) không thực sự là một cải tiến so với Javascript .toUpperCase()(14 ký tự), đặc biệt là vì nó có một số dấu câu lạ xuất hiện ztrong bảng ASCII (không quan trọng ở đây).

tuy nhiên, như Peter Taylor đã đề xuất, tuy nhiên, nếu chúng ta lọc ra chữ và số trước tiên, chúng ta có thể chuyển đổi thành chữ thường và chữ số chỉ bằng cách đặt một bit trong mỗi ký tự: {32|}

.-1%=không nâng tất cả các palindromic nặng. Một phần tôi không thực sự thích là tôi mất bao lâu để tìm ra cách đảo ngược một mảng. Tôi nên đọc tài liệu. Hai nhân vật khác thực hiện quản lý ngăn xếp và so sánh.

Kiểm tra: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7IjA6QVtheyJcez59Kyws9


Hơn nữa, nếu tôi có thể giả sử rằng không có ký tự điều khiển nào sau đây: (Thoát liên kết dữ liệu, điều khiển thiết bị 1-4, xác nhận tiêu cực, nhàn rỗi đồng bộ, kết thúc khối truyền, hủy, kết thúc phương tiện) (tất cả chúng ta đều đồng ý tất cả đều tối nghĩa) hoặc nếu tôi có thể coi chúng là phiên bản chữ hoa của các chữ số 0-9, chúng ta có thể lưu hai ký tự khác:

GolfScript, 28 ký tự

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

Kiểm tra: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7IK7


2
Bạn có thể thoát khỏi việc dọn dẹp và lưu hai ký tự:{"0:A["\{>}+,,2%},
Howard

@ Xin cảm ơn. Tôi nghĩ rằng tôi đã hiểu lầm +về các khối. Đó là một mẹo hay.
John Dvorak

1
Bạn có thể lưu ba ký tự bằng cách đảo ngược bộ lọc và tiêu chuẩn hóa trường hợp. Bạn phải thêm a{vào danh sách các ký tự của bộ lọc để bao gồm các chữ cái viết thường, nhưng sau đó bạn có thể viết hoa bằng chữ thường {32|}%. Kết quả cuối cùng là{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor

Ngoài ra còn có một tiết kiệm được thực hiện trên bộ lọc. Đếm modulo 2 là xor, 0"0:A[a{"@{>^}+/công việc cũng vậy.
Peter Taylor

@PeterTaylor Nếu tôi không sớm đưa ra một tối ưu hóa khác, có lẽ tôi nên chuyển đổi sang wiki cộng đồng. Cảm ơn một lần nữa :-)
John Dvorak

8

Javascript, 53 ký tự:

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

là một biểu thức javascript đánh giá là đúng nếu xlà một bảng màu, thành sai nếu không. Nó giả sử xlà một chuỗi. Nếu điều đó không được đảm bảo, hãy trả trướcx+="",

Đây là một mẩu bánh mì: Do cách thức reverse()hoạt động,

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

thất bại Tuy nhiên,

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

là hoàn toàn tốt


Tidbit đẹp về nối chuỗi null! Điểm cho thông tin tốt!
Andrew Gray

3
Gợi ý: +""chuyển thành chuỗi, +chuyển thành số |0~~ chuyển thành một số nguyên, !!chuyển thành một boolean.
John Dvorak

Là một char ngắn hơn với regex/[^\W_]/g
SuperPrograman

7

R: 66

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

Sử dụng:

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

Bash: 52 48 46 ký tự

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

Cái này lấy sting để kiểm tra làm tham số đầu tiên và đặt mã thoát thành 0 cho palindrom và 1 cho không.

Chạy mẫu:

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

Con trăn 2: 49 (không tính chữ ký phương thức)

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

Một chương trình hoàn chỉnh, với đầu vào và đầu ra có thể được ghi vào 74 ký tự.

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

Ví dụ sử dụng:

$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 Chứa này palindrome 17.826 từ)

Giải pháp này có thể được điều chỉnh cho python 3 thêm một số ký tự:

Con trăn 3: 55

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

sys.stdin.readvề cơ bản giống nhưraw_input
CalculatorFeline

Trong Python 3.8, bạn có thể rút ngắn điều này xuống còn 58 byte
MilkyWay90

Ngoài ra, giải pháp Python 2 & 3 của bạn lần lượt là 61 byte và 67 byte.
MilkyWay90

@ MilkyWay90 Bạn có thể đã bỏ lỡ mà không tính chữ ký phương thức . Trong năm 2013, theo thông lệ, không bao gồm nó. Trong giải pháp khác trong câu hỏi này bằng các ngôn ngữ khác, họ chỉ cần bỏ qua nó và cho rằng bạn có đầu vào trong một sbiến. Tôi đã quyết định cung cấp định nghĩa đầy đủ nhưng, theo thông lệ vào năm 2013, không bao gồm chữ ký phương thức theo chiều dài
Bakuriu

@Bakuriu À, tôi hiểu rồi. Tôi mới đến đây được vài tháng, vì vậy tôi không biết hải quan từ năm 2013
MilkyWay90

7

JAVA (hoặc ngôn ngữ dài dòng nhất từng có), 102 96 95 char

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

Cách sử dụng (với mã không mã hóa):

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!'"));
}

Rút ngắn với sự giúp đỡ của người bình luận bên dưới


1
Mặc dù tôi không biết Java (Tôi là một chàng trai C #, đủ hài hước), nhưng bạn không thể lưu 1 ký tự bằng cách lấy ra các dấu ngoặc nhọn trên if? VẬY : if(s==null) return 1==0;? Hay Java thực thi các curlies trên các ifcâu lệnh?
Andrew Gray

3
Bạn hoàn toàn đúng, tôi đã lấy đó ra cảm ơn bạn !! ... Tôi không nhận thấy họ ở đó, tôi đoán tôi là một nhà phát triển Java không phải C #?
jsedano

4
1) Kiểm tra xem tham số có phải nulllà thói quen tốt không, nhưng không được thực hành trong CodeGolf. Như tôi có thể nói, không ai khác làm điều đó trong câu hỏi này. Bỏ qua nó. 2) Không gian giữa các đối số giúp dễ đọc, nhưng không chơi gôn. Loại bỏ nó; 3) Thay vì rõ ràng toLowerCase()chuỗi sử dụng equalsIgnoreCase()sau thay vì equals(). Bằng cách này, bạn phải điều chỉnh biểu thức chính quy, nhưng vẫn ngắn hơn 1 ký tự. pastebin.com/s7H84faj
manatwork

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

Trên thực tế: replaceAll("\\W|_","");để xóa _quá => 95 ký tự
assylias

7

Toán học 54 53

Một byte được lưu nhờ vào CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Đối với những người có phiên bản 10.2 trở về trước:

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

Thí dụ

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

Thật


PalindromeQngắn hơn 1 byte so với#==Reverse@#&
CalculatorFeline

Tôi tự hỏi tại sao tôi chưa bao giờ nhìn thấy nó. Phiên bản 10.3!
DavidC

PalindromeQ= #==Reverse@#&
Máy

Có, tôi đã tải xuống phiên bản 10,4 để dùng thử.
DavidC

Đó là ra? OHNO
Máy

6

J, 30 ký tự

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

Sử dụng:

   */(=|.)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 ký tự)

Loại bỏ tất cả các lỗi, trả về mặc định là 0b(false).

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

Thí dụ:

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

chỉnh sửa: cạo thêm ba ký tự bằng cách tránh biến trung gian. H / T, CS. -7: Không cần phải loại bỏ lỗi.


1
thú vị là chỉ với 3 ký tự, mã của tôi dễ đọc hơn nhiều :-)
John Dvorak

Một char thêm trượt vào, tôi đã gỡ bỏ nó.
hoài nghi

5

Ruby: 43 38 ký tự

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

Chạy mẫu:

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
Bạn thậm chí có thể viếts.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard

Man, bao lâu tôi kết hợp xung quanh việc sử dụng các !phương pháp! Bạn giữ tôi tuyệt vời @Howard với thủ đoạn của bạn.
manatwork

Vấn đề nhỏ, @Howard. trtr!dường như hành xử khác nhau khi chúng không có gì để chuyển ngữ: pastebin.com/4YThW2qN Điều đó làm cho p['757']thử nghiệm gặp sự cố với xông NoMethodError: phương pháp không xác định `upcase! ' cho nil: lỗi NilClass.
manatwork

Ối xin lỗi. Không nghĩ về trường hợp đó.
Howard

1
có thể rút ngắn hơn nữa:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu

5

C ++ 107 (bị sảy thai), 100 (bị sảy thai), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Khai thác các mẫu bit ASCII.
  • Dựa vào một điều ác using namespace std;.
  • Sử dụng bitwise AND và OR thay vì các toán tử logic.
  • Sử dụng intvì nó ngắn hơn charhoặc auto.

    #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

Lua, 56

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

Nếu %Wlà bất cứ điều gì giống như \Wtrong regex, nó cũng loại trừ các ký tự như dấu gạch dưới. Điều này là không mong muốn.
John Dvorak

tôi đã kiểm tra, %wkhông bao gồm _( %Wrõ ràng bao gồm nó, sau đó)
mniip

1
Chỉ có cơ thể chức năng là cần thiết. s=s:lower():gsub('%W','')return s:reverse()==s 46 ký tự
Egor Skriptunoff

nhưng những gì vềfunction(s)
mniip

4

Python 3/2 59 ký tự:

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

4

Haskell, 43

Sử dụng các thư viện chuẩn Control.Monad, Control.Monad.InstancesData.Char:

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

Tôi không thể làm điều này để làm việc trong ghci. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumcũng không phải với việc thêm dấu cách hay như vậy, xin lỗi tôi không quá quan tâm đến Haskell :)
SlimJim

1
@SlimJim: Rất tiếc, bạn cũng cần Control.Monad.Instances. (Tôi đang sử dụng phiên bản đơn nguyên Reader với ap, nhưng phiên bản đó không được xuất bởi Control.Monad.)
Jon Purdy

4

PHP 60 ký tự.

Đầu tiên hãy thử trên codegolf.

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

Thí dụ:

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

Dấu ngoặc quanh toán hạng đầu tiên của toán tử ternary là không cần thiết. Trên thực tế, không cần toán tử ternary - chỉ xuất ra đúng hoặc sai trong biểu diễn ngôn ngữ của bạn. Và bằng cách tránh câu lệnh riêng cho phép gán thành $ x 1 ký tự nữa có thể được rút ngắn : echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
manatwork

3

Python 2 64 Charecters:

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

@manatwork Nếu bạn thay thế tất cả các mã định danh bằng một mã định danh ký tự, bạn sẽ có được một 77phiên bản ký tự. Không biết tại sao abhiram đăng phiên bản không có người mặc dù.
Bakuriu

@Bakuriu, đừng bận tâm, tôi đã bỏ lỡ một câu trong câu hỏi: Chỉ có các cơ quan phương pháp là cần thiết. Mặc dù dòng 2 và 3 chỉ cho tôi 73 ký tự. Về việc giảm độ dài hơn nữa, không cần chuỗi thô và nhóm chụp, làm cho re.findall('[a-z0-9]+',input.lower())phần 3 ký tự ngắn hơn.
manatwork

@manatwork, tôi đã chỉnh sửa bài đăng và thay đổi các biến một chút. Điều đó đã đưa nó xuống 66. Có, thuộc tính chuỗi thô không được sử dụng ở đây.
abhiram

Ok, nhưng tại sao bạn nhấn mạnh vào nhóm bắt giữ trong biểu thức chính quy? Hoạt động chính xác mà không cần: pastebin.com/JzpNRRZU
manatwork

Tôi nghĩ rằng nó đã bắt kịp với tôi sau dự án python gần đây của tôi liên quan đến re :) Cảm ơn vì đã chỉ ra nó.
abhiram

3

Haskell 48

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

được sử dụng như thế này:

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

3

Smalltalk , Squeak / Pharo hương vị
116 chars sử dụng định dạng truyền thống với các tab

Bạn thêm hai phương thức vào Chuỗi:

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

Tất nhiên chúng ta có thể loại bỏ một số khoảng trắng hoặc sử dụng tên phương thức ngắn hơn, nhưng chúng ta đừng phản bội tinh thần của Smalltalk.

Hơn nữa, điều này sẽ xử lý các palindromes của Pháp, như trong http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais , không nhiều câu trả lời trong trang này có thể.

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

Câu trả lời thông minh và hữu ích!
Andrew Gray

3

Python 3 (51 char)

và có thể là Python 2

dựa trên giải pháp abhiram (với việc chơi golf căng thẳng hơn)

from re import findall

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

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

có thể rút ngắn xuống còn 46 ký tự, sử dụng RE '\ w'

và biến thể với cơ thể chức năng cực ngắn (27 ký tự)

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 ký tự

Đã cập nhật (xem bình luận) và có thể xóa dấu ngoặc quanh biểu thức chính quy:

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

Bản gốc (56)

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

Un-golfed gốc:

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

Bạn có thể đánh gôn xuống tới 47 ký tự như thế này:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD

@SpellingD: Hay đấy! Tôi mới chơi golf mã, cảm ơn vì sự cải tiến
goric

bạn cũng có thể xóa dấu ngoặc đơn bên phải : ($s=$s-replace'\W')-eq-join$s[$s.length..0].
mê mẩn

2

C ++, 74 byte

Mã này thực sự rất thanh lịch và dễ hiểu (khi được định dạng chính xác). Tôi không tin rằng có thể rút ngắn hơn trong C ++ và nó không sử dụng bất kỳ chức năng thư viện tiêu chuẩn nào.

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

Ví dụ sử dụng:

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

Phiên bản được định dạng chính xác:

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 typechức năng của bạn nên có một kiểu trả về.
Karl Napf

Tôi cá rằng điều này không bỏ qua trường hợp, khoảng trắng và ký tự điều khiển.
Tít

Bạn có thể lưu một nhân vật với while(*++e);thay vì while(*e)++e;. Nhưng như Titus đã đề cập câu trả lời này là không hợp lệ.
Nick Matteo

2

PHP, 26 84 80 78 62 63 byte

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

lấy đầu vào từ đối số dòng lệnh đầu tiên; in 1cho sự thật, chuỗi trống cho giả.


I18n là một mở rộng nhỏ, vì không có sự thay thế đa bào cho strrev(110 byte; chạy với -r):

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

utf8_strrev bị đánh cắp một cách trắng trợn từ hướng dẫn PHP . Bạn cũng có thể muốn xem bài viết trên blog này .


Thôi nào Titus ... Điều này không thành công.
Christoph

1
@Christoph Vâng đôi khi tôi nên đọc đầy đủ điều đó. Đã sửa.
Tít

Hừm -Rsẽ gây ra vấn đề với ngắt dòng trong chuỗi để kiểm tra phải không? Từ thông số kỹ thuật "-R <code> Chạy PHP <code> cho mọi dòng đầu vào". Hơn nữa <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;sẽ ngắn hơn.
Christoph

1
@Christoph Ý tưởng hay, nhưng không $argn-R.
Tít

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

1

Ruby, 48

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

Khá đơn giản, và vội vàng thực hiện để không chơi golf quá nhiều. Tôi sẽ đánh gôn nó muộn hơn.


1

Pylongolf2 , 24 byte

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

clấy đầu vào, ╨2để chuyển đổi sang chữ thường
Sau đó tôi đẩy regex lên ngăn xếp và sử dụng -để loại bỏ tất cả các ký tự không theo thứ tự chữ cái trong đầu vào.
_nhân đôi đầu vào.
╨1đảo ngược nó và =sau đó so sánh chúng.
~in ngăn xếp cuối cùng mà in truehoặc false.


Điều này có bỏ qua các dấu chấm câu, khoảng trắng và ký tự điều khiển không?
MickyT

Xấu của tôi, phiên bản này thì không. Tôi sẽ sửa nó.

Đã khắc phục sự cố.

1

PowerShell, 194 190 byte

Việc triển khai đệ quy để hiển thị cách tập lệnh kịch bản PowerShell chưa được đặt tên có thể tự gọi.

$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]))}

vô dụng:

$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]))
}

kiểm tra:

&$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"

Có nên [^a-z0-9]hay không?
Tít

1

05AB1E , 4 byte (không cạnh tranh)

Không cạnh tranh , vì ngôn ngữ hoãn thách thức. Mã số:

álÂQ

Giải trình:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


Đã thử chạy nó qua liên kết của bạn. Đầu ra của chương trình là "1"
Christopher Perry

1

Jelly, 10 nhân vật (Không cạnh tranh)

fØBŒl
UÇ⁼Ç

Trả về 1 nếu đúng, 0 nếu sai

Hãy thử trực tuyến!


Nó bỏ qua trường hợp, khoảng trắng và ký tự điều khiển? Một sự cố sẽ tốt đẹp.
Tít

Trạng thái hiện tại của Jelly cho phép để giải quyết này trong 7 byte: fØBŒlŒḂ: fbộ lọc để giữ ØBcác thiết lập [a-zA-Z0-9] và Œlchuyển đổi sang chữ thường, sau đó ŒḂkiểm tra nếu palindrome.
steenbergh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.