Escriba una función que tome un número como argumento y lo convierta en un palíndromo agregando un número mínimo de dígitos. El número tendrá un máximo de 100 dígitos.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Escriba una función que tome un número como argumento y lo convierta en un palíndromo agregando un número mínimo de dígitos. El número tendrá un máximo de 100 dígitos.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Respuestas:
f=:{.@(,"1(-:|.)\.#|.@}:\)
p.ej
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
Necesita Perl 5.10 o posterior para las funciones de expresiones regulares, pero no necesita un interruptor especial de línea de comandos.
Uso de la muestra:
$ perl -pe 's/((.)(?1)\2|.?)$/$&.reverse$`/e' << EOT
> 12
> 232
> 2323
> 1012121
> EOT
121
232
23232
101212101
Utiliza extensiones de expresiones regulares recursivas de Perl 5.10 para que coincida con el palíndromo final más largo como tal:
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
Luego lo reemplaza por sí mismo ( $&) y agrega lo que la cadena comenzó con ( $`), invertida.
ẹ;AcB↔Bc
Pruébalo en línea! La pregunta pide una función, así que proporcioné una; el enlace TIO toma un argumento que ejecuta una función como un programa completo.
ẹ;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
editar: Acortado según la solución de @ 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]
Original:
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=nayuda; Necesito sser una cadena para poder subíndice para obtener rangos de dígitos. ¿Cuál es el razonamiento allí?
Basado en la respuesta de 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()general que costaría un char adicional, pero luego puedo dejar el espacio return. Hoa ha mejorado de nuevo de todos modos al usar un LC en lugar de un GE
f=->x{x=x.to_s.chars;99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
Según la respuesta de USTED , con caracteres en lugar de .split '' para obtener 2 caracteres. Y estoy seguro de que hay forma de exprimir un poco más> <
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}
Comentado:
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;}
Sin golf:
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;
}
Tengo la sensación de que podría ser mucho más estricto, pero no es inmediatamente obvio para mí cómo. La función consume mucho espacio, pero la necesitaba en dos lugares.
Esto funciona para cualquier cadena, no solo números, y puede tener cualquier longitud.