Найкоротший код, щоб визначити, чи є рядок паліндром


42

Паліндром деяка рядок , яка пишеться точно так же , як назад і вперед. Наприклад, "Єва, чи можу я колоти кажанів у печері?" є паліндром (EVACANISTAB | BATSINACAVE)

Для цього коду гольф, використовуючи мову, яку ви обрали, визначте, чи дана рядок є паліндром чи ні.

Випадки кромки:

  • Пунктуація не зараховується до паліндромності.
  • Контрольні символи не зараховуються до паліндромності.
  • Пробіл не зараховується до паліндромності.
  • Числа зараховуються до паліндромності.
  • Справа в цьому виклику не зараховується до паліндромності.
  • Немає обмежень у довжині рядків для оцінки, за винятком того, що накладається вашою мовою на вибір.
  • Для цього завдання обмежтеся набором символів ASCII.

Технічні вимоги:

  • Потрібні лише органи методу; додаткові речі, такі як підписи методів, декларації структури даних тощо, не враховуються до вимоги перемоги.
  • Код повинен компілювати чи інтерпретувати без помилок чи винятків у процесі компіляції.
  • Код не повинен викидати жодних необроблених винятків чи збоїв. (Майже не треба говорити. Майже.)
  • Код повинен повернути деяке значення, що вказує на паліндромність. Тип даних залежить від мови, якою ви користуєтесь (наприклад, користувач C # може використовувати a bool, тоді як користувач JavaScript може використовувати var.)
  • Ви не можете писати власного перекладача, який виконує це завдання як "рідний", щоб ви могли "гольфувати" майже виграшний рахунок. (Сподіваюся, зайве сказати.)

Умова перемоги:

  • Виграє найкоротший код у символах.

Поточний керівник: tmartin (k, 25 символів)

... Хочете чарівної зеленої галочки своєю відповіддю? Побийте відповідь цього хлопця!


1
Чи є введення / виведення частиною виклику, або функціонує орган?
Джон Дворак

1
"Хлібні сухарі", які показують, як удосконалюється робота, доступні на всьому веб-сайті у всіх відповідях через історію редагування. Немає необхідності мати повну історію в поточній версії відповіді.
Пітер Тейлор

1
@WernerCD Я впевнений, що ОП змінить, хто отримає зелений галочок, коли він повернеться, щоб перевірити нові відповіді.
Гарет

2
Невказання мови насправді тривіально для мене це завдання. Як видно нижче, інтерпретовані мови з акцентом на функції маніпулювання текстом високого порядку завжди отримують найменші результати. Що змусити мене зібрати мого власного перекладача з однією функцією, ip (). Мій алгоритм конкуренції зараз 'ip: i'. 4 символи. зроблено.
Гусдор

3
@Gusdor дивіться, що J та GolfScript висмоктують усе задоволення від коду та мови, пов'язаного з гандикапом, та пов'язаних питань з мета цього сайту.
АакашМ

Відповіді:


29

К, 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 і k: P
skeevey

Ну, я б точно не називав .QA і т. Д. Q. Вони просто обгортки для рядків, під ними немає реального k-коду. Тепер, якби я сказав .q.inter, я б зазнав неприємностей.
tmartin

Я думаю, що це випадок кайфу над семантикою, але вони визначені в qk
skeevey

Можна просто сказати, Q: 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

я знаю, що це дуже давно, але ... ви можете зберегти 1 байт за допомогою {#|:\_x@&x in,/.Q`a`A`n}, 1 - це правда, а 2 - помилково
скрап

24

Perl, 26 char

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

Оцінює до 1, коли $_є паліндром, ""(одне з помилкових значень Перла), коли це не так.

Використання зразка:

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__

вихід:

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

Чорт, ти побив мене до цього. Хоча це не буде працювати належним чином, якщо є _рядок, чи не так? І це не займає ніяких даних, тому вам не потрібно буде використовувати цей -pпараметр?
Гарет

\Wу регулярних виразах виключається підкреслення. Я боюся, що вам знадобиться [^a-z\d]у вашому регексе. Боюся, що мене все одно побили.
Джон Дворак

3
Збережіть один за допомогою, _|\Wа не [_\W].
Говард

1
Ви можете скоротити його _|\Wдо \Pl: ideone.com/0ufdaQ . Повинні бути лише літери Unicode.
Кобі

Власне, ще раз замислившись - \Plне відповідатиме цифрам, тож я здогадуюсь _|\Wнайкращого, що ти міг зробити.
Кобі

18

Тільки C # 82 :)

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

Не втримався від спокуси написати програму без котлів на моїй улюбленій мові.

Тест доступний тут: http://ideone.com/8bwz7z


Просте ... але елегантне!
Ендрю Грей

@AndrewGray дякую за коментар та за дозвільні Технічні вимоги. Котяча плита C # вкрай серйозно доповнює кількість карт, що робить інакше недоцільним для гольфу.
Крістіан Лупаску

2
Без проблем. Я співробітник C # dev, і мені подобається писати короткий, ефективний код. Соромно, що стільки котлів на мові ...
Ендрю Грей

13

GolfScript, 36 34 31 30 символів

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

Аналогічний алгоритм, як у попереднього рішення Javascript .

0"0:A[a{"@{>^}+/- Оптимізовано Пітером Тейлором та Говардом. Моя версія була "/9@Z"{1$<},,2%\;. Говард пожертвував конкатенацію функції, а Пітер Тейлор подарував XOR для модуля-2. Це в основному загальний метод порівняння, якщо значення знаходиться в послідовності діапазонів.

{.96>32*-}%(11 символів) насправді не є покращенням порівняно з Javascript .toUpperCase()(14 символів), тим більше, що він маніпулює якимись дивними пунктуаціями, які випливають zіз таблиці ASCII (що тут не має значення).

як запропонував Пітер Тейлор, однак, якщо спочатку відфільтрувати буквено-цифрові цифри, ми можемо перетворитись на малі й цифрові цифри, встановивши по одному біту в кожному символі: {32|}

.-1%=робить усі паліндромні важкі підйоми. Одна частина, яку я не дуже люблю, - це те, як довго знадобилося мені, щоб дізнатися, як повернути масив. Я повинен був прочитати документи. Інші два символи виконують управління стеком та порівняння.

Тест: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7IjA6QVtheyJcez59KywsMiV9LHszMnx9JS4tMSU9


Далі, якщо я можу припустити, що немає жодного з наступних контрольних символів: (вихід каналу передачі даних, управління пристроєм 1-4, негативне підтвердження, синхронний режим очікування, кінець блоку передачі, скасування, кінець середовища) (ми всі згодні, що це всі досить незрозумілі) або якщо я можу розглянути їх як великі версії цифр 0-9, ми можемо зберегти ще два символи:

GolfScript, 28 символів

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

Тест: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7IkB7Pl59Ky99LC4tMSU9


2
Ви можете позбутися від прибирання та зберегти два шари:{"0:A["\{>}+,,2%},
Говард

@Howard Спасибі Я думаю, що я неправильно зрозумів +на блоки. Це класна хитрість.
Джон Дворак

1
Ви можете зберегти три символи, змінивши фільтр та стандартизацію регістру. Ви повинні додати a{до списку символів фільтра, щоб увійти малі літери, але потім ви можете просто використовувати великі регістри {32|}%. Кінцевий результат{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Пітер Тейлор

Також є ще одна економія на фільтрі. Підрахунок за модулем 2 - це xor, так 0"0:A[a{"@{>^}+/це робить і робота.
Пітер Тейлор

@PeterTaylor Якщо я незабаром не придумаю іншої оптимізації, я, мабуть, повинен перейти на вікі спільноти. Ще раз дякую :-)
Джон Дворак

8

Javascript, 53 символи:

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

це вираз javascript, який оцінює як true, якщо xє паліндром, до false, якщо він не є. Це передбачає x, що це рядок. Якщо це не гарантується, передбачтеx+="",

Ось підсумок: Завдяки тому, як reverse()працює,

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

не вдається. Однак,

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

ідеально добре.


Приємний ласощі, що поєднує нульовий рядок! Бали за хороший інфоз!
Ендрю Грей

3
Підказки: +""закидання на рядок, +закидання в ряд, |0і ~~приведення до цілого, !!закидання до логічного.
Джон Дворак

Чи є короткіше з регексом/[^\W_]/g
SuperPrograman

7

R: 66

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

Використання:

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

Баш: 52 48 46 символів

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

Це вимагає перевірки як перший параметр і встановлює вихідний код 0 для паліндром і 1 для не.

Проба зразка:

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 (без підрахунку підпису методу)

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

Повна програма з введенням і виходом може бути записана в 74 символи.

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

Приклад використання:

$echo 'Eva,can I stab bats in a cave?' | python palindrome.py
True 
$ cat huge_palindrome.txt | python palindrome.py
True
$echo 'Able was I ere i SaW elBa' | python palindrome.py                                                                   
True                                         

( huge_palindrome.txtмістить це 17 826 слово паліндром)

Це рішення можна адаптувати до python 3, додавши деякі символи:

Пітон 3: 55

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

sys.stdin.readв основному те саме, щоraw_input
CalculatorFeline

У Python 3.8 ви можете скоротити це до 58 байт
MilkyWay90

Крім того, ваше рішення Python 2 & 3 має 61 байт і 67 байт відповідно.
MilkyWay90

@ MilkyWay90 Ви, мабуть, пропустили, не рахуючи підпис методу . У 2013 році прийнято не включати його. В іншому рішенні цього питання іншими мовами вони просто опустили його і вважали, що ви маєте вхід у sзмінну. Я вирішив надати повне визначення, але, як це прийнято в 2013 році, не включати підпис методу в довжину
Bakuriu

@Bakuriu Ах, бачу. Я тут був лише кілька місяців, тому не знаю звичаїв з 2013 року
MilkyWay90,

7

JAVA (або найголовніша мова коли-небудь), 102 96 95 char

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

Використання (з кодом, який не використовується для гольфу):

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

Скорочено за допомогою коментатора нижче


1
Хоча я не знаю Java (я хлопець C #, досить смішний), чи не вдалося врятувати 1 персонажа, знявши фігурні дужки на if? EG if(s==null) return 1==0;:? Або Java накладає фігури на ifзаяви?
Ендрю Грей

3
Ви абсолютно праві, я вирішив вам спасибі !! ... Я не помітив, що вони там були, я думаю, що я розробник Java, який не має C #?
jsedano

4
1) Перевірка, чи є параметр nullкорисною звичкою, але не практикується в CodeGolf. Як я можу сказати, ніхто більше цього не робив у цьому питанні. Пропустити це. 2) Простір між аргументами допомагає читати, але не грати в гольф. Видали це; 3) Замість явного toLowerCase()рядка використовуйте equalsIgnoreCase()пізніше замість equals(). Таким чином ви повинні налаштувати регулярний вираз, але все ж на 1 символ коротший. pastebin.com/s7H84faj
manatwork

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

Власне: replaceAll("\\W|_","");для видалення _теж => 95 символів
assylias

7

Математика 54 53

Один байт збережено завдяки CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Для версій 10.2 або новішої версії:

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

Приклад

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

Правда


PalindromeQна 1 байт коротше, ніж#==Reverse@#&
CalculatorFeline

Мені було цікаво, чому я ніколи цього не бачив. Версія 10.3!
DavidC

PalindromeQ= #==Reverse@#&
CalculatorFeline

Так, я завантажив версію 10.4, щоб спробувати його.
DavidC

Це поза? OHNO
КалькуляторFeline

6

J, 30 символів

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

Використання:

   */(=|.)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 символів)

Пригнічує всі помилки, повертаючи за замовчуванням 0b(false).

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

Приклад:

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

редагувати: поголив ще три символи, уникаючи проміжної змінної. H / T, CS. -7: Не потрібно придушувати помилки.


1
Цікаво, що лише на 3 символи більше мій код читається :-)
Джон Дворак

Додатковий шар засунувся, я його зняв.
skeevey

5

Рубі: 43 38 символів

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

Проба зразка:

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
Можна навіть написатиs.tr!('^A-Za-z0-9','').upcase!.reverse==s
Говард

Людина, як довго я поєднувався навколо використання !методів! Ви продовжуєте дивувати мене @Howard своїми хитрощами.
манатура

Хоча невелика проблема, @Howard. trі, tr!схоже, поводяться по-іншому, коли їм нічого не потрібно транслітерувати: pastebin.com/4YThW2qN Це робить p['757']тест до краху з "NoMethodError: undefined метод` upcase! " для nil: помилка NilClass ”.
манатура

На жаль, вибачте. Не думав про цю справу.
Говард

1
можна скоротити далі:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Крістіан Лупаску

5

C ++, 107 (неправильно), 100 (неправильно), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Експлуатує бітові шаблони ASCII.
  • Покладається на зло using namespace std;.
  • Використовує побітові І і АБО замість логічних операторів.
  • Використовується, intоскільки він коротший charабо 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

Луа, 56

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

Якщо що- %Wнебудь схоже \Wна регулярному вираженні, воно також виключає символи, як підкреслення. Це небажано.
Джон Дворак

Я перевірив, %wне включає _( %Wочевидно, включає його тоді)
mniip

1
Потрібен лише функціональний орган. s=s:lower():gsub('%W','')return s:reverse()==s 46
годин

а як жеfunction(s)
mniip


4

Хаскелл, 43

Використовуючи стандартні бібліотеки Control.Monad, Control.Monad.Instancesі Data.Char:

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

Я не можу змусити це працювати в ghci. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumні з додаванням пробілів, ні пробачте, я не дуже захоплююсь Haskell :)
SlimJim,

1
@SlimJim: На жаль, вам також потрібно Control.Monad.Instances. (Я використовую монетарний екземпляр Reader ap, але цей екземпляр не експортується Control.Monad.)
Джон Перді,

4

PHP 60 символів.

Спочатку спробуйте кодогольф.

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

Приклад:

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

Дужки навколо першого операнда потрійного оператора не потрібні. Насправді не потрібен ні термінальний оператор - просто виведіть істинне чи хибне в представленні вашої мови. І, уникаючи окрему заяву для призначення на $ х 1 більше характеру може бути скорочено: echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
манастирство

3

Python 2 64 Charecters:

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

@manatwork Якщо замінити всі ідентифікатори одним ідентифікатором символів, ви отримаєте версію 77символів. Не маю ідеї, чому Абхірам опублікував версію, що не має волі.
Бакуріу

@ Bakuriu, неважливо, я пропустив одне твердження у запитанні: «Потрібні лише органи методу». Хоча рядки 2 і 3 дають мені лише 73 символи. Що стосується подальшого скорочення довжини, немає необхідності в необробленому рядку та групі захоплення, що робить re.findall('[a-z0-9]+',input.lower())символи частини 3 коротшими.
манатура

@manatwork, я відредагував публікацію і трохи змінив змінні. Це зводило його до 66. Так, атрибут необробленого рядка тут не приносить користі.
abhiram

Гаразд, але чому ви наполягаєте на захопленні групи в регулярному виразі? Працює правильно без: pastebin.com/JzpNRRZU
манатура

Я думаю, що це наздогнало мене після мого недавнього пітонського проекту, що стосується re's :) Дякую, що вказав на це.
abhiram

3

Haskell 48

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

використовується так:

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

3

Малий розмов , скрип / фаро аромат
116 символів, використовуючи традиційне форматування з вкладками

До String ви додаєте два способи:

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

Ми, звичайно, можемо усунути деякі пробіли або використовувати короткі назви методів, але не давайте зраджувати духу Smalltalk.

Більше того, це стосуватиметься французьких паліндромів, як, наприклад, у http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais , на цій сторінці можна знайти не так багато відповідей.

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

Розумна і корисна відповідь!
Ендрю Грей

3

Python 3 (51 char)

і може бути Python 2

на основі розчину abhiram (з більш агресивним гольфу)

from re import findall

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

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

може бути скорочено до 46 знаків, використовуючи RE '\ w'

і варіант з надзвичайно скороченою функцією корпусу (27 символів)

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 символів

Оновлено (див. Коментарі) та може видалити дужки навколо регулярного виразу:

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

Оригінал (56)

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

Оригінальний Un-golfed:

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

Ви можете грати в гольф до 47 символів, як це:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
ПравописD

@SpellingD: Приємно! Я новачок у
кодовому гольфі

Ви можете видалити праву дужку також: ($s=$s-replace'\W')-eq-join$s[$s.length..0].
маззи

2

C ++, 74 байти

Цей код насправді дуже елегантний і легкий для розуміння (коли він правильно відформатований). Я не вірю, що можна скоротити C ++, і він не використовує стандартних функцій бібліотеки.

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

Приклад використання:

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

Добре відформатована версія:

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 typeВаша функція повинна мати тип повернення.
Карл Напф

Б'юсь об заклад, що це не ігнорує регістри, пробіли та контрольні символи.
Тит

Можна зберегти персонаж за допомогою, while(*++e);а не while(*e)++e;. Але, як згадував Тит, ця відповідь недійсна.
Нік Маттео

2

PHP, 26 84 80 78 62 63 байт

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

приймає вхід з аргументу першого командного рядка; відбитки 1для правди, порожня рядок для помилки.


I18n є суттєво експансивним, оскільки не існує багатобайтової альтернативи strrev(110 байт; запускається з -r):

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

utf8_strrev відверто викрадено з керівництва PHP . Ви також можете поглянути на цю публікацію в блозі .


Давай Титу ... Це не вдається специфікації.
Крістоф

1
@Christoph Так, я іноді повинен повністю читати це. Виправлено.
Тит

Hm, це -Rпризведе до проблем з розривами рядків у рядку, щоб перевірити, чи не так? Від специфікації "-R <code> Запустити PHP <code> для кожного рядка введення". Причому <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;було б коротше.
Крістоф

1
@Christoph Приємна ідея, але $argnбез цього не обійтися -R.
Тит

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

1

Рубі, 48

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

Досить просто, і поспішно зроблено, щоб не грати занадто багато в гольф. Я буду гольфу пізніше.


1

Пілонгольф2 , 24 байти

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

cбере вхід, ╨2щоб перетворити на малі регістри.
Потім я натискаю регулярний шрифт на стек і використовую -для видалення всіх не алфавітних символів у вводі.
_дублює введення.
╨1реверсує його, а =потім порівнює їх.
~друкує стек в кінці, який друкує або trueабо false.


Це ігнорує розділові знаки, пробіли та контрольні символи?
MickyT

Моє погано, ця версія ні. Я це виправлю.

Виправлена ​​проблема.

1

PowerShell, 194 190 байт

Рекурсивна реалізація, яка показує, як неназваний сценарій блоку PowerShell може викликати себе.

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

неозорений:

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

тести:

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

Хіба це не повинно бути [^a-z0-9]?
Тит

1

05AB1E , 4 байти (не конкуруючий)

Неконкурентовані , оскільки мова висуває виклик. Код:

álÂQ

Пояснення:

á     # 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 . Спробуйте в Інтернеті! .


Спробував запустити його через ваше посилання. Вихід програми "1"
Крістофер Перрі

1

Желе, 10 персонажів (неконкуренто)

fØBŒl
UÇ⁼Ç

Повертає 1, якщо вірно, 0, якщо неправдиво

Спробуйте в Інтернеті!


Чи він ігнорує регістри, пробіли та контрольні символи? Поломка була б непогана.
Тит

Поточний стан Желе дозволяє вирішувати це в 7 байт: fØBŒlŒḂ: fфільтр , щоб зберегти ØBбезліч [A-Za-Z0-9] і Œlзверненого до нижнього регістра, то ŒḂвипробування , якщо паліндром.
steenbergh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.