Buat palindrom angka

12

Tulis fungsi yang menggunakan angka sebagai argumen dan menjadikannya palindrome dengan menambahkan jumlah digit minimum. Jumlahnya akan maksimal 100 digit.

Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
fR0DDY
sumber
golf.shinh.org/p.rb?palindromize untuk referensi panjang
Nabb
Bisakah sampel input dan output menyertakan contoh di mana jawaban yang benar adalah angka genap, hanya untuk memastikan bahwa submitter menutupi kasus itu? Tampaknya bagi saya bahwa beberapa algoritma mungkin gagal jika titik setengahnya adalah antara digit dan bukan pada digit.
Computronium
1
@Computronium Done.
fR0DDY

Jawaban:

4

J, 50 , 32 26 karakter!

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

misalnya

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

Bagaimana cara kerjanya (dengan contoh)

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

Perl, 32 karakter

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

Perlu Perl 5.10 atau lebih baru untuk fitur regex, tetapi tidak ada saklar baris perintah khusus.

Penggunaan sampel:

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

Menggunakan ekstensi regex rekursif Perl 5.10 untuk mencocokkan palindrom trailing terpanjang seperti itu:

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

Kemudian menggantinya dengan dirinya sendiri ( $&) dan menambahkan apa pun string dimulai dengan ( $`), terbalik.

JB
sumber
5

Brachylog 2, 8 byte, tantangan tanggal bahasa

ẹ;AcB↔Bc

Cobalah online! Pertanyaannya menanyakan fungsi, jadi saya berikan satu; tautan TIO mengambil argumen yang menjalankan fungsi seperti program lengkap.

Penjelasan

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

sumber
3

Python, 88 karakter

def f(x):
 x,y=list(str(x)),[]
 while x!=x[::-1]:y+=x.pop(0)
 return''.join(y+x+y[::-1])
KAMU
sumber
bagus dengan pop. Sayang sekali Anda tidak dapat pop dari str
gnibbler
2

Python ( 101 96)

sunting: Diperpendek berdasarkan pada solusi @ 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] 

Asli:

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
sumber
Anda dapat mengganti s = str (n) dengan s = n.
fR0DDY
@ fR0DDY, bahwa pekerjaan wont jika n cukup besar untuk membutuhkan panjang
gnibbler
@ fR0DDY, Python tidak terlalu peduli tentang ints vs longs lagi. int (2346765434567875432456) mengembalikan 2346765434567875432456 pada v2.6.5. Saya tidak melihat bagaimana s=nmembantu; Saya harus smenjadi string sehingga saya bisa berlangganan untuk mendapatkan rentang angka. Apa alasannya?
Hoa Long Tam
@ Hai, saya pikir fR0DDY memiliki backticks di sana tetapi mereka tidak muncul di komentar
gnibbler
@ Haa Itu s = [centang] n [centang].
fR0DDY
1

Python - 98 karakter

Berdasarkan jawaban 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
sumber
Tidak yakin saya menggunakan hak ini, tetapi: "NameError: nama global 'berikutnya' tidak didefinisikan"
JB
@ JB, Ah, Anda perlu python2.6 untuk itu :) kalau tidak bisa ditulis return(...).next()biasanya akan membutuhkan char tambahan, tapi saya bisa menjatuhkan ruang setelah return. Hoa telah memperbaikinya lagi dengan menggunakan LC bukannya GE
gnibbler
1

Golfscript - 32 karakter

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

Haskell, 85

Menggunakan algoritma yang sama seperti kebanyakan orang lain:

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

Contoh dari deskripsi masalah:

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

Ruby 1.9, 72 karakter

f=->x{x=x.to_s.split'';99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
KAMU
sumber
x * '' bukannya x.join menyimpan 2 karakter.
steenslag
1
nice @steenslag, terima kasih sudah mengajar, saya pemula ruby ​​:-)
YOU
1

Ruby , 70 byte

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

Cobalah online!

Berdasarkan jawaban ANDA , dengan karakter bukan .sit '' untuk mendapatkan 2 karakter. Dan saya yakin ada cara untuk memeras lebih sedikit> <

Jenkar
sumber
1

JavaScript (ES6), 145 126 karakter

 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}

Berkomentar:

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

Java, 174 byte

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

Tidak Disatukan:

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

Saya punya perasaan itu bisa menjadi jauh lebih ketat tetapi tidak segera jelas bagi saya bagaimana caranya. Fungsi ini memakan banyak ruang tetapi saya membutuhkannya di dua tempat.

Ini berfungsi untuk string apa pun, bukan hanya angka, dan bisa panjang apa pun.

Computronium
sumber
0

PHP, 64 Bytes

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

Cobalah online!

Jörg Hülsermann
sumber