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!


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

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


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

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


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


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.


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

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

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]

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


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


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

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.


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

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;
    }
    

4

Lua, 56 lat

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

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

4

Haskell, 43

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

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

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

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]

@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?"

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.

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: ')))

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

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;
}

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 .


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.


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.


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"

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! .


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!


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.