Erstelle ein Zahlenpalindrom

12

Schreiben Sie eine Funktion, die eine Zahl als Argument verwendet und durch Anhängen einer Mindestanzahl von Ziffern zu einem Palindrom macht. Die Nummer besteht aus maximal 100 Ziffern.

Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
fR0DDY
quelle
golf.shinh.org/p.rb?palindromize für Referenzlängen
Nabb
Können die Beispieleingaben und -ausgaben ein Beispiel enthalten, bei dem die richtige Antwort eine gerade Anzahl von Ziffern ist, nur um sicherzustellen, dass die Absender diesen Fall abdecken? Es scheint mir, dass einige Algorithmen fehlschlagen könnten, wenn der halbe Punkt zwischen Ziffern und nicht auf einer Ziffer liegt.
Computronium
1
@Computronium Fertig.
25.

Antworten:

4

J, 50 , 32 26 Zeichen!

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

z.B

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

Wie es funktioniert (am Beispiel)

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

Perl, 32 Zeichen

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

Benötigt Perl 5.10 oder höher für reguläre Ausdrücke, aber keinen speziellen Befehlszeilenschalter.

Beispielgebrauch:

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

Verwendet die rekursiven Regex-Erweiterungen von Perl 5.10, um dem längsten nachgestellten Palindrom als solchem ​​zu entsprechen:

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

Es ersetzt es dann durch sich selbst ( $&) und fügt die Zeichenfolge, die mit ( $`) begonnen wurde, in umgekehrter Reihenfolge an .

JB
quelle
5

Brachylog 2, 8 Bytes, Sprachnachstellung

ẹ;AcB↔Bc

Probieren Sie es online! In der Frage wird nach einer Funktion gefragt, daher habe ich eine angegeben. Die TIO-Verknüpfung verwendet ein Argument, das eine Funktion wie ein vollständiges Programm ausführt.

Erläuterung

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

quelle
3

Python, 88 Zeichen

def f(x):
 x,y=list(str(x)),[]
 while x!=x[::-1]:y+=x.pop(0)
 return''.join(y+x+y[::-1])
SIE
quelle
schön mit dem Pop. Schade , daß Sie nicht aus str Pop können
gnibbler
2

Python ( 101 96)

edit: Verkürzt basierend auf @ gnibblers Lösung

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
quelle
Sie können s = str (n) durch s = ersetzen n.
Freitag,
wenn n @ fR0DDY, dass nicht funktionieren ist groß genug , um eine lange zu brauchen
gnibbler
@ fR0DDY, Python interessiert sich nicht mehr so ​​sehr für Ints vs. Longs. int (2346765434567875432456) gibt 2346765434567875432456 in Version 2.6.5 zurück. Ich verstehe nicht, wie es s=nhilft. Ich muss seine Zeichenfolge sein, damit ich sie subskribieren kann, um Ziffernbereiche zu erhalten. Was ist die Begründung da?
Hoa Long Tam
@ Hallo, ich denke, fR0DDY hatte Backticks, aber sie erscheinen nicht in den Kommentaren
Gnibbler
@Hoa Es war s = [tick] n [tick].
Freitag,
1

Python - 98 Zeichen

Basierend auf Hoas Antwort :)

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])
Knabberzeug
quelle
Ich bin mir nicht sicher, ob ich dieses Recht verwende, aber: "NameError: globaler Name 'next' ist nicht definiert"
JB
@JB, Ah, dafür brauchst du python2.6 :) ansonsten kann man return(...).next()normalerweise schreiben, dass das ein extra Zeichen kosten würde, aber ich kann das Leerzeichen danach weglassen return. Hoa hat wieder irgendwie auf sie verbessert , dass ein LC anstelle eines GE mit
gnibbler
1

Golfscript - 32 Zeichen

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

Haskell, 85

Verwenden Sie den gleichen Algorithmus wie die meisten anderen:

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

Beispiele aus der Problembeschreibung:

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

Ruby 1,9, 72 Zeichen

f=->x{x=x.to_s.split'';99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
SIE
quelle
x * '' anstelle von x.join speichert 2 Zeichen.
Steenslag
1
nice one @steenslag, danke fürs unterrichten, ich bin rubin neuling :-)
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*''}

Probieren Sie es online!

Basierend auf der Antwort von YOU , mit Zeichen anstelle von .split '', um 2 Zeichen zu erhalten. Und ich bin mir sicher, dass es einen Weg gibt, mehr zu tun> <

Jenkar
quelle
1

JavaScript (ES6), 145 126 Zeichen

 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}

Kommentiert:

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

Ich habe das Gefühl, es könnte viel enger sein, aber es ist mir nicht sofort klar, wie. Die Funktion braucht viel Platz, aber ich brauchte es an zwei Stellen.

Dies funktioniert für jede Zeichenfolge, nicht nur für Zahlen, und kann beliebig lang sein.

Computronium
quelle