Escreva uma função que use um número como argumento e faça dele um palíndromo acrescentando um número mínimo de dígitos. O número terá no máximo 100 dígitos.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Escreva uma função que use um número como argumento e faça dele um palíndromo acrescentando um número mínimo de dígitos. O número terá no máximo 100 dígitos.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Respostas:
f=:{.@(,"1(-:|.)\.#|.@}:\)
por exemplo
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
Precisa do Perl 5.10 ou posterior para recursos de regex, mas nenhuma opção de linha de comando especial.
Uso da amostra:
$ perl -pe 's/((.)(?1)\2|.?)$/$&.reverse$`/e' << EOT
> 12
> 232
> 2323
> 1012121
> EOT
121
232
23232
101212101
Usa extensões de regex recursivas do Perl 5.10 para corresponder ao palíndromo à direita mais longo, 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
Em seguida, o substitui por ele mesmo ( $&
) e acrescenta o que quer que a cadeia inicie com ( $`
), invertida.
ẹ;AcB↔Bc
Experimente online! A pergunta pede uma função, então eu forneci uma; o link TIO usa um argumento que executa uma função como um 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
edit: Encurtado com base na solução do @ 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=n
ajuda; Eu preciso s
ser uma string para que eu possa me inscrever para obter intervalos de dígitos. Qual é o raciocínio lá?
Baseado na resposta 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()
normalmente que custaria um caractere extra, mas eu pego o espaço depois return
. De qualquer forma, o Hoa melhorou de novo usando um LC em vez de um GE
f=->x{x=x.to_s.split'';99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
f=->x{x=x.to_s.chars;99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
Com base na resposta de YOU , com caracteres em vez de .split '' para obter 2 caracteres. E tenho certeza de que há como espremer um pouco mais> <
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;}
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;
}
Tenho a sensação de que poderia ser muito mais apertado, mas não é imediatamente óbvio para mim como. O Function consome muito espaço, mas eu precisava dele em dois lugares.
Isso funciona para qualquer string, não apenas para números, e pode ter qualquer tamanho.