Faça um palíndromo numérico

12

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
fR0DDY
fonte
golf.shinh.org/p.rb?palindromize para comprimentos de referência
Nabb 26/02/11
As entradas e saídas de amostra podem incluir um exemplo em que a resposta correta é um número par de dígitos, apenas para garantir que os remetentes cubram esse caso? Parece-me que alguns algoritmos podem falhar se o ponto intermediário estiver entre dígitos, e não em um dígito.
Computronium
1
@Computronium Done.
FR0DDY 25/05

Respostas:

4

J, 50 , 32 e 26 caracteres!

f=:{.@(,"1(-:|.)\.#|.@}:\)

por exemplo

f '12'
121 
f '232'
232   
f '2323'
23232   
f '1012121'
101212101     

Como funciona (por exemplo)

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
Eelvex
fonte
10

Perl, 32 caracteres

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.

JB
fonte
5

Brachylog 2, 8 bytes, desafio de pós-datas de idiomas

ẹ;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.

Explicação

ẹ;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

fonte
3

Python, 88 caracteres

def f(x):
 x,y=list(str(x)),[]
 while x!=x[::-1]:y+=x.pop(0)
 return''.join(y+x+y[::-1])
VOCÊ
fonte
legal com o pop. pena que você não pode estalar de str
gnibbler
2

Python ( 101 96)

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:])
Hoa Long Tam
fonte
Você pode substituir s = str (n) por s = n.
FR0DDY
@ fR0DDY, que não vai funcionar se n for grande o suficiente para precisar de um longo
gnibbler
@ fR0DDY, Python não liga mais para ints vs longs. int (2346765434567875432456) retorna 2346765434567875432456 na v2.6.5. Não vejo como s=najuda; Eu preciso sser uma string para que eu possa me inscrever para obter intervalos de dígitos. Qual é o raciocínio lá?
Hoa Long Tam
@Hoa, acho fR0DDY teve backticks lá, mas eles não aparecem nos comentários
gnibbler
@Hoa Era s = [tick] n [tick].
FR0DDY
1

Python - 98 caracteres

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])
mordedor
fonte
Não tenho certeza se estou usando esse direito, mas: "NameError: o nome global 'next' não está definido"
JB
@ JB, Ah, você precisa python2.6 para isso :) caso contrário, pode ser escrito 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
gnibbler
1

Golfscript - 32 caracteres

{`:s-1%:r,,{s<r+..-1%=*}%{}?~}:f
mordedor
fonte
1

Haskell, 85

Usando o mesmo algoritmo que quase todos os outros:

import List
r=reverse
f s=s++(r.snd.head.filter g.zip(tails s)$inits s)
g(s,_)=s==r s

Exemplos da descrição do problema:

*Main> map (f.show) [12,232,2323,1012121]
["121","232","23232","101212101"]
JB
fonte
1

Ruby 1.9, 72 caracteres

f=->x{x=x.to_s.split'';99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
VOCÊ
fonte
x * '' em vez de x.join salva 2 caracteres.
steenslag 23/02
1
bom @steenslag, obrigado pelo ensino, eu sou ruby ​​newbie :-)
YOU
1

Ruby , 70 bytes

f=->x{x=x.to_s.chars;99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}

Experimente online!

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> <

Jenkar
fonte
1

JavaScript (ES6), 145 126 caracteres

 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;
  }
}
Axarydax
fonte
0

Java, 174 bytes

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.

Computronium
fonte
0

PHP, 64 bytes

for(;strrev($p=$argn.strrev(substr($argn,0,$i++)))!=$p;);echo$p;

Experimente online!

Jörg Hülsermann
fonte