Сделай номер палиндромом

12

Напишите функцию, которая принимает число в качестве аргумента и делает его палиндромом, добавляя минимальное количество цифр. Номер будет не более 100 цифр.

Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
fR0DDY
источник
golf.shinh.org/p.rb?palindromize для справочной длины
Набб
Могут ли примеры входов и выходов включать пример, где правильный ответ - четное число цифр, просто чтобы убедиться, что отправители охватывают этот случай? Мне кажется, что некоторые алгоритмы могут потерпеть неудачу, если точка посередине находится между цифрами, а не цифрой.
КОМПЬЮТРОНИУМ
1
@ Computronium Готово.
fR0DDY

Ответы:

4

J, 50 , 32 26 символов!

f=:{.@(,"1(-:|.)\.#|.@}:\)

например

f '12'
121 
f '232'
232   
f '2323'
23232   
f '1012121'
101212101     

Как это работает (на примере)

y =: '1012121'

[\.y   NB. Sub lists of y
1012121
012121 
12121  
2121   
121    
21     
1 

|.\. y  NB> Reverses of sub lists of y
1212101
121210 
12121  
1212   
121    
12     
1  

([\. y) -:"1 (|. \. y) NB. Which of them are equal? (those are palindromes)
                       NB. ( -:"1 ) checks equality item by item
0 0 1 0 1 0 1

(-:  |.)\. y NB. Shortcut of the above
0 0 1 0 1 0 1

(0 0 1 0 1 0 1) # }:\y NB. Choose (#) the palindrome prefixes (\)
10    
1012  
101212

y, |.'10'   NB. Reverse and append the first prefix.
101212101
Eelvex
источник
10

Perl, 32 символа

s/((.)(?1)\2|.?)$/$&.reverse$`/e

Требуется Perl 5.10 или более поздней версии для функций регулярных выражений, но нет специального переключателя командной строки.

Образец использования:

$ perl -pe 's/((.)(?1)\2|.?)$/$&.reverse$`/e' << EOT
> 12
> 232
> 2323
> 1012121
> EOT
121
232
23232
101212101

Использует рекурсивные расширения регулярных выражений Perl 5.10 для соответствия самому длинному конечному палиндрому:

m/
    (      # paren 1 - a palindrome is either:
      (.)  # paren 2 - a character
      (?1) # a palindrome as defined in paren 1
      \2   # the same character as in paren 2
    |        # or:
      .?   # a 0- or 1-character string
    )
    $      # at end of string
/x

Затем он заменяет его на себя ( $&) и добавляет все строки, начинающиеся с ( $`), в обратном порядке.

JB
источник
5

Brachylog 2, 8 байт, языковые проблемы постдат

ẹ;AcB↔Bc

Попробуйте онлайн! Вопрос требует функции, поэтому я ее предоставил; ссылка TIO принимает аргумент, который запускает функцию как полная программа.

объяснение

ẹ;AcB↔Bc
ẹ          Split {the input} into digits
 ;Ac       Append {the shortest possible} list
    B↔B    to produce a palindrome
       c   then concatenate the resulting list of digits back into a number

источник
3

Питон, 88 символов

def f(x):
 x,y=list(str(x)),[]
 while x!=x[::-1]:y+=x.pop(0)
 return''.join(y+x+y[::-1])
ВЫ
источник
приятно с поп Жаль, что вы не можете выскочить из str
gnibbler
2

Питон ( 101 96)

редактировать: сокращено на основе решения @ gnibbler

def p(n):s=str(n);r=s[::-1];l=len(s);return[int(s+r[l-i:])for i in range(l)if s[i:]==r[:l-i]][0] 

Оригинал:

def p(n):
 s=str(n);r=s[::-1];l=len(s)
 for i in range(l):
  if s[i:]==r[:l-i]:return int(s+r[l-i:])
Хоа Лонг Там
источник
Вы можете заменить s = str (n) на s = n.
fR0DDY
@ fR0DDY, что не будут работать , если п достаточно велико , чтобы нужно долго
gnibbler
@ fR0DDY, Python больше не заботится о ints vs longs. int (2346765434567875432456) возвращает 2346765434567875432456 для v2.6.5. Я не вижу, как это s=nпомогает; Мне нужно sбыть строкой, чтобы я мог подписать, чтобы получить диапазоны цифр. В чем причина?
Хоа Long Tam
@ Хао, я думаю, что у fR0DDY были пометки, но они не отображаются в комментариях
gnibbler
@ Хао Это был s = [тик] н [тик].
fR0DDY
1

Питон - 98 символов

На основании ответа Хоа :)

def p(n):s=str(n);r=s[::-1];l=len(s);return next(int(s+r[l-i:])for i in range(l)if s[i:]==r[:l-i])
gnibbler
источник
Не уверен, что я использую это право, но: «NameError: глобальное имя« next »не определено»
JB
@JB, ах, для этого тебе нужен python2.6 :) в противном случае он может быть написан return(...).next()обычно, что будет стоить дополнительный символ, но после этого я оставлю пробел return. В любом случае, Hoa снова улучшил его, используя LC вместо GE
gnibbler
1

Golfscript - 32 символа

{`:s-1%:r,,{s<r+..-1%=*}%{}?~}:f
gnibbler
источник
1

Хаскелл, 85

Используя тот же алгоритм, что и большинство остальных:

import List
r=reverse
f s=s++(r.snd.head.filter g.zip(tails s)$inits s)
g(s,_)=s==r s

Примеры из описания проблемы:

*Main> map (f.show) [12,232,2323,1012121]
["121","232","23232","101212101"]
JB
источник
1

Ruby 1,9, 72 символа

f=->x{x=x.to_s.split'';99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
ВЫ
источник
x * '' вместо x.join экономит 2 символа.
Steenslag
1
хороший @steenslag, спасибо за обучение, я рубиновый новичок :-)
ВЫ
1

JavaScript (ES6), 145 126 символов

 p=a=>{S=x=>x.split``.reverse();for(s=String(a),i=0;i<s.length;i++)if(x=s+S(s.substring(0,i)).join``,x==S(x).join``)return x}

комментарии:

function palindrome(n){
  s = String(n);
  for(i=0;i<s.length;i++)
  {
    x=s+s.substring(0,i).split("").reverse().join("") //take first n characters, reverse and append to the end
    if(x==x.split("").reverse().join("")) //is the number a palindrome?
      return x;
  }
}
Axarydax
источник
0

Java, 174 байта

x->{Function<String,String>r=t->new StringBuilder(t).reverse().toString();String y=r.apply(x),z=x;int m=x.length();while(!z.equals(r.apply(z)))z=x+y.substring(--m);return z;}

Ungolfed:

x -> {
        Function<String, String> r = t -> new StringBuilder(t).reverse().toString();
        String y = r.apply(x), z=x;
        int m = x.length();
        while (!z.equals(r.apply(z))) z = x+y.substring(--m);
        return z;
    }

Я чувствую, что это может быть намного труднее, но для меня не сразу понятно, как. Функция пожирает много места, но мне это нужно в двух местах.

Это работает для любой строки, а не только для чисел, и может быть любой длины.

кОМПЬЮТРОНИУМ
источник