Kode terpendek untuk menentukan apakah string adalah palindrome


42

Sebuah palindrom beberapa string yang dieja dengan cara yang sama baik belakang dan ke depan. Misalnya, 'Eva, bisakah aku menusuk kelelawar di gua?' adalah palindrome (EVACANISTAB | BATSINACAVE)

Untuk golf kode ini, menggunakan bahasa pilihan Anda, tentukan apakah string yang diberikan adalah palindrom atau tidak.

Kasus tepi:

  • Tanda baca tidak diperhitungkan sebagai palindrominess.
  • Karakter kontrol tidak diperhitungkan dalam palindrominess.
  • Spasi tidak diperhitungkan dalam palindrominess.
  • Angka dihitung menuju palindrominess.
  • Kasus dalam tantangan ini tidak diperhitungkan sebagai palindrominess.
  • Tidak ada batasan untuk panjang string untuk mengevaluasi, kecuali untuk apa yang dipaksakan oleh bahasa pilihan Anda.
  • Untuk tantangan ini, batasi diri Anda pada rangkaian karakter ASCII.

Persyaratan Teknis:

  • Hanya badan metode yang dibutuhkan; hal-hal tambahan seperti tanda tangan metode, deklarasi struktur data, dll. tidak diperhitungkan dalam persyaratan kemenangan.
  • Kode harus dikompilasi atau ditafsirkan tanpa kesalahan atau pengecualian waktu kompilasi.
  • Kode tidak boleh membuang pengecualian atau gangguan yang tidak ditangani. (Hampir tak perlu dikatakan. Hampir.)
  • Kode harus mengembalikan beberapa nilai yang menunjukkan palindrominess. Jenis data tergantung pada bahasa yang Anda gunakan (misalnya pengguna C # mungkin menggunakan a bool, sedangkan pengguna JavaScript dapat menggunakan a var.)
  • Anda tidak boleh menulis juru bahasa Anda sendiri yang melakukan tugas ini sebagai kemampuan 'asli' sehingga Anda bisa 'bermain golf' dengan skor yang hampir menang. (Semoga tak perlu dikatakan.)

Kondisi kemenangan:

  • Kode terpendek dalam karakter menang.

Pemimpin Saat Ini: tmartin (k, 25 karakter)

... Ingin tanda centang hijau ajaib dengan jawaban Anda ? Kalahkan jawaban orang ini!


1
Apakah saya / O bagian dari tantangan, atau fungsi tubuh akan lakukan?
John Dvorak

1
"Remah roti" untuk menunjukkan bagaimana pekerjaan disempurnakan tersedia di seluruh situs dalam semua jawaban melalui riwayat revisi. Tidak perlu memiliki riwayat lengkap yang terlihat di versi jawaban saat ini.
Peter Taylor

1
@WernerCD Saya yakin OP akan mengubah siapa yang mendapat centang hijau ketika dia kembali untuk memeriksa tanggapan baru.
Gareth

2
Tidak menentukan bahasa benar-benar meremehkan tantangan ini bagi saya. Seperti yang terlihat di bawah, bahasa yang ditafsirkan dengan fokus pada fungsi manipulasi teks tingkat tinggi selalu mendapatkan hasil terpendek. Apa yang menghentikan saya melempar juru bahasa saya sendiri dengan satu fungsi, ip (). Algoritme bersaing saya sekarang 'ip: i'. 4 karakter. selesai
Gusdor

3
@Gusdor lihat J dan GolfScript menyedot semua kesenangan dari Code Golf dan Language Handicap dan pertanyaan terkait pada meta situs ini.
AakashM

Jawaban:


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

Sepertinya campuran dari Q dan k: P
skeevey

Yah, aku tidak akan menelepon .QA dll q. Mereka hanya pembungkus string, tidak ada kode k nyata di bawahnya. Sekarang, jika saya katakan .q.inter saya akan dalam kesulitan.
tmartin

Saya kira itu adalah kasus kebawelan atas semantik tetapi mereka didefinisikan dalam qk
skeevey

Bisa saja mengatakan Q untuk 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

saya tahu ini sangat lama tapi ... Anda dapat menyimpan 1 byte {#|:\_x@&x in,/.Q`a`A`n}, di mana 1 benar dan 2 salah
scrawl

24

Perl, 26 char

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

Mengevaluasi ke 1 kapan $_palindrom, ""(salah satu dari nilai false Perl) ketika tidak.

Penggunaan sampel:

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__

keluaran:

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

Sial, kamu mengalahkanku. Meskipun ini tidak akan berfungsi dengan baik jika ada _dalam string kan? Dan itu tidak membutuhkan input apa pun jadi tidakkah Anda perlu menggunakan -popsi ini?
Gareth

\Wdi regex tidak termasuk garis bawah. Saya khawatir Anda akan perlu [^a-z\d]di regex Anda. Saya khawatir saya dipukuli.
John Dvorak

3
Simpan satu dengan _|\Wbukan [_\W].
Howard

1
Anda dapat menyingkat _|\Wmenjadi \Pl: ideone.com/0ufdaQ . Seharusnya hanya huruf Unicode.
Kobi

Sebenarnya, berpikir lagi - \Pltidak akan cocok dengan angka, jadi saya kira _|\Wadalah yang terbaik yang bisa Anda lakukan.
Kobi

18

Hanya C # 82 :)

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

Tidak dapat menahan diri dari godaan untuk menulis program bebas boilerplate dalam bahasa favorit saya.

Tes tersedia di sini: http://ideone.com/8bwz7z


Sederhana ... tapi elegan!
Andrew Gray

@AndrewGray terima kasih atas komentarnya dan untuk Persyaratan Teknis yang permisif. C # boilerplate menambah serius jumlah char, menjadikannya tidak praktis untuk golf.
Cristian Lupascu

2
Tidak masalah. Saya sesama C # dev, dan saya suka menulis kode yang ringkas dan efisien. Sangat disayangkan ada begitu banyak pelat dalam bahasa ...
Andrew Gray

13

GolfScript, 36 34 31 30 karakter

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

Algoritma serupa dengan solusi saya sebelumnya (Javascript) .

0"0:A[a{"@{>^}+/- Dioptimalkan oleh Peter Taylor dan Howard. Versi saya adalah "/9@Z"{1$<},,2%\;. Howard menyumbangkan penggabungan fungsi dan Peter Taylor menyumbangkan XOR untuk modulo-2. Ini pada dasarnya metode generik membandingkan jika nilainya dalam urutan rentang.

{.96>32*-}%(11 karakter) tidak benar-benar merupakan peningkatan dari Javascript .toUpperCase()(14 karakter), terutama karena itu membuat beberapa tanda baca aneh yang mengikuti ztabel ASCII (yang tidak masalah di sini).

Namun seperti yang disarankan Peter Taylor, jika kita memfilter alfanumerik terlebih dahulu, kita dapat mengonversi menjadi huruf kecil dan angka hanya dengan menetapkan satu bit di setiap karakter: {32|}

.-1%=Apakah semua angkat berat palindromic. Satu bagian yang tidak terlalu saya sukai adalah berapa lama waktu yang saya butuhkan untuk mengetahui cara membalikkan array. Saya seharusnya membaca dokumen. Dua karakter lainnya melakukan manajemen tumpukan dan perbandingan.

Uji: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7IjA6QVtheyJcez59KywsMiV9LHszMnx9JS4tMSU9


Lebih lanjut, jika saya dapat berasumsi bahwa tidak ada karakter kontrol berikut yang hadir: (Data link escape, control perangkat 1-4, negative acknowledgment, idle synchronous, end of transmission block, cancel, end of medium) (kami semua sepakat bahwa ini adalah semua sangat tidak jelas) atau jika saya dapat memperlakukan mereka sebagai versi huruf besar dari angka 0-9, kita dapat menyimpan dua karakter lainnya:

GolfScript, 28 karakter

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

Uji: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7IkB7Pl59Ky99LC4tMSU9


2
Anda dapat menyingkirkan pembersihan dan menyimpan dua karakter:{"0:A["\{>}+,,2%},
Howard

@Howard, terima kasih. Saya pikir saya salah paham +tentang balok. Itu trik yang keren.
John Dvorak

1
Anda dapat menyimpan tiga karakter dengan membalikkan filter dan standarisasi kasing. Anda harus menambahkan a{ke daftar karakter filter untuk menyertakan huruf kecil, tetapi Anda kemudian dapat huruf besar dengan adil {32|}%. Hasil akhirnya adalah{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor

Ada juga penghematan lain yang harus dilakukan pada filter. Menghitung modulo 2 adalah xor, begitu 0"0:A[a{"@{>^}+/juga pekerjaannya.
Peter Taylor

@PeterTaylor Jika saya tidak segera membuat optimasi lain, saya mungkin harus mengonversi ke wiki komunitas. Terima kasih lagi :-)
John Dvorak

8

Javascript, 53 karakter:

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

adalah ekspresi javascript yang mengevaluasi true jika xpalindrom, menjadi false jika tidak. Diasumsikan xsebagai string. Jika itu tidak dijamin, silakanx+="",

Ini remah roti: Karena cara reverse()kerjanya,

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

gagal Namun,

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

baik-baik saja.


Berita gembira yang bagus untuk menggabungkan string nol! Poin untuk infoz bagus!
Andrew Gray

3
Petunjuk: dilemparkan ke +""string, dilemparkan ke +angka, |0dan ~~dilemparkan ke integer, dilemparkan ke !!boolean.
John Dvorak

Apakah char lebih pendek dengan regex/[^\W_]/g
SuperProgram

7

R: 66

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

Pemakaian:

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 karakter

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

Ini membutuhkan sengatan untuk memeriksa sebagai parameter pertama dan menetapkan kode keluar ke 0 untuk palindrome dan 1 untuk tidak.

Contoh dijalankan:

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

Python 2: 49 (tanpa menghitung tanda tangan metode)

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

Program yang lengkap, dengan input dan output dapat ditulis dalam 74 karakter.

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

Contoh penggunaan:

$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.txtMengandung ini 17.826 kata palindrom)

Solusi ini dapat disesuaikan dengan python 3 menambahkan beberapa karakter:

Python 3: 55

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

sys.stdin.readpada dasarnya sama denganraw_input
CalculatorFeline

Dalam Python 3.8 Anda dapat mempersingkat ini menjadi 58 byte
MilkyWay90

Juga, solusi Python 2 & 3 Anda adalah masing-masing 61 byte dan 67 byte.
MilkyWay90

@ MilkyWay90 Anda mungkin melewatkannya tanpa menghitung tanda tangan metode . Pada tahun 2013 adalah kebiasaan untuk tidak memasukkannya. Dalam solusi lain dalam pertanyaan ini dalam bahasa lain mereka hanya menghilangkannya dan menganggap Anda memiliki input dalam suatu svariabel. Saya memutuskan untuk memberikan definisi yang lengkap tetapi, seperti kebiasaan pada tahun 2013, tidak menyertakan metode tanda tangan dalam panjangnya
Bakuriu

@ Bakuriu Ah, begitu. Saya baru di sini beberapa bulan, jadi saya tidak tahu bea cukai mulai 2013
MilkyWay90

7

JAVA (atau bahasa yang paling verbose), 102 96 95 char

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

Penggunaan (dengan kode ungolfed):

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

Dipersingkat dengan bantuan komentator di bawah ini


1
Meskipun saya tidak tahu Java (saya seorang pria C #, cukup lucu), tidak bisakah Anda menyelamatkan 1 karakter dengan mengeluarkan kurung kurawal pada if? EG: if(s==null) return 1==0;? Atau apakah Java memberlakukan ikal pada ifpernyataan?
Andrew Gray

3
Anda benar sekali, saya mengeluarkannya terima kasih !! ... Saya belum melihat mereka ada di sana, saya kira saya adalah pengembang Java yang tidak C #?
jsedano

4
1) Memeriksa apakah parameternya adalah nullkebiasaan yang baik, tetapi tidak dipraktikkan di CodeGolf. Seperti yang saya tahu, tidak ada orang lain yang melakukannya dalam pertanyaan ini. Lewati. 2) Ruang antar argumen membantu keterbacaan, tetapi tidak bermain golf. Singkirkan; 3) Alih-alih secara eksplisit toLowerCase()menggunakan string equalsIgnoreCase()nanti equals(). Dengan cara ini Anda harus menyesuaikan ekspresi reguler, tetapi masih 1 karakter lebih pendek. pastebin.com/s7H84faj
manatwork

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

Sebenarnya: replaceAll("\\W|_","");untuk menghapus _juga => 95 karakter
assylias

7

Mathematica 54 53

Satu byte disimpan berkat CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Bagi mereka yang memiliki versi 10.2 atau yang lebih lama:

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

Contoh

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

Benar


PalindromeQlebih pendek 1 byte dari#==Reverse@#&
CalculatorFeline

Saya bertanya-tanya mengapa saya belum pernah melihatnya. Versi 10.3!
DavidC

PalindromeQ= #==Reverse@#&
CalculatorFeline

Ya, saya mengunduh v. 10.4 untuk mencobanya.
DavidC

Itu keluar? OHNO
CalculatorFeline

6

J, 30 karakter

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

Pemakaian:

   */(=|.)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 karakter)

Menekan semua kesalahan, mengembalikan default 0b(salah).

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

Contoh:

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

sunting: mencukur tiga karakter lagi dengan menghindari variabel perantara. H / T, CS. -7: Tidak perlu menekan kesalahan.


1
menarik bahwa hanya dengan 3 karakter lebih, kode saya jauh lebih mudah dibaca :-)
John Dvorak

Char tambahan menyelinap masuk, saya telah menghapusnya.
skeevey

5

Ruby: 43 38 karakter

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

Contoh dijalankan:

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
Anda bahkan dapat menuliss.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard

Sobat, berapa lama saya menggabungkan sekitar penggunaan !metode! Kamu membuatku luar biasa @Howard dengan trikmu.
manatwork

Masalah kecil, @Howard. trdan tr!tampaknya berperilaku berbeda ketika mereka tidak memiliki sesuatu untuk transliterasi: pastebin.com/4YThW2qN Itu membuat p['757']tes untuk crash dengan "NoMethodError: metode undefined` upcase! ' untuk nil: NilClass ”error.
manatwork

Ups, maaf. Tidak memikirkan kasus itu.
Howard

1
dapat dipersingkat lebih lanjut:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu

5

C ++, 107 (salah hitung), 100 (salah hitung), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Mengeksploitasi pola bit ASCII.
  • Mengandalkan kejahatan using namespace std;.
  • Menggunakan bitwise AND dan OR sebagai ganti operator logis.
  • Digunakan intkarena lebih pendek dari charatau 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)

Jika %Wada sesuatu seperti \Wdi regex, itu juga mengecualikan karakter seperti garis bawah. Ini tidak diinginkan.
John Dvorak

saya memeriksa, %wtidak termasuk _( %Wjelas termasuk, lalu)
mniip

1
Hanya fungsi tubuh yang dibutuhkan. s=s:lower():gsub('%W','')return s:reverse()==s 46 chars
Egor Skriptunoff

tapi bagaimana denganfunction(s)
mniip

4

Python 3/2 59 karakter:

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

4

Haskell, 43

Menggunakan perpustakaan standar Control.Monad, Control.Monad.Instancesdan Data.Char:

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

Saya tidak bisa membuat ini berfungsi dalam ghci. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumtidak juga dengan menambahkan spasi atau semacamnya, maaf saya tidak terlalu tertarik dengan Haskell :)
SlimJim

1
@SlimJim: Ups, Anda juga perlu Control.Monad.Instances. (Saya menggunakan instance Reader monad dengan ap, tetapi instance itu tidak diekspor oleh Control.Monad.)
Jon Purdy

4

PHP 60 karakter.

Pertama coba codegolf.

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

Contoh:

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

Tanda kurung di sekitar operan pertama operator ternary tidak diperlukan. Sebenarnya tidak diperlukan operator ternary - hanya menampilkan benar atau salah dalam representasi bahasa Anda. Dan dengan menghindari pernyataan terpisah untuk tugas dengan karakter $ x 1 dapat dipersingkat: 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 Jika Anda mengganti semua pengidentifikasi dengan satu pengidentifikasi karakter, Anda mendapatkan 77versi karakter. Tidak tahu mengapa abhiram memposting versi yang tidak disenangi.
Bakuriu

@ Bakuriu, sudahlah, saya melewatkan satu pernyataan dalam pertanyaan: "Hanya badan metode yang diperlukan". Padahal baris 2 dan 3 memberi saya hanya 73 karakter. Mengenai pengurangan panjang lebih lanjut, tidak perlu untuk string mentah dan grup tangkap, membuat re.findall('[a-z0-9]+',input.lower())bagian 3 karakter lebih pendek.
manatwork

@manatwork, saya mengedit posting dan sedikit mengubah variabel. Itu membawanya ke 66. Ya, atribut string mentah tidak ada gunanya di sini.
abhiram

Oke, tapi mengapa Anda bersikeras menangkap grup dalam ekspresi reguler? Berfungsi dengan benar tanpa: pastebin.com/JzpNRRZU
manatwork

Saya pikir itu tertangkap dengan saya setelah proyek python saya baru-baru ini yang melibatkan re's :) Terima kasih telah menunjukkannya.
Abhiram

3

Haskell 48

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

digunakan seperti ini:

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

3

Smalltalk , Squeak / Pharo beraroma
116 karakter menggunakan format tradisional dengan tab

Anda menambahkan dua metode ke String:

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

Kita tentu saja dapat menghilangkan beberapa ruang, atau menggunakan nama metode yang lebih pendek, tetapi jangan mengkhianati semangat Smalltalk.

Terlebih lagi, ini akan menangani palindrom Prancis, seperti di http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7saya , tidak banyak jawaban di halaman ini bisa.

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

Jawaban cerdas dan bermanfaat!
Andrew Gray

3

Python 3 (51 char)

dan mungkin Python 2

berdasarkan solusi abhiram (dengan golf yang lebih agresif)

from re import findall

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

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

dapat disingkat menjadi 46 karakter, menggunakan RE '\ w'

dan varian dengan fungsi tubuh yang sangat singkat (27 karakter)

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 karakter

Diperbarui (lihat komentar), dan dapat menghapus tanda kurung di sekitar regex:

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

Asli (56)

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

Asli Tidak golf:

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

Anda dapat bermain golf ini ke 47 karakter seperti ini:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD

@SpellingD: Bagus! Saya baru di golf kode, terima kasih atas perbaikannya
goric

Anda dapat menghapus tanda kurung yang tepat juga: ($s=$s-replace'\W')-eq-join$s[$s.length..0].
mazzy

2

C ++, 74 byte

Kode ini sebenarnya sangat elegan, dan mudah dimengerti (bila diformat dengan benar). Saya tidak percaya itu mungkin untuk mendapatkan lebih pendek di C ++, dan tidak menggunakan fungsi pustaka standar.

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

Contoh penggunaan:

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

Versi yang diformat dengan baik:

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 typefungsi Anda harus memiliki tipe pengembalian.
Karl Napf

Saya yakin ini tidak mengabaikan huruf, spasi dan karakter kontrol.
Titus

Anda dapat menyimpan karakter dengan while(*++e);alih - alih while(*e)++e;. Tetapi seperti yang disebutkan Titus, jawaban ini tidak valid.
Nick Matteo

2

PHP, 26 84 80 78 62 63 byte

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

mengambil input dari argumen baris perintah pertama; cetakan 1untuk string yang benar dan kosong untuk kepalsuan.


I18n adalah ekspansif kecil, karena tidak ada alternatif multibyte untuk strrev(110 byte; dijalankan dengan -r):

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

utf8_strrev secara terang-terangan dicuri dari manual PHP . Anda mungkin juga ingin melihat posting blog ini .


Ayo Titus ... Ini gagal spec.
Christoph

1
@Christoph Ya saya kadang-kadang harus sepenuhnya membaca itu. Tetap.
Titus

Hm -Rakan menyebabkan masalah dengan putus baris dalam string untuk menguji bukan? Dari spec "-R <code> Jalankan PHP <code> untuk setiap baris input". Apalagi <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;akan lebih pendek.
Christoph

1
@ Christoph Ide bagus, tapi tidak ada $argntanpa -R.
Titus

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

1

Ruby, 48

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

Cukup sederhana, dan dibuat dengan tergesa-gesa sehingga tidak terlalu banyak bermain golf. Saya akan bermain golf nanti.


1

Pylongolf2 , 24 byte

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

cmengambil input, ╨2untuk mengkonversi ke huruf kecil.
Saya kemudian mendorong regex ke tumpukan dan gunakan -untuk menghapus semua karakter non-abjad dalam input.
_duplikat input.
╨1membalikkannya dan =kemudian membandingkannya.
~mencetak tumpukan di ujung yang mencetak salah satu trueatau false.


Apakah ini mengabaikan tanda baca, spasi putih, dan karakter kontrol?
MickyT

Sayangnya, versi ini tidak. Saya akan memperbaikinya.

Memperbaiki masalah.

1

PowerShell, 194 190 byte

Implementasi rekursif untuk menunjukkan bagaimana scriptblock PowerShell yang tidak bernama dapat memanggil dirinya sendiri.

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

ungolfed:

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

tes:

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

Bukankah seharusnya begitu [^a-z0-9]?
Titus

1

05AB1E , 4 byte (tidak bersaing)

Non-bersaing , karena bahasa tersebut mengungguli tantangan. Kode:

álÂQ

Penjelasan:

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

Menggunakan pengkodean CP-1252 . Cobalah online! .


Mencoba menjalankannya melalui tautan Anda. Output program adalah "1"
Christopher Perry

1

Jelly, 10 Karakter (Non-bersaing)

fØBŒl
UÇ⁼Ç

Mengembalikan 1 jika benar, 0 jika salah

Cobalah secara Online!


Apakah ini mengabaikan karakter, spasi dan kontrol karakter? Kerusakan akan menyenangkan.
Titus

Keadaan saat ini Jelly memungkinkan untuk memecahkan ini dalam 7 bytes: fØBŒlŒḂ: fsaringan untuk menjaga ØBset [a-zA-Z0-9] dan Œlconvert ke huruf kecil, maka ŒḂuji apakah palindrom.
steenbergh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.