ทำตัวเลข palindrome


12

เขียนฟังก์ชั่นที่ใช้ตัวเลขเป็นอาร์กิวเมนต์และทำให้เป็น palindrome โดยต่อท้ายจำนวนหลักขั้นต่ำ จำนวนจะต้องไม่เกิน 100 หลัก

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

golf.shinh.org/p.rb?palindromizeสำหรับความยาวอ้างอิง
Nabb

ตัวอย่างอินพุตและเอาท์พุตสามารถรวมตัวอย่างที่คำตอบที่ถูกต้องเป็นจำนวนหลักได้เพียงเพื่อให้แน่ใจว่าผู้ส่งครอบคลุมกรณีนั้นหรือไม่ ฉันคิดว่าอัลกอริทึมบางอย่างอาจล้มเหลวถ้าจุดกึ่งกลางอยู่ระหว่างตัวเลขแทนที่จะเป็นหลัก
Computronium

1
@Computronium เรียบร้อยแล้ว
fR0DDY

คำตอบ:


4

J, 50 , 32 26 ตัวละคร!

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

เช่น

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

มันทำงานอย่างไร (ตามตัวอย่าง)

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 ตัวอักษร

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

ต้องการ Perl 5.10 หรือใหม่กว่าสำหรับฟีเจอร์ regex แต่ไม่มีสวิตช์บรรทัดคำสั่งพิเศษ

ตัวอย่างการใช้งาน:

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

ใช้ส่วนขยาย Regex แบบเรียกซ้ำ Perl 5.10 เพื่อให้ตรงกับ palindrome ที่ยาวที่สุดเช่น:

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

จากนั้นจะแทนที่ด้วยตัวเอง ( $&) และผนวกสิ่งที่สตริงเริ่มต้นด้วย ( $`) กลับด้าน


5

Brachylog 2, 8 ไบต์, ภาษาโพสต์วันที่ท้าทาย

ẹ;AcB↔Bc

ลองออนไลน์! คำถามถามถึงฟังก์ชั่นดังนั้นฉันจึงจัดให้ ลิงก์ TIO รับอาร์กิวเมนต์ที่เรียกใช้ฟังก์ชันเหมือนโปรแกรมเต็ม

คำอธิบาย

ẹ;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 ตัวอักษร

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

ดีกับป๊อป น่าเสียดายที่คุณไม่สามารถป๊อปจาก str
gnibbler

2

Python ( 101 96)

แก้ไข:สั้นลงตามโซลูชันของ @ 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] 

เดิม:

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) กับ s n=
fR0DDY

@ fR0DDY ที่จะไม่ทำงานถ้า n มีขนาดใหญ่พอที่จะต้องใช้ระยะเวลานาน
gnibbler

@ fR0DDY, Python ไม่สนใจอะไรมากเกี่ยวกับ ints vs longs อีกต่อไป int (2346765434567875432456) ส่งคืน 2346765434567875432456 บน v2.6.5 ฉันไม่เห็นวิธีs=nช่วย ฉันต้องsเป็นสตริงเพื่อให้ฉันสามารถห้อยเพื่อรับช่วงหลัก มีเหตุผลอะไร?
Hoa Long Tam

@Hoa ฉันคิดว่า fR0DDY มี backticks อยู่ที่นั่น แต่พวกเขาไม่ได้แสดงความคิดเห็น
gnibbler

@Hoa มันคือ s = [tick] n [tick]
fR0DDY

1

Python 98 ตัวอักษร

ตามคำตอบของ 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])

ไม่แน่ใจว่าฉันใช้สิทธิ์นี้ แต่: "ไม่ได้กำหนด NameError: ชื่อโกลบอล 'ถัดไป'"
JB

@JB, Ah, คุณต้องการ python2.6 สำหรับเรื่องนั้น :) มิฉะนั้นก็สามารถเขียนได้return(...).next()โดยปกติแล้วจะมีค่าใช้จ่ายเพิ่มเติม แต่ฉันได้ลดพื้นที่หลังจากreturnนั้น Hoa ได้ปรับปรุงมันอีกครั้งโดยใช้ LC แทน GE
gnibbler


1

Haskell, 85

ใช้อัลกอริทึมเดียวกันกับคนอื่น ๆ มากที่สุด:

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

ตัวอย่างจากคำอธิบายปัญหา:

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

1

Ruby 1.9, 72 chars

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

x * '' แทน x.join บันทึก 2 ตัวอักษร
steenslag

1
ดีหนึ่ง @steenslag ขอบคุณสำหรับการเรียนการสอน, I am ทับทิมมือใหม่ :-)
YOU


1

JavaScript (ES6), 145 126 ตัวอักษร

 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}

แสดงความคิดเห็น:

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 ไบต์

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

ฉันมีความรู้สึกว่ามันแน่นกว่านี้มาก แต่มันก็ไม่ชัดเจนสำหรับฉันทันที ฟังก์ชั่นกินพื้นที่เยอะ แต่ฉันต้องการมันในสองที่

สิ่งนี้ใช้ได้กับสตริงใด ๆ ไม่ใช่แค่ตัวเลขและสามารถมีความยาวได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.