Напишите функцию, которая принимает число в качестве аргумента и делает его палиндромом, добавляя минимальное количество цифр. Номер будет не более 100 цифр.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Напишите функцию, которая принимает число в качестве аргумента и делает его палиндромом, добавляя минимальное количество цифр. Номер будет не более 100 цифр.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Ответы:
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
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
Затем он заменяет его на себя ( $&
) и добавляет все строки, начинающиеся с ( $`
), в обратном порядке.
ẹ;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
редактировать: сокращено на основе решения @ 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:])
n
.
s=n
помогает; Мне нужно s
быть строкой, чтобы я мог подписать, чтобы получить диапазоны цифр. В чем причина?
На основании ответа Хоа :)
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])
return(...).next()
обычно, что будет стоить дополнительный символ, но после этого я оставлю пробел return
. В любом случае, Hoa снова улучшил его, используя LC вместо GE
f=->x{x=x.to_s.chars;99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
Исходя из ответа ВАС , с символами вместо .split '', чтобы получить 2 символа. И я уверен, что есть способ выжать немного больше> <
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;
}
}
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;
}
Я чувствую, что это может быть намного труднее, но для меня не сразу понятно, как. Функция пожирает много места, но мне это нужно в двух местах.
Это работает для любой строки, а не только для чисел, и может быть любой длины.