Зробіть число паліндром


12

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

Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101

golf.shinh.org/p.rb?palindromize для орієнтирів
Nabb

Чи можуть вибіркові входи та результати включати приклад, коли правильною відповіддю є парне число цифр, просто щоб переконатися, що подачі заявок висвітлюють цей випадок? Мені здається, що деякі алгоритми можуть вийти з ладу, якщо точка на півдорозі знаходиться між цифрами, а не цифрою.
Computronium

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

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

Потім він замінює його собою ( $&) і додає все, що починається з рядка ( $`), переверненого.


5

Брахілог 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


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, що звичайно буде працювати, якщо n достатньо великий, потрібен довгий
gnibbler

@ fR0DDY, Python вже не так сильно піклується про ints vs longs. int (2346765434567875432456) повертає 2346765434567875432456 на v2.6.5. Я не бачу, як s=nдопомагає; Мені потрібно sбути рядком, щоб я міг підписатись, щоб отримати діапазони знаків. Які міркування там?
Хоа Лонг Там

@Hoa, я думаю, що у fR0DDY були передумови, але вони не з’являються у коментарях
gnibbler

@Hoa Це було s = [галочка] n [галочка].
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])

Не впевнений, що я користуюся цим правом, але: "NameError: глобальне ім'я 'next' не визначено"
JB

@JB, Ах, для цього вам потрібен python2.6 :) інакше це може бути написано return(...).next()зазвичай, що коштуватиме додаткових знаків, але я можу покинути простір після return. Хоа знову все покращився, використовуючи LC замість GE
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"]

1

Рубін 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;
  }
}

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;}

Безголівки:

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;
    }

У мене є відчуття, що це може бути набагато жорсткіше, але мені не відразу зрозуміло, як це зробити. Функція з'їдає багато місця, але мені це було потрібно в двох місцях.

Це працює для будь-якого рядка, а не лише чисел, і він може бути будь-якої довжини.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.