Faire un nombre palindrome

12

Écrivez une fonction qui prend un nombre comme argument et en fait un palindrome en ajoutant un nombre minimum de chiffres. Le numéro sera au maximum de 100 chiffres.

Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
fR0DDY
la source
golf.shinh.org/p.rb?palindromize pour les longueurs de référence
Nabb
Les exemples d'entrées et de sorties peuvent-ils inclure un exemple où la bonne réponse est un nombre pair de chiffres, juste pour s'assurer que les émetteurs couvrent ce cas? Il me semble que certains algorithmes peuvent échouer si le point à mi-chemin est entre les chiffres plutôt que sur un chiffre.
Computronium
1
@Computronium Done.
fR0DDY

Réponses:

4

J, 50 , 32 26 caractères!

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

par exemple

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

Comment ça marche (par exemple)

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
la source
10

Perl, 32 caractères

s/((.)(?1)\2|.?)$/$&.reverse$`/e

Nécessite Perl 5.10 ou une version ultérieure pour les fonctionnalités d'expression régulière, mais pas de commutateur de ligne de commande spécial.

Exemple d'utilisation:

$ perl -pe 's/((.)(?1)\2|.?)$/$&.reverse$`/e' << EOT
> 12
> 232
> 2323
> 1012121
> EOT
121
232
23232
101212101

Utilise les extensions de regex récursives de Perl 5.10 pour correspondre au palindrome de fuite le plus long en tant que tel:

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

Il le remplace ensuite par lui-même ( $&) et ajoute tout ce que la chaîne a commencé par ( $`), inversé.

JB
la source
5

Brachylog 2, 8 octets, défi de postdates de langue

ẹ;AcB↔Bc

Essayez-le en ligne! La question demande une fonction, alors j'en ai fourni une; le lien TIO prend un argument qui exécute une fonction comme un programme complet.

Explication

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

la source
3

Python, 88 caractères

def f(x):
 x,y=list(str(x)),[]
 while x!=x[::-1]:y+=x.pop(0)
 return''.join(y+x+y[::-1])
VOUS
la source
sympa avec la pop. dommage que vous ne puissiez pas
sortir
2

Python ( 101 96)

edit: raccourci basé sur la solution 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:])
Hoa Long Tam
la source
Vous pouvez remplacer s = str (n) par s = n.
fR0DDY
@ fR0DDY, cela ne fonctionnera pas si n est assez grand pour avoir besoin d'un long
gnibbler
@ fR0DDY, Python ne se soucie plus tant des ints que des longs. int (2346765434567875432456) renvoie 2346765434567875432456 sur v2.6.5. Je ne vois pas en quoi ça s=naide; Je dois sêtre une chaîne afin de pouvoir souscrire pour obtenir des plages de chiffres. Quel est le raisonnement là-bas?
Hoa Long Tam
@Hoa, je pense que fR0DDY a eu des retours en arrière, mais ils n'apparaissent pas dans les commentaires
gnibbler
@Hoa C'était s = [tick] n [tick].
fR0DDY
1

Python - 98 caractères

Basé sur la réponse 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])
grignoteur
la source
Je ne suis pas sûr que j'utilise ce droit, mais: "NameError: le nom global 'next' n'est pas défini"
JB
@JB, Ah, vous avez besoin de python2.6 pour cela :) sinon, il peut être écrit en return(...).next()général, ce qui coûterait un caractère supplémentaire, mais je peux supprimer l'espace après return. Hoa l'a encore amélioré de toute façon en utilisant un LC au lieu d'un GE
gnibbler
1

Golfscript - 32 caractères

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

Haskell, 85

En utilisant le même algorithme que la plupart des autres:

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

Exemples de description du problème:

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

Ruby 1.9, 72 caractères

f=->x{x=x.to_s.split'';99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
VOUS
la source
x * '' au lieu de x.join enregistre 2 caractères.
steenslag
1
nice one @steenslag, merci pour l'enseignement, je suis débutant rubis :-)
VOUS
1

Rubis , 70 octets

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

Essayez-le en ligne!

Basé sur la réponse de VOUS , avec des caractères au lieu de .split '' pour gagner 2 caractères. Et je suis sûr qu'il y a moyen de presser un peu plus> <

Jenkar
la source
1

JavaScript (ES6), 145 126 caractères

 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}

Commenté:

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
la source
0

Java, 174 octets

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

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

J'ai le sentiment que cela pourrait être beaucoup plus serré, mais je ne sais pas immédiatement comment. La fonction mange beaucoup d'espace mais j'en avais besoin à deux endroits.

Cela fonctionne pour n'importe quelle chaîne, pas seulement pour les nombres, et cela peut avoir n'importe quelle longueur.

Computronium
la source