Najkrótszy kod określający, czy ciąg znaków jest palindromem

42

Palindrom jest jakiś ciąg znaków, który jest wpisany w ten sam sposób zarówno w przód iw tył. Na przykład: „Eva, czy mogę dźgać nietoperze w jaskini?” jest palindromem (EVACANISTAB | BATSINACAVE)

W przypadku tego kodu golfowego, używając wybranego języka, określ, czy dany ciąg jest palindromem, czy nie.

Edge Cases:

  • Interpunkcja nie jest wliczana do palindromii.
  • Postacie kontrolne nie są liczone do palindromii.
  • Białe znaki nie są wliczane do palindromii.
  • Liczby są liczone do palindromii.
  • Przypadek w tym wyzwaniu nie jest liczony do palindromii.
  • Długość łańcuchów do oceny jest nieograniczona, z wyjątkiem tego, co narzuca Twój wybrany język.
  • W tym wyzwaniu ogranicz się do zestawu znaków ASCII.

Wymagania techniczne:

  • Potrzebne są tylko ciała metod; dodatkowe rzeczy, takie jak podpisy metod, deklaracje struktury danych itp. nie liczą się do wymogu zwycięstwa.
  • Kod musi się kompilować lub interpretować bez błędów i wyjątków czasu kompilacji.
  • Kod nie może generować żadnych nieobsługiwanych wyjątków lub awarii. (Prawie nie trzeba dodawać. Prawie.)
  • Kod musi zwracać pewną wartość wskazującą na palindrominess. Typ danych zależy od używanego języka (np. Użytkownik C # może użyć a bool, podczas gdy użytkownik JavaScript może użyć a var.)
  • Nie możesz pisać własnego tłumacza wykonującego to zadanie jako „rodzimego”, abyś mógł „golfa” uzyskać prawie zwycięski wynik. (Mam nadzieję, że nie trzeba dodawać.)

Warunek zwycięstwa:

  • Najkrótszy kod ze znaków wygrywa.

Obecny przywódca: tmartin (k, 25 znaków)

... Chcesz magiczny zielony znacznik wyboru obok swojej odpowiedzi? Pokonaj odpowiedź tego faceta!

Andrew Gray
źródło
1
Czy operacje wejścia / wyjścia są częścią wyzwania, czy też będzie pełnić funkcję organu?
John Dvorak,
1
„Bułka tarta” pokazująca, w jaki sposób praca jest udoskonalana, jest dostępna dla całej witryny we wszystkich odpowiedziach poprzez historię zmian. W obecnej wersji odpowiedzi nie ma potrzeby wyświetlania pełnej historii.
Peter Taylor,
1
@WernerCD Jestem pewien, że OP zmieni, kto dostanie zielony haczyk, gdy wróci, aby sprawdzić nowe odpowiedzi.
Gareth,
2
Brak określenia języka naprawdę trywializuje to wyzwanie dla mnie. Jak widać poniżej, interpretowane języki z naciskiem na funkcje manipulacji tekstem wyższego rzędu zawsze uzyskują najkrótsze wyniki. Co ma mnie powstrzymać przed zrzuceniem własnego tłumacza za pomocą jednej funkcji, ip (). Mój algorytm współzawodnictwa to teraz „ip: i”. 4 znaki. gotowy.
Gusdor,
3
@Gusdor widzi, jak J i GolfScript wysysają całą przyjemność z Code Golf and Language Handicap i powiązanych pytań dotyczących meta tej strony.
AakashM

Odpowiedzi:

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
tartin
źródło
Wygląda jak mieszanina Q i k: P
skeevey
Cóż, nie zadzwoniłbym dokładnie .QA itp. Q. Są tylko owijarkami ciągów, pod nimi nie ma prawdziwego kodu k. Teraz, gdybym powiedział .q. Miałbym kłopoty.
tmartin
Wydaje
Mogę po prostu powiedzieć Q za 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin
wiem, że to jest bardzo stare, ale ... możesz zapisać 1 bajt {#|:\_x@&x in,/.Q`a`A`n}, gdzie 1 to prawda, a 2 to fałsz
bazgroły
24

Perl, 26 znaków

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

Ocenia wartość 1, gdy $_jest palindromem ""(jedną z fałszywych wartości Perla), gdy nie jest.

Przykładowe użycie:

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__

wynik:

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
tłum
źródło
Cholera, pobiłeś mnie do tego. Chociaż to nie będzie działać poprawnie, jeśli jest _w ciągu, prawda? I nie wymaga żadnych danych wejściowych, więc nie musisz używać tej -popcji?
Gareth,
\Ww wyrażeniach regularnych wyklucza podkreślenie. Obawiam się, że będziesz potrzebować [^a-z\d]w wyrażeniu regularnym. Obawiam się, że i tak mnie pokonano.
John Dvorak,
3
Zapisz jeden za pomocą _|\Wzamiast [_\W].
Howard
1
Możesz skrócić _|\Wdo \Pl: ideone.com/0ufdaQ . Powinny być tylko litery Unicode.
Kobi,
Właściwie to znowu myślę - \Plnie pasuje do cyfr, więc myślę, że _|\Wto najlepsze, co możesz zrobić.
Kobi,
18

Tylko C # 82 :)

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

Nie mogłem oprzeć się pokusie napisania programu bez płyt kotłowych w moim ulubionym języku.

Test jest dostępny tutaj: http://ideone.com/8bwz7z

Cristian Lupascu
źródło
Proste ... ale eleganckie!
Andrew Gray,
@AndrewGray dziękuję za komentarz i za liberalne wymagania techniczne. Płyta kotłowa C # poważnie zwiększa liczbę znaków, dzięki czemu jest niepraktyczna dla golfa.
Cristian Lupascu,
2
Bez problemu Jestem innym programistą C # i lubię pisać zwięzły, wydajny kod. Szkoda, że ​​w tym języku jest tyle bojlerów ...
Andrew Gray
13

GolfScript, 36 34 31 30 znaków

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

Podobny algorytm do mojego poprzedniego (Javascript) rozwiązania .

0"0:A[a{"@{>^}+/- Zoptymalizowane przez Petera Taylora i Howarda. Moja wersja była "/9@Z"{1$<},,2%\;. Howard podarował konkatenację funkcji, a Peter Taylor podarował XOR dla modulo-2. Jest to w zasadzie ogólna metoda porównywania, jeśli wartość jest w sekwencji zakresów.

{.96>32*-}%(11 znaków) nie jest tak naprawdę ulepszeniem w stosunku do Javascript .toUpperCase()(14 znaków), zwłaszcza, że ​​zniekształca niektóre dziwne znaki interpunkcyjne występujące zw tabeli ASCII (co nie ma tutaj znaczenia).

zgodnie z sugestią Petera Taylora, jeśli jednak najpierw odfiltrujemy alfanumeryczne, możemy przekonwertować małe litery i cyfry, ustawiając jeden bit dla każdego znaku: {32|}

.-1%=wykonuje wszystkie palindromowe ciężkie podnoszenie. Jedną z rzeczy, których tak naprawdę nie lubię, jest to, ile czasu zajęło mi znalezienie sposobu na odwrócenie tablicy. Powinienem był przeczytać dokumenty. Pozostałe dwie postacie wykonują zarządzanie stosami i porównywanie.

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


Ponadto, jeśli mogę założyć, że nie występuje żaden z następujących znaków kontrolnych: (ucieczka łącza danych, sterowanie urządzeniem 1-4, potwierdzenie negatywne, synchroniczne bezczynność, koniec bloku transmisji, anulowanie, koniec medium) (wszyscy zgadzamy się, że są to wszystkie dość niejasne) lub jeśli mogę traktować je jako wielkie litery cyfr 0–9, możemy zapisać kolejne dwa znaki:

GolfScript, 28 znaków

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

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

John Dvorak
źródło
2
Możesz pozbyć się posprzątania i zapisać dwa znaki:{"0:A["\{>}+,,2%},
Howard
@ Howard Thanks. Myślę, że źle zrozumiałem +na blokach. To fajna sztuczka.
John Dvorak
1
Możesz zapisać trzy znaki, odwracając filtr i standaryzację wielkości liter. Musisz dodać a{do listy znaków filtru, aby uwzględnić małe litery, ale możesz wtedy wpisać tylko wielkie litery {32|}%. Rezultat końcowy to{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor,
W filtrze można także wprowadzić kolejne oszczędności. Liczenie modulo 2 to xor, więc to 0"0:A[a{"@{>^}+/działa.
Peter Taylor
@PeterTaylor Jeśli wkrótce nie wymyślę kolejnej optymalizacji, prawdopodobnie powinienem przejść na wiki społeczności. Jeszcze raz dziękuję :-)
John Dvorak,
8

JavaScript, 53 znaki:

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

jest wyrażeniem javascript, którego wynikiem jest prawda, jeśli xjest palindromem, lub fałsz, jeśli nie jest. Zakłada się, że xjest łańcuchem. Jeśli to nie jest gwarantowane, przygotujx+="",

Oto bułka tarta: Ze względu na to, jak reverse()działa,

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

zawodzi. Jednak,

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

jest całkowicie w porządku.

John Dvorak
źródło
Miły smakołyk na łączenie zerowego ciągu! Punkty za dobry infoz!
Andrew Gray,
3
Wskazówki: +""rzut na ciąg, +rzut na liczbę |0i ~~rzut na liczbę całkowitą, !!rzut na wartość logiczną.
John Dvorak,
Jest krótszy od wyrażenia regularnego/[^\W_]/g
SuperPrograman
7

R: 66

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

Stosowanie:

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
plannapus
źródło
7

Bash: 52 48 46 znaków

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

Pobiera to żądło, aby sprawdzić jako pierwszy parametr, i ustawia kod wyjścia na 0 dla palindromu i 1 na brak.

Przykładowy przebieg:

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
człowiek w pracy
źródło
7

Python 2: 49 (bez liczenia podpisu metody)

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

Kompletny program z wejściem i wyjściem może być zapisany w 74 znakach.

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

Przykładowe użycie:

$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.txtZawiera 17826 słowo palindrom)

To rozwiązanie można dostosować do Pythona 3, dodając kilka znaków:

Python 3: 55

def f(s):
 s=list(filter(str.isalnum,s.upper()))
 return s==s[::-1]
Bakuriu
źródło
sys.stdin.readjest w zasadzie taki sam jakraw_input
CalculatorFeline
W Pythonie 3.8 możesz to skrócić do 58 bajtów
MilkyWay90
Ponadto twoje rozwiązanie Python 2 i 3 ma odpowiednio 61 bajtów i 67 bajtów.
MilkyWay90
@ MilkyWay90 Prawdopodobnie przegapiłeś nie licząc podpisu metody . W 2013 r. Zwyczajowo go nie włączano. W innym rozwiązaniu tego pytania w innych językach po prostu go pominęli i zakładali, że masz dane wejściowe w szmiennej. Postanowiłem podać pełną definicję, ale jak zwykle w 2013 r., Nie dołączaj podpisu metody w długości
Bakuriu
@ Bakuriu Ach, rozumiem. Byłem tu tylko kilka miesięcy, więc nie znam zwyczajów z 2013 roku
MilkyWay90
7

JAVA (lub najbardziej szczegółowy język w historii), 102 96 95 char

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

Użycie (z nie golfowym kodem):

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

Skrócony za pomocą komentatora poniżej

Jsedano
źródło
1
Chociaż nie znam Java (jestem facetem z C #, dość zabawnym), czy nie możesz uratować 1 postaci, wyjmując nawiasy klamrowe na if? EG: if(s==null) return 1==0;? Czy też Java wymusza curlies na ifwyciągach?
Andrew Gray,
3
Masz całkowitą rację, wyjąłem to, dziękuję !! ... Nie zauważyłem, że tam były, chyba jestem programistą Java, który nie obsługuje C #?
jsedano
4
1) Sprawdzanie, czy parametr jest nulldobrym nawykiem, ale nie jest praktykowany w CodeGolf. Jak mogę powiedzieć, nikt inny nie zrobił tego w tym pytaniu. Pomiń to. 2) Odstęp między argumentami poprawia czytelność, ale nie gra w golfa. Usunąć to; 3) Zamiast jawnie toLowerCase()użyć łańcucha equalsIgnoreCase()później zamiast equals(). W ten sposób musisz dostosować wyrażenie regularne, ale nadal o 1 znak krótszy. pastebin.com/s7H84faj
manatwork
1
replaceAll("[^A-Za-z0-9]","")=>replaceAll("\\W","")
assylias
Właściwie: też replaceAll("\\W|_","");usunąć _=> 95 znaków
assylias
7

Mathematica 54 53

Jeden bajt zapisany dzięki CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Dla osób z wersją 10.2 lub wcześniejszą:

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

Przykład

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

Prawdziwe

DavidC
źródło
PalindromeQjest o 1 bajt krótszy niż#==Reverse@#&
CalculatorFeline
Zastanawiałem się, dlaczego nigdy tego nie widziałem. Wersja 10.3!
DavidC,
PalindromeQ= #==Reverse@#&
CalculatorFeline
Tak, pobrałem wersję 10.4, aby ją wypróbować.
DavidC,
To jest koniec? OHNO
CalculatorFeline
6

J, 30 znaków

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

Stosowanie:

   */(=|.)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
Gareth
źródło
6

k ( 50 48 45 38 znaków)

Pomija wszystkie błędy, zwracając wartość domyślną 0b(false).

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

Przykład:

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

edycja: ogolono jeszcze trzy znaki, unikając zmiennej pośredniej. H / T, CS. -7: Nie trzeba tłumić błędów.

skeevey
źródło
1
ciekawe, że przy zaledwie 3 znakach mój kod jest znacznie bardziej czytelny :-)
John Dvorak
Dodatkowy zwęglarz wślizgnął się, usunąłem go.
skeevey
5

Rubin: 43 38 znaków

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
1
Możesz nawet pisaćs.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard
Człowieku, jak długo łączyłem się w stosowaniu !metod! Zachowujesz mnie niesamowicie @Howard swoimi sztuczkami.
manatwork
Mały problem, @Howard. tri tr!wydaje się zachowywać inaczej, gdy nie mają nic do transliteracji: pastebin.com/4YThW2qN Powoduje p['757']to awarię testu z „NoMethodError: niezdefiniowana metoda„ upcase! ” dla błędu zero: NilClass ”.
manatwork
UPS przepraszam. Nie myślałem o tej sprawie.
Howard
1
można dodatkowo skrócić:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu
5

C ++, 107 (błędnie policzony), 100 (błędnie policzony), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Wykorzystuje wzorce bitowe ASCII.
  • Polega na złu using namespace std;.
  • Używa bitowego AND i OR zamiast operatorów logicznych.
  • Używa, intponieważ jest krótszy niż charlub 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;
    }
    
Adrian McCarthy
źródło
4

Lua, 56 lat

a=io.read"*l":lower():gsub("%W","")print(a:reverse()==a)
mniip
źródło
Jeśli %Wjest coś \Ww wyrażeniu regularnym, wyklucza także znaki takie jak podkreślenie. To jest niepożądane.
John Dvorak,
sprawdziłem, %wnie obejmuje _( %Woczywiście obejmuje to, więc)
mniip
1
Potrzebne jest tylko ciało funkcyjne. s=s:lower():gsub('%W','')return s:reverse()==s 46 znaków
Egor Skriptunoff
ale cofunction(s)
mniip
4

Python 3/2 59 znaków:

def pld(i):
   p=[c for c in i.lower() if c.isalnum()]
   return(p == p[::-1])
Amith KK
źródło
4

Haskell, 43

Przy użyciu standardowych bibliotek Control.Monad, Control.Monad.Instancesoraz Data.Char:

ap(==)reverse.map toLower.filter isAlphaNum
Jon Purdy
źródło
Nie mogę tego zrobić w Ghci. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumnie robi to z dodawaniem spacjami lub takie, przepraszam, nie jestem zbyt chętnie z Haskell :)
SlimJim
1
@SlimJim: Ups, potrzebujesz Control.Monad.Instancesrównież. (Używam instancji monada czytelnikowi ap, ale to wystąpienie nie jest eksportowana przez Control.Monad.)
Jon Purdy
4

PHP 60 znaków.

Najpierw spróbuj na codegolf.

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

Przykład:

$c='Eva, can I stab bats in a cave?';
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
//prints 1
Carlos Goce
źródło
Nawiasy wokół pierwszego operandu operatora trójskładnikowego nie są potrzebne. W rzeczywistości ani operator trójskładnikowy nie jest potrzebny - po prostu wypisz true lub false w reprezentacji twojego języka. I unikając oddzielnego komunikatu dla przypisania do $ x 1 więcej charakteru może być skrócona: 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]
abhiram
źródło
@manatwork Jeśli zastąpisz wszystkie identyfikatory jednym identyfikatorem postaci, uzyskasz 77wersję postaci. Nie mam pojęcia, dlaczego abhiram opublikował wersję bez golfa.
Bakuriu
@ Bakuriu, nieważne, brakowało mi jednego zdania w pytaniu: „Potrzebne są tylko ciała metod”. Chociaż linie 2 i 3 dają mi tylko 73 znaki. Jeśli chodzi o dalsze zmniejszanie długości, nie ma potrzeby używania surowego łańcucha i grupy przechwytywania, dzięki czemu re.findall('[a-z0-9]+',input.lower())znaki z części 3 są krótsze.
manatwork
@manatwork, edytowałem post i trochę zmieniłem zmienne. To obniżyło go do 66. Tak, atrybut surowego ciągu nie ma tu zastosowania.
abhiram
Ok, ale dlaczego nalegasz na grupę przechwytującą w wyrażeniu regularnym? Działa poprawnie bez: pastebin.com/JzpNRRZU
manatwork
Wydaje mi się, że to przyszło mi do głowy po moim ostatnim projekcie Pythona z udziałem re :) Dziękuję za zwrócenie na to uwagi.
abhiram
3

Haskell 48

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

używane w ten sposób:

(\x->x==reverse x).map toLower.filter isAlphaNum$"Eva, can I stab bats in a cave?"
SlimJim
źródło
3

Smalltalk , Squeak / Pharo o smaku
116 znaków przy użyciu tradycyjnego formatowania z zakładkami

Dodajesz dwie metody do ciągu:

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

Możemy oczywiście wyeliminować niektóre spacje lub użyć krótszych nazw metod, ale nie zdradzajmy ducha Smalltalk.

Co więcej, będzie to obsługiwać francuskie palindromy, jak w http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais , niewiele odpowiedzi na tej stronie może.

['Léon a trop par rapport à Noël' isPalindrome] assert.
aka.nice
źródło
Sprytna i przydatna odpowiedź!
Andrew Gray,
3

Python 3 (51 znaków)

i może być Python 2

oparty na rozwiązaniu abhiram (z bardziej agresywnym golfem)

from re import findall

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

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

można skrócić do 46 znaków, używając RE '\ w'

i wariant z ekstremalnie skróconym korpusem funkcyjnym (27 znaków)

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: ')))
AMK
źródło
2

Windows PowerShell, 56 47 45 znaków

Zaktualizowano (patrz komentarze) i można usunąć nawiasy kwadratowe wokół wyrażenia regularnego:

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

Oryginał (56)

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

Oryginał bez golfa:

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev
goric
źródło
Możesz zagrać w golfa do 47 takich znaków:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD
@SpellingD: Fajnie! Jestem nowy w golfie dzięki, dzięki za ulepszenia
goric
można usunąć prawy nawias również: ($s=$s-replace'\W')-eq-join$s[$s.length..0].
mazzy
2

C ++, 74 bajty

Ten kod jest naprawdę bardzo elegancki i łatwy do zrozumienia (gdy jest poprawnie sformatowany). Nie sądzę, że można skrócić C ++ i nie używa on żadnych standardowych funkcji bibliotecznych.

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

Przykładowe użycie:

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

Ładnie sformatowana wersja:

p(auto c)
{
    auto e=c;
    while(*e) ++e;
    --e;
    while(*e==*c & e>c)--e,++c;
    return e<=c;
}
J. Antonio Perez
źródło
1
error: ISO C++ forbids declaration of ‘p’ with no typetwoja funkcja powinna mieć typ zwracany.
Karl Napf
Założę się, że to nie ignoruje wielkości liter, białych znaków i znaków kontrolnych.
Tytus
Możesz zapisać postać za pomocą while(*++e);zamiast while(*e)++e;. Ale jak wspomniał Tytus, ta odpowiedź jest nieprawidłowa.
Nick Matteo,
2

PHP, 26 84 80 78 62 63 bajty

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

pobiera dane wejściowe z argumentu pierwszego wiersza poleceń; drukuje 1dla prawdy, pusty ciąg dla fałszu.


I18n jest małym rozszerzeniem, ponieważ nie ma wielobajtowej alternatywy dla strrev(110 bajtów; uruchom z -r):

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

utf8_strrev rażąco skradziony z podręcznika PHP . Możesz także rzucić okiem na ten post na blogu .

Tytus
źródło
Chodź Tytus ... To nie spełnia specyfikacji.
Christoph
1
@Christoph Tak, czasami powinienem to w pełni przeczytać. Naprawiony.
Tytus
Hm -Rspowodowałby problemy z łamaniem linii w łańcuchu do przetestowania, prawda? Ze specyfikacji „-R <kod> Uruchom PHP <kod> dla każdej linii wejściowej”. Ponadto <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;byłby krótszy.
Christoph
1
@Christoph Fajny pomysł, ale nie ma $argnbez niego -R.
Tytus
$argv[1]="O Genie, der Herr ehre dein Ego!"; # :D
Tytus
1

Ruby, 48

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

Całkiem proste i pospiesznie wykonane, więc nie grałem zbyt dużo w golfa. Będę grał w golfa później.

Klamka
źródło
1

Pylongolf2 , 24 bajty

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

cpobiera dane wejściowe, ╨2aby przekonwertować na małe litery.
Następnie wypycham wyrażenie regularne na stos i używam -do usunięcia wszystkich znaków niealfabetycznych z danych wejściowych.
_powiela dane wejściowe.
╨1odwraca go, a =następnie porównuje.
~drukuje stos na końcu, który drukuje albo truealbo false.


źródło
Czy to ignoruje znaki interpunkcyjne, białe znaki i znaki kontrolne?
MickyT,
Moja zła, ta wersja nie. Naprawię to.
Naprawiono problem.
1

PowerShell, 194 190 bajtów

Rekurencyjna implementacja pokazująca, jak nienazwany blok skryptowy PowerShell może się nazywać.

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

bez golfa:

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

testy:

&$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"
Bevo
źródło
Nie powinno tak być [^a-z0-9]?
Tytus
1

05AB1E , 4 bajty (niekonkurujące)

Nie konkuruje , ponieważ język jest późniejszy niż wyzwanie. Kod:

álÂQ

Wyjaśnienie:

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
Próbowałem uruchomić go za pomocą linku. Wyjście programu to „1”
Christopher Perry,
1

Galaretka, 10 znaków (niekonkurujących)

fØBŒl
UÇ⁼Ç

Zwraca 1 jeśli prawda, 0 jeśli fałsz

Wypróbuj online!

X88B88
źródło
Czy ignoruje wielkość liter, białe znaki i znaki kontrolne? Podział byłby miły.
Tytus
Obecny stan Jelly pozwala na rozwiązanie tego w 7 bajtów: fØBŒlŒḂ: ffiltr do utrzymania ØBzestawu [a-zA-0-9] i Œlnawróconego na małe litery, a następnie ŒḂtestu jeśli palindrom.
steenbergh,