番号回文を作成する


12

引数として数値を取り、最小桁数を追加して回文にする関数を作成します。番号は最大100桁です。

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

参照長さのためのgolf.shinh.org/p.rb?palindromize
ナブ

サンプルの入力と出力には、提出者がそのケースをカバーしていることを確認するために、正しい答えが偶数桁である例を含めることができますか?中間点が数字ではなく数字の間にある場合、一部のアルゴリズムが失敗する可能性があります。
コンピュトロニウム

1
@Computronium完了。
fR0DDY

回答:


4

J、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からポップできない哀れさ
ニブラー

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

@ fR0DDY、nが長い場合に十分な大きさであれば
機能しません

@ fR0DDY、Pythonはintsとlongsをあまり気にしません。int(2346765434567875432456)は、v2.6.5で2346765434567875432456を返します。どのようにs=n役立つかわかりません。s数字の範囲を取得するために添字を付けることができるように、文字列にする必要があります。そこに理由は何ですか?
ホアロングタム

@ Hoa、fR0DDYにはバックティックがあったと思うが、コメントには表示されない
ニブラー

@Hoa s = [tick] n [tick]でした。
fR0DDY

1

Python-98文字

ホアの答えに基づいて:)

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、ああ、あなたはそのためにpython2.6が必要です:)それ以外の場合はreturn(...).next()通常余分な文字がかかりますが、私は後にスペースを削除することができますreturn。Hoaは、GEの代わりにLCを使用することで、再び改善されました
ニブラー


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.joinの代わりにx * ''は2文字を節約します。
-steenslag

1
素敵な1つ@steenslag、教えてくれてありがとう、私はルビー初心者です:
あなたは


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

ゴルフをしていない:

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

もっときつく感じるかもしれないけど、それがどうしてかすぐには分からない。関数は多くのスペースを使い果たしますが、2つの場所で必要になりました。

これは、数字だけでなく任意の文字列に対して機能し、任意の長さにすることができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.