进行数字回文


12

编写一个以数字作为参数的函数,并通过附加最小位数来使其成为回文。该数字最多为100位数字。

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


样本输入和输出是否可以包含一个示例,其中正确答案是偶数位数,只是为了确保提交者能够解决这种情况?在我看来,如果中途点位于数字之间而不是数字上,则某些算法可能会失败。
Computronium

1
@Computronium完成。
fR0DDY '17

Answers:


4

Ĵ,5032 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或更高版本,但不需要特殊的命令行开关。

样品使用:

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

使用Perl 5.10的递归正则表达式扩展来匹配最长的回文,例如:

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

巨蟒(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 2011年

@ fR0DDY,如果n足够大以至于需要一个长的
gnibbler

@ fR0DDY,Python不再关心int与longs。int(2346765434567875432456)在v2.6.5上返回2346765434567875432456。我看不出有什么s=n帮助;我需要s是一个字符串,才能下标获取数字范围。那里是什么原因?
华隆潭

@Hoa,我认为fR0DDY那里有反引号,但它们未出现在评论中
gnibbler 2011年

@Hoa是s = [tick] n [tick]。
fR0DDY 2011年

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:未定义全局名称'next'”
JB

@JB,嗯,您需要python2.6 :)否则return(...).next()通常可以编写它,这会花费额外的字符,但是我要在后面删除空格return。无论如何,Hoa再次通过使用LC而不是GE
对其

1

Golfscript-32个字符

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

1

哈斯克尔,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个字符

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,感谢您的教学,我是红宝石新手:-)

1

Ruby,70个字节

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

在线尝试!

根据您的回答,使用字符而不是.split来获取2个字符。而且我敢肯定,还有更多方法可以压缩> <


1

JavaScript(ES6),145126 字符

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

取消高尔夫:

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

我觉得这可能会更严格,但是对我来说如何还不是很明显。函数占用了很多空间,但我需要在两个地方使用它。

这适用于任何字符串,不仅限于数字,而且可以为任意长度。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.