2008-10-23 4 views
29

Цель: Любой язык. Самая маленькая функция, которая вернет, является ли строка палиндром. Вот мой в Python:Palindrome Golf

R=lambda s:all(a==b for a,b in zip(s,reversed(s))) 

50 символов.

Принятый ответ будет самым маленьким - это изменится по мере того, как будут найдены более мелкие. Пожалуйста, укажите язык, на котором находится ваш код.

+0

Бонусные баллы к первому человеку, чтобы оставлять КПК – 2008-10-23 04:28:00

+0

Сделать это сообщество вики редактируемый, пожалуйста – aku 2008-10-23 04:30:59

+0

Другой не был дубликат – 2008-10-23 04:53:11

ответ

49

7 символов J: Не уверен, что это лучший способ, я несколько новых для J :)

p=:-:|. 

описание: |. меняет вход. -: сравнивает. операнды неявные.

p 'radar' 
1 

p 'moose' 
0 
42

Вот мой; он написан на языке, специфическом для домена, который я изобрел, называемом «палиндром».

p 

Edit: менее легкомысленным версия (i386 ASM, AT & T синтаксис)

xor %eax, %eax 
mov %esi, %edi 
#cld not necessary, assume DF=0 as per x86 ABI 
repne scasb 
scan: 
    dec %edi 
    cmpsb 
    .byte 0x75, 6 #jnz (short) done 
    dec %edi 
    cmp %esi, %edi 
    .byte 0x72, -9 #jb (short) scan 
inc %eax 
done: 

16 байт, указатель строки идет в ESI, результат в EAX.

+2

Почему же p, тогда? вы должны запустить интерпретатор со строкой в ​​качестве аргумента – 2008-10-23 04:22:32

+10

Вы должны ввести в заблуждение палиндром с palindrome ++, который является родственным, но другим языком. – Menkboy 2008-10-23 04:24:48

+0

Vinko Vrsalovic, вы просто не читали документацию о языке «палиндрома». p - запрашивает у пользователя аргумент автоматически. – aku 2008-10-23 04:57:38

1

Моя попытка в C (70 символов):

P(char*s){char*e=s+strlen(s)-1;while(s<e&&*s==*e)s++,e--;return s>=e;} 

[Edit] Теперь на самом деле работают
[Edit 2] Сниженная от 74 до 70 с использованием по умолчанию Int возврата

В ответ на некоторые комментариев: я не уверен, связано ли это злоупотребление препроцессором - вы можете просто определить все это в командной строке и сделать функцию одним символом.

+0

You может уменьшить это ... ну, я посчитал 72, включая новую строку. int P (char * s) {char * e = s + strlen (s) -1; while (s = e;} Проверено на строках «xyx», "xyzx" "xyyx" "yxx". – 2008-10-23 04:46:39

+0

И, конечно, вы можете уменьшить это до: i P (c * s) {c * e = s + l (s) -1; w (s = е;} строка компилятора (GCC) является: НКА-= INT -dc = символ -dL = StrLen -DW = в то время как -Доктор = возврат palindrome.c – 2008-10-23 04:54:16

+0

: @ Джонатан, который не для строки «ab» и «abb». – 2008-10-23 05:15:18

28

Другой Python версии, что довольно короткий (21 символов):

R=lambda s:s==s[::-1] 
+0

Вау, я не знаю Python, но это очень впечатляет. – harpo 2008-10-23 04:39:11

10

Perl (27 символов):

sub p{$_[0]eq reverse$_[0]} 

Ruby (24 символов):

def p(a)a==a.reverse end 
+0

Вы потратили два символа в круглых скобках для обратного ... И хорошо сделано; моя первоначальная попытка в Perl была 39. – 2008-10-23 04:31:30

+0

Хорошо поймать, я исправлю это, спасибо. – 2008-10-23 04:33:12

+0

Этот вариант Perl зашел слишком далеко. Counter-example: sub p {$ _ eq reverse} while (<>) { chomp; $ x = $ _; $ _ = "aaaaaaaab"; print "$ x - палиндром \ n", если p ($ x); } – 2008-10-23 16:50:14

9

73 чистые, читаемые, символы, написанные на java

boolean p(String s){return s.equals(""+new StringBuffer(s).reverse());} 

мир :)

+0

Поскольку это настолько читабельна, как получилось присутствие «+»? Если вы хотите читать, я рекомендую решение Haskell – 2008-10-23 08:00:13

+8

Мы говорим здесь о кодовом гольфе. Читаемость не имеет значения. – JesperE 2008-10-23 18:27:09

5
(equal p (reverse p)) 

шепелявость. 18 символов.

ok, это особый случай. Это будет работать, если набирается непосредственно в интерпретатор lisp и p уже определен.

в противном случае это было бы необходимо:

(defun g() (equal p (reverse p))) 

28 символов.

+1

Не справедливо :) Вы должны добавить (defun ....) и посчитать его в – ADEpt 2008-10-23 06:31:24

+0

Во-вторых, что ADEpt - где ваша defun? – mhawke 2008-10-23 06:39:44

29

Haskell, символы:

p=ap(==)reverse 

Более читаемый вариант, символы:

p x=x==reverse x 
+0

Как и в случае с этим, у него одинаковое число символов, как perl, но выполнение «px = x == reverse x» составляет 16 символов (выньте пробельные). измените свой ответ, если вы можете – Claudiu 2008-10-23 11:13:18

4

PHP:

function p($s){return $s==strrev($s);} // 38 chars 

или просто

$s==strrev($s); // 15 chars 
+0

15 символов будут работать, но он должен быть в функции def – Claudiu 2008-10-23 11:38:15

0

CFScript, 39 символов:

function y(x){return(x is reverse(x));} 

Я никогда не был очень хорош в гольф.

0

Java:

boolean y(StringBuffer x){return x.equals(x.reverse());} 

выше не работает, ой!

boolean y(StringBuffer x){return x.toString().equals(x.reverse().toString()); } 

Ew.

2

Haskell, 28 символов, нужен Control.Arrow импортированный.

p=uncurry(==).(id&&&reverse) 
5

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

function p(s)return s==s:reverse()end 

вариант, просто для удовольствия (такой же размер):

p=function(s)return s==s:reverse''end 

версия JavaScript является более подробный (55 символов), поскольку он не имеет функции обратной линии:

function p(s){return s==s.split('').reverse().join('')} 
2

Простая реализация в C с использованием стандартных библиотечных функций, вдохновленная strlen в другом ответе C.

Количество символов: 57

p(char*s){char*r=strdup(s);strrev(r);return strcmp(r,s);} 

Исповедь: Я быть плохим парнем, не освободив г здесь. Моя нынешняя попытка быть хорошей:

p(char*s){char*r=strdup(s);s[0]=strcmp(strrev(r),s);free(r);return s[0];} 

несет в себе 73 символа; Я думаю о любых способах сделать это короче.

+1

p (char * s) {return strcmp (strrev (strdup (s)), s);} // утечки! – Skizz 2008-10-23 15:59:59

2

без использования каких-либо функций библиотеки (потому что вы действительно должны добавить в #include стоимости, а), вот C++ версии в 96:

int p(char*a,char*b=0,char*c=0){return c?b<a||p(a+1,--b,c)&&*a==*b:b&&*b?p(a,b+1):p(a,b?b:a,b);} 
0

Shell-скрипт (SED + нолики + тр):

test "`echo $1|sed -e 's/\(.\)/\1\n/g'|tac|tr -d '\n'`" == "$1" 
4

Не используется функция обратного перевода на вашем языке, немного обманывая? Я имею в виду, глядя на решение Руби дать как

def p(a)a==a.reverse end 

можно легко переписать, что, как

def p(a)a==a.r end 

и просто сказать, что вы сделали метод расширения в вашем коде, так что «г» называется обратным. Я бы хотел, чтобы люди отправляли решения, не содержащие вызовов других функций. Конечно, функция длины строки должна быть разрешена.

Рубин без возврата - 41 символов

def m(a)a==a.split('').inject{|r,l|l+r}end 

VB.Net - 173 симв

Function P(ByVal S As String) As Boolean 
    For i As Integer = 0 To S.Length - 1 
     If S(i) <> S(S.Length - i - 1) Then 
      Return False 
     End If 
    Next 
    Return True 
End Function 
3

С # Без обратной функции 84 символов

int p(char[]s){int i=0,l=s.Length,t=1;while(++i<l)if(s[i]!=s[l-i-1])t&=0;return t;} 

C# без обратной функции 86 c HARS

int p(char[]s){int i=0;int l=s.Length;while(++i<l)if(s[i]!=s[l-i-1])return 0;return 1;} 

VBScript 41 символов

function p:p=s=strreverse(s):end function 
0

Определенно не самый маленький, но я все еще хотел добавить запись:

sub p{return @_==reverse split//;} 

ржавый Тхо Мой PERL и это не тестировалась.

2

Groovy 17B:

p={it==it[-1..0]}

Даунсайд является то, что он не работает с emptry строки.

С другой стороны, исключение для пустой строки является разумным, поскольку вы не можете сказать, что ничто не является палиндром или нет.

18

Из-за опасности получения голосов большинство из них просто вызывают команду обратного, который скрывает всю реальную логику программирования.

Интересно, какой самый короткий ручной способ сделать это на каждом из этих языков.

4

F # (много, как, например C#)

let p s=let i=0;let l=s.Length;while(++i<l)if(s[i]!=[l-i-1]) 0; 1;; 
-1

Java Джоша выше фрагмент кода возвращает истину каждый раз.

6

версия Бессмысленно Haskell (15 символов, хотя на самом деле не работает, если вы не включают Control.Arrow и Control.Monad и игнорировать ограничение мономорфизма):

p=ap(==)reverse 
5

Я возьму его немного дальше : полный код c, компиляция и переход.

90 символов

main(int n,char**v){char*b,*e;b=e=v[1];while(*++e);for(e--;*b==*e&&b++<e--;);return b>e;} 
3

Common Lisp, кратко- и-обман версия (23 символов):

#L(equal !1(reverse !1)) 

#L является читателем макро характер реализуется SHARPL-READER в пакете итерации , Это в основном эквивалентно (lambda (! 1) ...).

Common Lisp, длинная версия с использованием только примитивы (137, включая пробелы, сжимаемый до 108):

(defun p (s) 
    (let ((l (1- (length s)))) 
    (iter (for i from l downto (/ l 2)) 
      (always (equal (elt s i) (elt s (- l i))))))) 

Опять же, он использует итерацию, которая в основном уборщик версия встроено LOOP объекта, так что я склонны рассматривать его как находящийся на основном языке.

12

С # и LINQ операторы:

public bool IsPalindrome(string s) 
{ 
    return s.Reverse().SequenceEqual(s); 
} 

Если рассматривать Reverse как обман, вы можете сделать все вещи с сокращением:

public bool IsPalindrome(string s) 
{ 
    return s.Aggregate(new StringBuilder(), 
         (sb, c) => sb.Insert(0, c), 
         (sb) => sb.ToString() == s); 
} 
37

К сожалению, я не смог попасть под тысячи слов ...

alt text

(LabVIEW. Да, они позволяют почти любой бродяга пост здесь;)

2

Clojure с использованием 37 символов:

user=> (defn p[s](=(seq s)(reverse(seq s)))) 
#'user/p 
user=> (p "radar") 
true 
user=> (p "moose") 
false 
0

C, без библиотек, 70 символов:

p(char*a){char*b=a-1;while(*++b);while(a<b&&*a++==*--b);return!(a<b);} 

В одном из комментариев на другом решении C упоминалось, прототипы полностью необязательны в C, int предполагается, что везде будет идти, но не упоминается. Не было ли когда-либо запрограммировано в pre-ANSI C?

Редактировать: короче и обрабатывает пустые строки.

3

Вдохновляет предыдущим пост, 69 символов

p(char*a){char*b=a,q=0;while(*++b);while(*a)q|=*a++!=*--b;return!q;} 

EDIT: На один знак:

p(char*a){char*b=a,q=0;while(*++b);while(*a)q|=*a++%*--b;return!q;} 

edit2: 65 символьных:

p(char*a){char*b=a;while(*b)b++;while(*a&&*a++==*--b);return!*a;} 
0

JavaScript: 55 сов

p=function(x){return (x==x.split('').reverse().join())} 

выше не будет работать, потому что вам нужно позвонить join с ""

JavaScript: 55 символов

function p(s){return s==s.split("").reverse().join("")} 
0

Java, без использования реверса:

boolean p(String s){int i=0,l=s.length();while(i<l){if(s.charAt(i++)!=s.charAt(--l))l=-1;}return l>=0; 
0

Стандартный ML (34 символа и расточка):

fun p s=s=implode(rev(explode(s))) 
0

C, 68 символов, без ЛИЭС:

p(char *s){char *e=s;while(*++e);for(;*s==*--e&&s++<e;);return s>e;} 
3

Не самый короткий, и очень после-фактум, но я не мог не дать ему попробовать в MATLAB:

[email protected](s)all(s==fliplr(s)); 

24 символа.

0

может, хорошо дать C++ пример, который использует стандартную библиотеку:

bool p(const std::string &s){std::string s2(s);std::reverse(s2);return s==s2;} 

Благодаря Джону для указания на то, что это может быть короче, если мы делаем какие-то ненужные копии. Всего 67 символов.

bool p(std::string s){std::string x=s;std::reverse(x);return s==x;} 
1

Haskell, 36 символов, включая собственную функцию обратного хода. (На самом деле, если вы используете точку с запятой, чтобы сделать его Однострочник, и игнорировать символ новой строки в конце концов, это было бы 35 ...)

r[]y=y 
r(a:x)y=r x$a:y 
p s=s==r s[] 

Как и с другими реализациями, «р» является палиндромом сказуемое.

0

58 символов в Python, без реверсирования строки:

r="y" 
for i in range(len(s)): 
if(s[i]!=s[-i-1]): 
    r="n"

Может быть, цикл может быть оптимизированы? Python для меня новичок ...

3

18 символов Perl регулярное выражение

/^(.?|(.)(?1)\2)$/ 
3

52 символов в C, с той оговоркой, что до половины строки будут перезаписаны:

p(char*s){return!*s||!(s[strlen(s)-1]-=*s)&&p(++s);}

Без библиотеки называет это 64 символов:

p(char*s){char*e=s;while(*e)++e;return!*s||!(*--e-=*s)&&p(++s);}

0

Javascript рекурсивная версия (без обратной нежелательной)

function p(s){l=s.length;return l<2||(s[0]==s[l-1]&&p(s.substr(1,l-2)))} 

(72 символов)

или реализуют обратное внутри:

p=function(s,y){return y?(s==p(s)):s[1]?(p(s.substr(1))+s[0]):s[0]} 

p("hannah",1); 

(67 символов)

или, используя нет встроенных функций ...

p=function(s,y,i){ 
return i?s[i]?s[i]+p(s,0,i+1):'':y?(s==p(s)):s[1]?(p(p(s,0,1))+s[0]):s[0] 
} 

p("hannah",1); 

(92 символов)

кратчайшее я мог придумать: (итеративные)

function p(s,l){for(c in s){if(s[c]!=s[l-1-c])s=0}return s} 

p("hannah",6);// (is this cheating?) 

(59 символов)

с нетерпением жду встречи с вами делать это лучше в JavaScript!

(предпочтительно без использования каких-либо встроенных функций, особенно назад)

(на самом деле не очень впечатлил 'вернуть ей == s.reverse()' ответы типа)

4

Golfscript, 5 знаков

.-1%= 

$ echo -n abacaba | ruby golfscript.rb palindrome.gs 
1 

$ echo -n deadbeef | ruby golfscript.rb palindrome.gs 
0 
0

F #: 29 символов

let p(s:string)=s=s.Reverse() 

(при условии, System.Linq импортируется)

0

C# с использованием рекурсивное лямбда функции и не используя Reverse функцию (115 символов):

Func<string,bool>p=null;p=w=>{if(w.Length<2)return true;return w[0]==w[w.Length-1]&&p(w.Substring(1,w.Length-2));}; 
0

Невозможно!язык, предполагая, что строка передается с помощью нормальных арг:

;~= 

3 символов

0

JavaScript, 64 байт.

function a(x){for(r='',i=x.length;i>0;i--)r+=x[i-1];return x==r} 

Тестовый пример:

a('lolol'); // true 
a('haha'); // false 
1

F #, нет LINQ и обратный метод. Seq.fold:

let p (s : string) = 
    fst(s |> Seq.fold (fun (r, i) c -> (r && c = s.[s.Length - 1 - i], i + 1)) (true, 0)) 

То же самое, но с Seq.iteri и реф переменных вместо Seq.fold:

let p (s : string) = 
    let r = ref true 
    Seq.iteri (fun i c -> r := (!r && c = s.[s.Length - 1 - i])) s 
    !r