Bir sayı palindromu yap


12

Bir sayıyı bağımsız değişken olarak alan ve minimum sayı ekleyerek onu bir palindrom yapan bir işlev yazın. Sayı en fazla 100 basamaklı olacaktır.

Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101

referans uzunlukları için golf.shinh.org/p.rb?palindromize
Nabb

Örnek girişleri ve çıkışları, doğru cevapların eşit sayıda basamak olduğu bir örnek içerebilir mi, sadece gönderenlerin bu durumu kapsamasını sağlamak için? Bana göre, yarım nokta bir rakam yerine rakamlar arasındaysa bazı algoritmalar başarısız olabilir.
Computronium

1
@ Compputronium Tamamlandı.
fR0DDY

Yanıtlar:


4

J, 50 , 32 26 karakter!

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

Örneğin

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

Nasıl çalışır (örnek olarak)

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 karakter

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

Normal ifade özellikleri için Perl 5.10 veya üstü gerekir, ancak özel komut satırı anahtarı yoktur.

Örnek kullanım:

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

Perl 5.10'un özyinelemeli normal ifade uzantılarını, en uzun sondaki palindromla eşleşecek şekilde kullanır:

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

Daha sonra kendisini ( $&) ile değiştirir ve $`tersine ( ) ile başlayan her şeyi ekler .


5

Brachylog 2, 8 bayt, dil postdates zorluğu

ẹ;AcB↔Bc

Çevrimiçi deneyin! Soru bir işlev ister, bu yüzden bir tane sağladım; TIO bağlantısı, tam program gibi bir işlevi çalıştıran bir argüman alır.

açıklama

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

def f(x):
 x,y=list(str(x)),[]
 while x!=x[::-1]:y+=x.pop(0)
 return''.join(y+x+y[::-1])

pop ile güzel. yazık sen str gelen pop olamaz
gnibbler

2

Python ( 101 96)

edit: @ gnibbler'in çözümüne göre kısaltılmış

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] 

Orijinal:

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

S = str (n) yerine s = kullanabilirsiniz n.
fR0DDY

@ fR0DDY, n uzun süre ihtiyaç
duyacak

@ fR0DDY, Python artık ints ve longs'u pek önemsemiyor. int (2346765434567875432456) v2.6.5 sürümünde 2346765434567875432456 değerini döndürür. Nasıl s=nyardımcı olduğunu görmüyorum ; sRakam aralıkları almak için abone olabilir bir dize olması gerekir . Oradaki mantık nedir?
Hoa Long Tam

@Hoa, fR0DDY'nin orada backticks olduğunu düşünüyorum ama yorumlarda
görünmüyorlar

@Hoa Bu s = [kene] n [kene] idi.
fR0DDY

1

Python - 98 karakter

Hoa'nın cevabına göre :)

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

Bu hakkı kullandığımdan emin değilim, ancak: "NameError: 'next' global adı tanımlanmadı"
JB

@JB, Ah, bunun için python2.6'ya ihtiyacınız var :) aksi takdirde return(...).next()genellikle ekstra bir karaktere mal olacak, ancak daha sonra alanı bırakacağım yazılabilir return. Hoa, GE
gnibbler

1

Golfscript - 32 karakter

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

1

Haskell, 85

Herkesle aynı algoritmayı kullanmak:

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

Sorun tanımından örnekler:

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

1

Yakut 1.9, 72 karakter

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

x.join yerine x * '' 2 karakter kaydeder.
steenslag

1
nice one @steenslag, öğretim için teşekkürler, ben ruby ​​acemi :-)
YOU


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}

Yorumlananlar:

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 bayt

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

Çok daha sıkı olabileceğini hissediyorum ama nasıl yapılacağı hemen belli değil. İşlev çok yer kaplıyor ama iki yerde ihtiyacım vardı.

Bu, yalnızca sayılar için değil, herhangi bir dize için çalışır ve herhangi bir uzunluk olabilir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.