Napisz funkcję, która przyjmuje liczbę jako argument i czyni ją palindromem, dodając minimalną liczbę cyfr. Numer będzie miał maksymalnie 100 cyfr.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Napisz funkcję, która przyjmuje liczbę jako argument i czyni ją palindromem, dodając minimalną liczbę cyfr. Numer będzie miał maksymalnie 100 cyfr.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Odpowiedzi:
f=:{.@(,"1(-:|.)\.#|.@}:\)
na przykład
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
Wymaga Perla 5.10 lub nowszego dla funkcji wyrażenia regularnego, ale nie ma specjalnego przełącznika wiersza poleceń.
Przykładowe użycie:
$ perl -pe 's/((.)(?1)\2|.?)$/$&.reverse$`/e' << EOT
> 12
> 232
> 2323
> 1012121
> EOT
121
232
23232
101212101
Używa rekurencyjnych rozszerzeń wyrażenia regularnego Perla 5.10, aby dopasować je do najdłuższego końcowego palindromu jako takiego:
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
Następnie zamienia go na siebie ( $&
) i dodaje $`
odwrotne ciągi zaczynające się od ( ).
ẹ;AcB↔Bc
Wypróbuj online! Pytanie wymaga funkcji, więc podałem ją; link TIO przyjmuje argument, który uruchamia funkcję jak pełny program.
ẹ;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
edycja: Skrócono na podstawie rozwiązania @ 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]
Oryginał:
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
pomaga; Muszę s
być ciągiem znaków, aby móc zapisać indeksy, aby uzyskać zakresy cyfr. Jakie jest tam uzasadnienie?
Na podstawie odpowiedzi Hoa :)
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()
że zwykle kosztuje to dodatkowy znak, ale po tym mogę zostawić miejsce return
. Hoa i tak poprawił to, używając LC zamiast GE
f=->x{x=x.to_s.chars;99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
Na podstawie odpowiedzi TY , z znakami zamiast .split, aby uzyskać 2 znaki. I jestem pewien, że jest sposób, aby wycisnąć jeszcze więcej> <
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}
Skomentowano:
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;}
Nie golfowany:
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;
}
Mam wrażenie, że może być o wiele ciaśniej, ale nie od razu wiadomo, jak to zrobić. Funkcja zjada dużo miejsca, ale potrzebowałem go w dwóch miejscach.
Działa to na dowolny ciąg, nie tylko na liczby, i może mieć dowolną długość.