Bir dizenin bir palindrom olup olmadığını belirlemek için en kısa kod


42

Bir palindrome , hem geriye hem de ileriye doğru aynı şekilde yazılan bazı dizelerdir. Örneğin, 'Eva, bir mağarada yarasaları bıçaklayabilir miyim?' bir palindromdur (EVACANISTAB | BATSINACAVE)

Bu kod golf için, seçtiğiniz dili kullanarak, verilen bir dizginin bir palindrom olup olmadığını belirleyin.

Kenar Kılıfları:

  • Noktalama palindrominess için sayılmaz.
  • Kontrol karakterleri palindrominess için sayılmaz.
  • Boşluk palindrominess için sayılmaz.
  • Sayılar palindrominess doğru sayılır.
  • Bu zorlukta durum palindrominess sayılmaz.
  • Seçtiğiniz dil tarafından empoze edilenler dışında, değerlendirilecek dizelerin uzunluğunun bir sınırı yoktur.
  • Bu zorluk için, kendinizi ASCII karakter setiyle sınırlandırın.

Teknik gereksinimler:

  • Sadece yöntem gövdelerine ihtiyaç vardır; yöntem imzaları, veri yapısı beyannameleri, vb. gibi ek şeyler zafer ihtiyacına sayılmaz.
  • Kod, derleme zamanı hataları veya istisnalar olmadan derlenmeli veya yorumlanmalıdır.
  • Kod işlenmeyen istisnalar veya çökmeler atmamalıdır. (Söylemeye neredeyse gerek yok. Neredeyse.)
  • Kod, palindrominess gösteren bir değer döndürmelidir. Veri türü kullandığınız dile göre değişir (örneğin bir C # kullanıcısı a kullanabilir bool, oysa JavaScript kullanıcısı a kullanabilir var.)
  • Bu görevi 'yerel' bir yetenek olarak yapan kendi tercümanınızı yazamayabilirsiniz, böylece yakın bir skoru 'golf' yapabilirsiniz. (Umarım söylemeye gerek yok.)

Zafer Durumu:

  • Karakterlerdeki en kısa kod kazanır.

Mevcut lider: tmartin (k, 25 karakter)

... tarafından sihirli yeşil onay işaretine ister sizin cevap? Bu adamın cevabını yenin!


1
G / Ç bu zorluğun bir parçası mı yoksa bir işlev gövdesi mi yapacak?
John Dvorak

1
İşin nasıl incelendiğini gösteren "ekmek kırıntıları" revizyon tarihi boyunca tüm cevaplarda site genelinde mevcuttur. Cevabın geçerli sürümünde tam bir geçmişin görünmesine gerek yoktur.
Peter Taylor

1
@WernerCD OP'nin yeni cevapları kontrol etmek için geri döndüğünde yeşil onay işaretini alan kişiyi değiştireceğinden eminim.
Gareth

2
Dil belirtmemek benim için bu zorluğu gerçekten önemsiz kılıyor. Aşağıda görüldüğü gibi, yüksek kalitede metin işleme işlevlerine odaklanan tercüme edilmiş diller her zaman en kısa sonuçları alır. Beni kendi tercümanımı tek bir işlevle birlikte atmamı engelleyen ip (). Rekabet algoritmam artık 'ip: i'. 4 karakter yapılır.
Gusdor

Yanıtlar:


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

Q ve k karışımı gibi görünüyor: P
skeevey

Şey, tam olarak QQ vs. q 'yi aramazdım. Onlar sadece string sarmalayıcılar, altlarında gerçek bir k kodu yok. Şimdi eğer .q.inter dediysem başım belaya girer.
tmartin

Sanırım anlambilim üzerine
titreyen

Sadece 31 {x~(|)x:(_)x inter(,/).Q`a`A`n}
Mayıs'ta

bunun çok eski olduğunu biliyorum ama ... 1 byte ile tasarruf edebilirsiniz {#|:\_x@&x in,/.Q`a`A`n}, 1 doğru ve 2 yanlış
scrawl

24

Perl, 26 karakter

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

$_Bir palindrom olduğunda 1 olarak değerlendirir ,"" (değil, Perl'in sahte değerlerinden biri).

Örnek kullanım:

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__

çıktı:

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

Kahretsin beni yendin. Bu bir ipte varsa bu düzgün çalışmayacak _mı? Ve herhangi bir giriş yapmaz, bu yüzden -pseçeneği kullanmanıza gerek kalmaz mı?
Gareth,

\Wregex'lerde alt çizgi hariçtir. Maalesef regex'inize ihtiyacınız [^a-z\d]olacak. Korkarım yine de dövüldüm.
John Dvorak

3
_|\WBunun yerine bir tanesini kaydedin [_\W].
Howard

1
Sen kısaltabilir _|\Wiçin \Pl: ideone.com/0ufdaQ . Sadece Unicode harfleri olmalı.
Kobi

Aslında, tekrar düşünmek - \Plrakamlarla eşleşmeyecek, sanırım _|\Wyapabileceğiniz en iyi şey.
Kobi

18

Sadece C # 82 :)

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

En sevdiğim dilde ücretsiz bir program yazmanın cazibesine dayanamadı.

Burada bir test mevcuttur: http://ideone.com/8bwz7z


Basit ... ama şık!
Andrew Gray,

@AndrewGray, yorumunuz ve izin verilen Teknik Gereksinimler için teşekkür ederiz. C # kazan plakası char sayısına ciddi bir şekilde katkıda bulunur, aksi takdirde golf için pratik değildir.
Cristian Lupascu

2
Pro yok. Ben bir C # dev adamım ve özlü, verimli kod yazmayı seviyorum. Dilde çok fazla kazanın olması çok yazık ...
Andrew Gray

13

GolfScript, 36 34 31 30 karakter

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

Önceki (Javascript) çözümüme benzer bir algoritma .

0"0:A[a{"@{>^}+/- Peter Taylor ve Howard tarafından optimize edilmiştir. Benim versiyonum öyleydi "/9@Z"{1$<},,2%\;. Howard işlev birleştirme ve Peter Taylor, modulo-2 için XOR'a bağışta bulundu. Temelde, değerin bir aralık dizisinde olup olmadığını karşılaştırmanın genel bir yöntemidir.

{.96>32*-}%(11 karakter) Javascript'in .toUpperCase()(14 karakter) üzerinde gerçekten bir gelişme değildir , özellikle zASCII tablosunda (burada önemli olmayan) izleyen bazı tuhaf noktalama işaretlerini yönetir .

Peter Taylor'in önerdiği gibi, önce alfanümerikleri süzersek, her karakterde bir bit ayarlayarak küçük harfe ve rakamlara dönüştürebiliriz: {32|}

.-1%=tüm palindromik ağır kaldırma işlemini yapar. Gerçekten düşkün olmadığım bir bölüm, bir diziyi nasıl ters çevireceğimi öğrenmemin ne kadar sürdüğü. Belgeleri okumalıydım. Diğer iki karakter yığın yönetimi ve karşılaştırma yapar.

Sınama: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7IjA6QVtheyJcez59KywsMiV9LHszMnx9U4E


Ayrıca, aşağıdaki kontrol karakterlerinden hiçbirinin bulunmadığını varsayabilirsem: (Veri bağlantısı kaçış, cihaz kontrolü 1-4, olumsuz onay, senkronize boşta, aktarım bloğunun sonu, iptal, ortamın sonu) (hepimiz hemfikiriz) hepsi oldukça belirsiz) ya da onlara 0-9 basamaklarının büyük harfli sürümleri olarak bakabilirsem, iki karakter daha kaydedebiliriz:

GolfScript, 28 karakter

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

Test: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7IkB7Pl59Ky99LC4TUU


2
Temizlenmeden kurtulabilir ve iki karakter kazanabilirsiniz:{"0:A["\{>}+,,2%},
Howard

@Hardard Teşekkürler. Sanırım +blokları yanlış anladım . Bu harika bir numara.
John Dvorak

1
Filtreyi ve kasa standardizasyonunu tersine çevirerek üç karakterden tasarruf edebilirsiniz. Küçük a{harfleri dahil etmek için filtrenin karakter listesine eklemeniz gerekir, ancak daha sonra sadece büyük harf yapabilirsiniz {32|}%. Sonuç şu ki{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor

Ayrıca filtre üzerinde yapılacak başka bir tasarruf var. Modulo 2'nin sayılması xor, yani 0"0:A[a{"@{>^}+/iş de öyle.
Peter Taylor

@PeterTaylor Yakında başka bir optimizasyon yapmazsam, muhtemelen topluluk wiki'sine dönüştürmeliyim. Tekrar teşekkürler :-)
John Dvorak

8

Javascript, 53 karakter:

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

xbir palindrom olup olmadığını doğru, yanlış ise yanlış olarak değerlendiren bir javascript ifadesidir . xBir dize olduğunu varsayar . Bu garanti edilmediyse, hazırlanx+="",

İşte bir ekmek kırıntısı: Nasıl reverse()çalıştığından dolayı ,

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

başarısız olur. Ancak,

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

Tamamen iyi.


Boş bir dize bitiştirme hakkında güzel haber! İyi infoz için puan!
Andrew Gray,

3
İpuçları: +""bir dizeye atmalarını, +bir sayıya atmalarını |0ve ~~bir tam sayıya döküm, !!bir mantıksal değere silendirler.
John Dvorak

Regex ile bir karakter daha kısa/[^\W_]/g
SuperPrograman

7

R: 66

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

Kullanımı:

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` ]

Bu, ilk parametre olarak kontrol edilmesi için sokma yapar ve çıkış kodunu palindrome için 0'a, değil ise 1'e ayarlar.

Örnek çalışma:

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 (yöntem imzasını saymadan)

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

Giriş ve çıkış ile eksiksiz bir program 74 karakterde yazılabilir .

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

Örnek kullanım:

$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                                         

( bu 17.826 kelime palindromunu huge_palindrome.txtiçerir )

Bu çözüm, bazı karakterler ekleyerek python 3'e uyarlanabilir:

Python 3: 55

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

sys.stdin.readtemelde aynıraw_input
CalculatorFeline

Python 3.8’de bunu 58 byte
MilkyWay90

Ayrıca, Python 2 & 3 çözümünüz sırasıyla 61 ve 67 bayttır.
MilkyWay90

@ MilkyWay90 Muhtemelen yöntem imzasını saymadan kaçırdın . 2013 yılında dahil etmemek gelenekseldi. Bu sorudaki diğer çözümde, diğer dillerde, basitçe bunu ihmal ettiler ve bir sdeğişkene girdiğinizi kabul ettiler . Tam tanımı yapmaya karar verdim, ancak 2013'te görüldüğü gibi, yöntem imzasını uzunluğa
eklemeyin

@ Bakuriu Ah, anlıyorum. Sadece birkaç aydır buradayım, bu yüzden 2013'ten itibaren gümrük bilmiyorum
MilkyWay90

7

JAVA (veya şimdiye kadarki en ayrıntılı dil), 102 96 95 karakter

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

Kullanımı (ungolfed koduyla):

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

Aşağıdaki yorumcu yardımı ile kısaltıldı


1
Java'yı bilmeme rağmen (Ben bir C # adamıyım, yeterince komik), eğer üzerindeki kaşlı ayraçları çıkartarak 1 karakter kaydedemediniz mi? EG: if(s==null) return 1==0;? Yoksa Java ififadelerde kıvrımları zorlar mı?
Andrew Gray,

3
Kesinlikle haklısın, bunu çıkardım teşekkür ederim !! ... orada olduklarını farketmedim, sanırım C # olmayan bir Java geliştiricisiyim?
jsedano

4
1) Parametrenin nulliyi bir alışkanlık olup olmadığını kontrol etmek , ancak CodeGolf'ta uygulanmaz. Söyleyebileceğim gibi, bu soruda başka kimse yapmadı. Bunu atlayın. 2) Argümanlar arasındaki boşluk okunabilirliğe yardımcı olur, ancak golf oynamaya yardımcı olmaz. Onu kaldır; 3) Açıkça toLowerCase()dize equalsIgnoreCase()yerine dize kullanın equals(). Bu şekilde normal ifadeyi ayarlamanız gerekir, ancak yine de 1 karakter daha kısa olmalıdır. pastebin.com/s7H84faj
manatwork

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

Aslında: çok replaceAll("\\W|_","");kaldırmak _için => 95 karakter
assylias

7

Mathematica 54 53

CatsAreFluffy sayesinde bir bayt kurtarıldı:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

10.2 veya daha önceki sürümleri olanlar için:

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

Örnek

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

Doğru


PalindromeQ#==Reverse@#&
CalculatorFeline

Neden hiç görmedim diye merak ettim. Sürüm 10.3!
DavidC

PalindromeQ= #==Reverse@#&
Hesap MakinesiFeline

Evet, denemek için v.
DavidC

Dışarıda mı? OHNO
Hesap MakinesiFeline

6

J, 30 karakter

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

Kullanımı:

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

Varsayılan olarak 0b(false) döndürerek tüm hataları bastırır .

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

Örnek:

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

edit: ara değişken kaçınarak üç karakter daha traş. H / T, CS. -7: Hataları bastırmaya gerek yok.


1
ilginç, sadece 3 karakter daha,
kodumun

Fazladan bir karakter girdi, ben çıkardım.
skeevey

5

Yakut: 43 38 karakter

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

Örnek çalışma:

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

Dostum, ne kadar zamandır !yöntemleri kullanmaya başladım ! Sen harikasın @Howard ile pes et.
Manatwork

Küçük sorun olsa da, @Hardard. trve çevirecek bir şeyleri tr!olmadığında farklı davranıyor gibi görünmektedir: pastebin.com/4YThW2qN Bu, p['757']testi “NoMethodError: undefined method upcase!” ile çökertirir. nil için: NilClass ”hatası.
Manatwork

Ayy üzgünüm. Bu dava hakkında düşünmedim.
Howard

1
daha da kısaltılabilir:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu

5

C ++ 107 (Miscounted), 100 (yanlış hesaplanmış), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • ASCII bit desenlerini kullanır.
  • Kötülüğe güvenir using namespace std;.
  • Mantıksal operatörler yerine bitsel ve VEYA kullanır.
  • Kullanımları into daha kısa olduğu için charya 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)

Regex'te %Wolduğu gibi bir şey varsa , \Walt çizgi gibi karakterleri dışlar. Bu istenmeyen.
John Dvorak

Ben kontrol, %wiçermez _( %Wtabii ki, o zaman dahil)
mniip

1
Sadece fonksiyon gövdesi gereklidir. s=s:lower():gsub('%W','')return s:reverse()==s 46 karakter
Egor Skriptunoff

ama ne hakkındafunction(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

Standart kütüphaneleri kullanma Control.Monad, Control.Monad.Instancesve Data.Char:

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

Bunu ghci'de çalışmasını sağlayamam. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumboşluk eklemek gibi bir şey de yapmıyor, üzgünüm, Haskell ile fazla meraklı değilim :)
SlimJim

1
@SlimJim: Hata Control.Monad.Instances! (Reader monad örneğini ile kullanıyorum ap, ancak bu örnek dışarı aktarılmıyor Control.Monad.)
Jon Purdy

4

PHP 60 karakter.

İlk önce codegolf'u deneyin.

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

Örnek:

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

Üçlü operatörün ilk operandının etrafındaki parantez gerekli değildir. Aslına bakarsanız, üçlü operatöre de ihtiyaç duyulmaz - dilinizin temsilinde doğru ya da yanlış çıktı verin. Ve $ x 1 daha karakterine atama için ayrı açıklama kaçınarak kısaltılabilir: echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
Manat çalışması

3

Python 2 64 Charecters:

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

@manatwork Tüm tanımlayıcıları bir karakter tanımlayıcı ile değiştirirseniz, bir 77karakter versiyonu elde edersiniz . Abiramın neden unungolfed versiyonunu yayınladığı hakkında hiçbir fikrim yok.
Bakuriu

@Bakuriu, boşver, soruda bir ifadeyi kaçırdım: “Sadece yöntem gövdelerine ihtiyaç var”. 2. ve 3. satırlar bana sadece 73 karakter veriyor. Daha fazla uzunluk azaltması ile ilgili olarak, ham dizgeye ve yakalama grubuna gerek yoktur, re.findall('[a-z0-9]+',input.lower())bölüm 3 karakterleri daha kısadır.
Manatwork

@ manatwork, yazıyı düzenledim ve değişkenleri biraz değiştirdim. Bu onu 66'ya indirdi. Evet, işlenmemiş string niteliğinin burada bir faydası yok.
abhiram

Tamam, peki neden normal ifade içinde yakalayıcı grupta ısrar ediyorsun? Olmadan doğru çalışır: pastebin.com/JzpNRRZU
manatwork

Sanırım sonları içeren python projemden sonra beni etkiledi :) Gösterdiğiniz için teşekkürler.
abhiram

3

Haskell 48

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

böyle kullanılır:

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

3

Smalltalk , Squeak / Pharo lezzet Sekmeleri ile geleneksel biçimlendirme kullanarak
116 karakter

String'e iki yöntem eklersiniz:

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

Elbette bazı alanları ortadan kaldırabilir veya daha kısa yöntem adları kullanabiliriz, ancak Smalltalk ruhuna ihanet etmeyelim.

Dahası, bu, http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais adresindeki gibi Fransızca palindromları idare eder .

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

Zeki ve kullanışlı cevap!
Andrew Gray

3

Python 3 (51 karakter)

ve Python 2 olabilir

abhiram çözümüne dayanarak (daha agresif golf oynama ile)

from re import findall

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

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

RE '\ w' kullanarak 46 karaktere kadar kısaltılabilir

ve çok kısaltılmış işlev gövdeli değişken (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

Güncelleme (yorumları görün) ve regex'in etrafındaki parantezleri kaldırabilirsiniz:

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

Orijinal (56)

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

Un-golfed Orijinal:

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

Bunu şu şekilde 47 karaktere kadar golf edebilirsiniz:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD

@ Yazım D: Güzel! Ben, iyileştirme için teşekkür kod golf yeniyim
goric

Ayrıca sağ parantez kaldırabilirsiniz: ($s=$s-replace'\W')-eq-join$s[$s.length..0].
mazzy

2

C ++, 74 bayt

Bu kod gerçekten çok zarif ve anlaşılması kolaydır (doğru şekilde biçimlendirildiğinde). C ++ 'da kısaltmanın mümkün olduğunu sanmıyorum ve standart kütüphane işlevlerini kullanmıyor.

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

Örnek kullanım:

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

Güzel formatlanmış versiyon:

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 typefonksiyonunuz bir dönüş tipine sahip olmalıdır.
Karl Napf

Bahse girerim bu durum, boşluk ve kontrol karakterlerini görmezden gelmez.
Titus

Bunun while(*++e);yerine bir karakter kaydedebilirsiniz while(*e)++e;. Ancak Titus'un dediği gibi bu cevap geçersiz.
Nick Matteo,

2

PHP, 26 84 80 78 62 63 bayt

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

ilk komut satırı argümanından girdi alır; 1gerçeği için baskı , sahte için boş dize.


I18n, çok geniş bir alandır, çünkü strrev(110 bayt; koşarak -r) için çokbaytlı bir alternatif yoktur :

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

utf8_strrev açıkça PHP kılavuzundan çalındı . Ayrıca bu blog gönderisine de bakmak isteyebilirsiniz .


Hadi Titus ... Bu özellik başarısız olur.
Christoph

1
@Christoph Evet, bazen bunu tamamen okumam gerekir. Sabit.
Titus

Hm -Rsınamak için dizedeki satır kesmelerinde sorunlara neden olur, değil mi? "-R <code> Her giriş satırı için PHP <code> 'yı çalıştırın. Üstelik <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;daha kısa olurdu.
Christoph

1
@Christoph Güzel fikir, ama $argnolmadan yok -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)

Oldukça basit ve aceleyle yapılan çok fazla golf değil. Daha sonra golf oynarım.


1

Pylongolf2 , 24 bayt

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

cgirişi ╨2küçük harfe dönüştürmek için alır .
Sonra yığına bir regex itin -ve girdideki tüm alfabetik olmayan karakterleri kaldırmak için kullanın .
_girişi çoğaltır.
╨1tersine çevirir ve =sonra bunları karşılaştırır.
~Yığını ya trueda yazdırır sonunda yazdırır false.


Bu noktalama işaretlerini, boşlukları ve kontrol karakterlerini yok sayar mı?
MickyT

Benim hatam, bu sürüm değil. Düzelteceğim.

Sorun düzeltildi.

1

PowerShell, 194 190 bayt

Adsız bir PowerShell scriptblock öğesinin kendisini nasıl arayabildiğini gösteren yinelemeli bir uygulama.

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

testler:

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

Olmamalı mıydı [^a-z0-9]?
Titus

1

05AB1E , 4 bayt (rekabet etmeyen)

Rekabetçi değil , çünkü dil mücadeleyi sürdürüyor. Kod:

álÂQ

Açıklama:

á     # 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 kodlamasını kullanır . Çevrimiçi deneyin! .


Bağlantınız üzerinden çalıştırmayı denedim. Program çıktısı "1" dir
Christopher Perry

1

Jöle, 10 Karakter (Yarışmasız)

fØBŒl
UÇ⁼Ç

True ise 1, false 0 döndürür

Çevrimiçi Deneyin!


Harf, boşluk ve kontrol karakterlerini yok sayar mı? Bir arıza iyi olurdu.
Titus

Jelly mevcut durumu 7 bayt bu çözümü için izin verir: fØBŒlŒḂ: ffiltre tutmak için ØBset [a-zA-Z0-9] ve Œlardından, küçük harfe dönüştürmek ŒḂpalindroma eğer testi.
steenbergh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.