Zrób palindrom liczbowy

12

Napisz funkcję, która przyjmuje liczbę jako argument i czyni ją palindromem, dodając minimalną liczbę cyfr. Numer będzie miał maksymalnie 100 cyfr.

Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
fR0DDY
źródło
golf.shinh.org/p.rb?palindromize dla długości referencyjnych
Nabb
Czy przykładowe dane wejściowe i wyjściowe mogą zawierać przykład, w którym poprawną odpowiedzią jest parzysta liczba cyfr, tylko po to, aby upewnić się, że zgłaszający obejmują tę sprawę? Wydaje mi się, że niektóre algorytmy mogą zawieść, jeśli punkt środkowy znajduje się między cyframi zamiast cyfr.
Computronium
1
@Computronium Gotowe.
fR0DDY

Odpowiedzi:

4

J, 50 , 32 26 znaków!

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

na przykład

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

Jak to działa (przykład)

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
źródło
10

Perl, 32 znaki

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

Wymaga Perla 5.10 lub nowszego dla funkcji wyrażenia regularnego, ale nie ma specjalnego przełącznika wiersza poleceń.

Przykładowe użycie:

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

Używa rekurencyjnych rozszerzeń wyrażenia regularnego Perla 5.10, aby dopasować je do najdłuższego końcowego palindromu jako takiego:

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

Następnie zamienia go na siebie ( $&) i dodaje $`odwrotne ciągi zaczynające się od ( ).

JB
źródło
5

Brachylog 2, 8 bajtów, wyzwanie dotyczące postdatacji języka

ẹ;AcB↔Bc

Wypróbuj online! Pytanie wymaga funkcji, więc podałem ją; link TIO przyjmuje argument, który uruchamia funkcję jak pełny program.

Wyjaśnienie

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

źródło
3

Python, 88 znaków

def f(x):
 x,y=list(str(x)),[]
 while x!=x[::-1]:y+=x.pop(0)
 return''.join(y+x+y[::-1])
TY
źródło
fajnie z popem. szkoda, że ​​nie możesz wyskoczyć z str
gnibbler
2

Python ( 101 96)

edycja: Skrócono na podstawie rozwiązania @ 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] 

Oryginał:

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
źródło
Możesz zamienić s = str (n) na s = n.
fR0DDY
@ fR0DDY, że nie zadziała, jeśli n jest wystarczająco duże, aby potrzebować długiego
gnibbler
@ fR0DDY, Python nie dba już o ints vs longs. int (2346765434567875432456) zwraca 2346765434567875432456 w wersji 2.6.5. Nie rozumiem, jak to s=npomaga; Muszę sbyć ciągiem znaków, aby móc zapisać indeksy, aby uzyskać zakresy cyfr. Jakie jest tam uzasadnienie?
Hoa Long Tam
@Hoa, myślę, że fR0DDY miał tam backsticksy, ale nie pojawiają się w komentarzach
gnibbler
@Hoa To było s = [zaznaczyć] n [zaznaczyć].
fR0DDY
1

Python - 98 znaków

Na podstawie odpowiedzi 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])
gnibbler
źródło
Nie jestem pewien, czy korzystam z tego prawa, ale: „NameError: nazwa globalna„ next ”nie jest zdefiniowana”
JB
@JB, Ach, potrzebujesz do tego python2.6 :) w przeciwnym razie można napisać, return(...).next()że zwykle kosztuje to dodatkowy znak, ale po tym mogę zostawić miejsce return. Hoa i tak poprawił to, używając LC zamiast GE
gnibbler
1

Golfscript - 32 znaki

{`:s-1%:r,,{s<r+..-1%=*}%{}?~}:f
gnibbler
źródło
1

Haskell, 85

Używając tego samego algorytmu, jak większość innych:

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

Przykłady z opisu problemu:

*Main> map (f.show) [12,232,2323,1012121]
["121","232","23232","101212101"]
JB
źródło
1

Ruby 1.9, 72 znaki

f=->x{x=x.to_s.split'';99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
TY
źródło
x * '' zamiast x.join zapisuje 2 znaki.
steenslag
1
nice one @steenslag, dzięki za nauczanie, jestem początkującym rubinem :-)
TY
1

Rubinowy , 70 bajtów

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

Wypróbuj online!

Na podstawie odpowiedzi TY , z znakami zamiast .split, aby uzyskać 2 znaki. I jestem pewien, że jest sposób, aby wycisnąć jeszcze więcej> <

Jenkar
źródło
1

JavaScript (ES6), 145 126 znaków

 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}

Skomentowano:

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
źródło
0

Java, 174 bajty

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

Nie golfowany:

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

Mam wrażenie, że może być o wiele ciaśniej, ale nie od razu wiadomo, jak to zrobić. Funkcja zjada dużo miejsca, ale potrzebowałem go w dwóch miejscach.

Działa to na dowolny ciąg, nie tylko na liczby, i może mieć dowolną długość.

Computronium
źródło