Кратчайший код, чтобы определить, является ли строка палиндромом

42

Палиндром некоторая строка , которая пишется точно так же , как назад и вперед. Например, «Ева, я могу заколоть летучих мышей в пещере?» такое палиндром (EVACANISTAB | BATSINACAVE)

Для этого кода гольф, используя язык по вашему выбору, определяет, является ли данная строка палиндромом или нет.

Краевые случаи:

  • Пунктуация не засчитывается в палиндромность.
  • Контрольные символы не засчитываются в палиндромность.
  • Пробелы не засчитываются в палиндромность.
  • Числа засчитываются в пользу палиндромности.
  • Дело в этом вызове не засчитывается в палиндромность.
  • Длина строк для оценки не ограничена, за исключением того, что навязывается выбранным вами языком.
  • Для этого испытания ограничьте себя набором символов ASCII.

Технические требования:

  • Нужны только тела метода; дополнительные вещи, такие как сигнатуры методов, объявления структур данных и т. д., не учитываются в требовании победы.
  • Код должен компилироваться или интерпретироваться без ошибок или исключений во время компиляции.
  • Код не должен выбрасывать необработанные исключения или сбои. (Почти не нужно говорить. Почти.)
  • Код должен возвращать некоторое значение, указывающее на палиндромность. Тип данных зависит от используемого вами языка (например, пользователь C # может использовать a bool, тогда как пользователь JavaScript может использовать a var.)
  • Вы не можете написать своего собственного переводчика, который выполняет эту задачу как «нативную» возможность, чтобы вы могли «сыграть в гольф» с почти выигрышным счетом. (Надеюсь, само собой разумеется.)

Условие победы:

  • Самый короткий код в символах выигрывает.

Текущий лидер: tmartin (k, 25 символов)

... Хотите волшебную зеленую галочку своим ответом? Удар ответ этого парня!

Эндрю Грей
источник
1
Является ли ввод / вывод частью задачи или функциональным органом?
Джон Дворак
1
«Хлебные крошки» для демонстрации того, как доработана работа, доступны по всему сайту во всех ответах через историю изменений. Нет необходимости иметь полную историю, видимую в текущей версии ответа.
Питер Тейлор
1
@WernerCD Я уверен, что ОП изменится, кто получит зеленую галочку, когда он вернется, чтобы проверить новые ответы.
Гарет
2
Не указание языка действительно упрощает эту задачу для меня. Как показано ниже, интерпретируемые языки с упором на функции обработки текста высокого порядка всегда получают кратчайшие результаты. Что мешает мне собрать свой собственный интерпретатор с одной функцией, ip (). Мой алгоритм соревнования теперь называется «ip: i». 4 персонажа. сделанный.
Гусдор
3
@Gusdor см. J и GolfScript высасывают все удовольствие из Code Golf и Language Handicap и связанных с этим вопросов в мета сайта.
AakashM

Ответы:

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
tmartin
источник
Выглядит как смесь Q и k: P
skeevey
Ну, я бы точно не назвал .QA и т. Д. Q. Они просто строковые обертки, под ними нет реального кода. Теперь, если я скажу .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 символов

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

Значение $_равно 1, когда это палиндром, ""(одно из ложных значений Perl), когда это не так.

Пример использования:

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%},
Говард
@ Говард Спасибо. Я думаю, что я неправильно понял +на блоках. Это крутой трюк.
Джон Дворак
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
plannapus
источник
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
manatwork
источник
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]
Bakuriu
источник
sys.stdin.readв основном так же, какraw_input
CalculatorFeline
В Python 3.8 вы можете сократить это до 58 байт
MilkyWay90
Кроме того, ваше решение Python 2 & 3 составляет 61 байт и 67 байт соответственно.
MilkyWay90
@ MilkyWay90 Вы, вероятно, пропустили, не считая сигнатуру метода . В 2013 году принято не включать его. В другом решении этого вопроса на других языках они просто пропустили его и предположили, что у вас есть вход в sпеременную. Я решил предоставить полное определение, но, как это принято в 2013 году, в длину не включайте сигнатуру метода
Бакуриу
@Bakuriu Ах, я вижу. Я был здесь всего несколько месяцев, так что я не знаю обычаев с 2013 года
MilkyWay90
7

JAVA (или самый многословный язык) 102 96 95 символов

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

Укороченный с помощью комментатора ниже

jsedano
источник
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

Mathematica 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?"]

Правда

DavidC
источник
PalindromeQна 1 байт короче#==Reverse@#&
CalculatorFeline
Я задавался вопросом, почему я никогда не видел это. Версия 10.3!
DavidC
PalindromeQ= #==Reverse@#&
КалькуляторFeline
Да, я скачал v. 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
Gareth
источник
6

к ( 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: нет необходимости подавлять ошибки.

skeevey
источник
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
manatwork
источник
1
Вы даже можете написатьs.tr!('^A-Za-z0-9','').upcase!.reverse==s
Говард
Чувак, как долго я комбинировал использование !методов! Вы продолжаете удивлять меня @Howard своими хитростями.
manatwork
Небольшая проблема, @Howard. trи, tr!кажется, ведет себя иначе, когда им нечего транслитерировать: pastebin.com/4YThW2qN Это приводит p['757']к сбою теста с «NoMethodError: неопределенный метод` upcase! ' для nil: NilClass ».
manatwork
Ой, извини. Не думал об этом случае.
Говард
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)
мниип
4

Python 3/2 59 символов:

def pld(i):
   p=[c for c in i.lower() if c.isalnum()]
   return(p == p[::-1])
Амит КК
источник
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 символов.

Сначала попробуйте на Codegolf.

//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
Карлос Гоце
источник
Круглые скобки вокруг первого операнда троичного оператора не нужны. На самом деле ни один троичный оператор не нужен - просто выведите true или false в представлении вашего языка. И, избегая отдельное заявление для назначения на $ х 1 больше характера может быть сокращено: echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
manatwork
3

Python 2 64 Персонажи:

i =''.join(re.findall('[a-z0-9]+',i.lower()))
return i==i[::-1]
abhiram
источник
@manatwork Если вы замените все идентификаторы однозначными идентификаторами, вы получите 77версию символов. Понятия не имею, почему Абхирам опубликовал версию без гольфа.
Бакуриу
@Bakuriu, не бери в голову, я пропустил одно утверждение в вопросе: «Нужны только тела метода». Хотя строки 2 и 3 дают мне только 73 символа. Что касается дальнейшего сокращения длины, нет необходимости в необработанной строке и группе захвата, что делает re.findall('[a-z0-9]+',input.lower())часть 3 символов короче.
manatwork
@manatwork, я отредактировал пост и немного изменил переменные. Это снизило его до 66. Да, атрибут необработанной строки здесь бесполезен.
Абхирам
Хорошо, но почему вы настаиваете на захвате группы в регулярном выражении? Работает правильно без: pastebin.com/JzpNRRZU
manatwork
Я думаю, что это завоевало популярность после моего недавнего проекта на Python, включающего re's :) Спасибо за указание на это.
Абхирам
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?"
SlimJim
источник
3

Вкус Smalltalk , Squeak / Pharo
116 символов с использованием традиционного форматирования с вкладками

Вы добавляете два метода в строку:

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.
aka.nice
источник
Умный и полезный ответ!
Эндрю Грей
3

Python 3 (51 символ)

и может быть Python 2

на основе решения Абхирам (с более агрессивным гольфом)

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

Оригинал без игры в гольф:

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev
goric
источник
Вы можете сыграть в гольф до 47 символов следующим образом:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD
@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 . Вы также можете взглянуть на это сообщение в блоге .

Titus
источник
Давай Титус ... Это не соответствует спецификации.
Кристоф
1
@Christoph Да, я иногда должен полностью прочитать это. Исправлена.
Тит
Хм -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

Pylongolf2 , 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]))}

ungolfed:

$P={
param([string]$s)
$s=($s-replace'[^a-z]').tolower();
if(!$s){return $true};
if($s.length-lt4){return $s[0]-eq$s[-1]};
$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))
}

Тесты:

&$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
источник
Разве это не должно быть [^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, если ложь

Попробуйте онлайн!

X88B88
источник
Это игнорирует регистр, пробелы и управляющие символы? Разбивка была бы хороша.
Тит
Текущее состояние Желе позволяет решать это в 7 байт: fØBŒlŒḂ: fфильтр , чтобы сохранить ØBмножество [A-Za-Z0-9] и Œlобращенного к нижнему регистру, то ŒḂиспытание , если палиндром.
Стинберг