숫자 회문 만들기


12

숫자를 인수로 사용하고 최소 자릿수를 추가하여 회문으로 만드는 함수를 작성하십시오. 숫자는 최대 100 자리입니다.

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


제출자가 해당 사례를 다루도록하기 위해 샘플 입력 및 출력에 정답이 짝수 인 예제를 포함 할 수 있습니까? 중간 지점이 숫자가 아닌 숫자 사이에 있으면 일부 알고리즘이 실패 할 수 있습니다.
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

펄, 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

파이썬, 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

@ fR0DDY, n이 길어야 할만큼 충분히 크면 작동하지 않습니다
gnibbler

@ fR0DDY, Python은 더 이상 ints와 long에 대해별로 신경 쓰지 않습니다. int (2346765434567875432456)는 v2.6.5에서 2346765434567875432456을 반환합니다. 어떻게 s=n도움이 되는지 모르겠습니다 . 내가 필요로 s내가 자리 범위를 얻기 위해 첨자 할 수 있도록 문자열이 될 수 있습니다. 거기에 추론이 무엇입니까?
호아 롱 탐

@Hoa, fR0DDY에 백틱이 있다고 생각하지만 의견에 표시되지 않습니다
gnibbler

@Hoa 그것은 s = [tick] n [tick]이었다.
fR0DDY

1

파이썬-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는 GE
gnibbler


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

루비 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
멋진 @steenslag, 교육 주셔서 감사합니다, 나는 루비 초보자입니다 :-)
당신


1

자바 스크립트 (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

자바, 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;
    }

나는 그것이 훨씬 더 타이트 할 수 있다고 생각하지만 어떻게 나에게 명백하지는 않습니다. 이 기능은 많은 공간을 차지하지만 두 곳에서 필요합니다.

이것은 숫자뿐만 아니라 모든 문자열에서 작동하며 길이가 될 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.