Напишіть функцію, яка приймає число як аргумент і робить його паліндром, додавши мінімальну кількість цифр. Число буде не більше 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
def f(x):
x,y=list(str(x)),[]
while x!=x[::-1]:y+=x.pop(0)
return''.join(y+x+y[::-1])
редагувати: Скорочено на основі рішення @ 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
. Хоа знову все покращився, використовуючи LC замість GE
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;}
Безголівки:
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;
}
У мене є відчуття, що це може бути набагато жорсткіше, але мені не відразу зрозуміло, як це зробити. Функція з'їдає багато місця, але мені це було потрібно в двох місцях.
Це працює для будь-якого рядка, а не лише чисел, і він може бути будь-якої довжини.
for(;strrev($p=$argn.strrev(substr($argn,0,$i++)))!=$p;);echo$p;