Hacer un número palíndromo


12

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

golf.shinh.org/p.rb?palindromize para longitudes de referencia
Nabb

¿Pueden las entradas y salidas de muestra incluir un ejemplo donde la respuesta correcta sea un número par de dígitos, solo para asegurarse de que los remitentes cubran ese caso? Me parece que algunos algoritmos pueden fallar si el punto medio está entre dígitos en lugar de en un dígito.
Computronium

1
@Computronium hecho.
fR0DDY

Respuestas:


4

J, 50 , 32 26 caracteres!

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

p.ej

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

Cómo funciona (por ejemplo)

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

10

Perl, 32 caracteres

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.


5

Brachylog 2, 8 bytes, desafío de fechas posteriores al idioma

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

Explicación

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

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

agradable con el pop. lástima que no puedas
saltar

2

Pitón ( 101 96)

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:])

Puede reemplazar s = str (n) con s = n.
fR0DDY

@ fR0DDY, que no funcionará si n es suficientemente grande como para necesitar un largo
gnibbler

@ fR0DDY, Python ya no se preocupa tanto por ints vs longs. int (2346765434567875432456) devuelve 2346765434567875432456 en v2.6.5. No veo cómo s=nayuda; Necesito sser una cadena para poder subíndice para obtener rangos de dígitos. ¿Cuál es el razonamiento allí?
Hoa Long Tam

@Hoa, creo que fR0DDY tenía backticks allí, pero no aparecen en los comentarios
gnibbler

@Hoa Era s = [tick] n [tick].
fR0DDY

1

Python - 98 caracteres

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

No estoy seguro de si estoy usando este derecho, pero: "NameError: el nombre global 'next' no está definido"
JB

@JB, Ah, necesitas python2.6 para eso :) de lo contrario, se puede escribir por lo 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
gnibbler

1

Golfscript - 32 caracteres

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

1

Haskell, 85

Usando el mismo algoritmo que la mayoría de los demás:

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

Ejemplos de la descripción del problema:

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

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*''}

x * '' en lugar de x.join ahorra 2 caracteres.
steenslag

1
agradable @steenslag, gracias por enseñar, soy novato rubí :-)

1

Ruby , 70 bytes

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

Pruébalo en línea!

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


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

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

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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.