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


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.