Tạo một số bảng màu


12

Viết hàm lấy một số làm đối số và biến nó thành một bảng màu bằng cách nối thêm số chữ số tối thiểu. Số sẽ có tối đa 100 chữ số.

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

golf.shinh.org/p.rb?palindromize cho độ dài tham chiếu
Nabb

Các đầu vào và đầu ra mẫu có thể bao gồm một ví dụ trong đó câu trả lời đúng là số chữ số chẵn, chỉ để đảm bảo rằng các trình đệ trình bao gồm trường hợp đó? Dường như với tôi rằng một số thuật toán có thể thất bại nếu điểm giữa là giữa các chữ số thay vì trên một chữ số.
Computronium

1
@Computronium Xong.
fR0DDY

Câu trả lời:


4

J, 50 , 32 26 ký tự!

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

ví dụ

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

Cách thức hoạt động (ví dụ)

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 ký tự

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

Cần Perl 5.10 trở lên cho các tính năng regex, nhưng không có công tắc dòng lệnh đặc biệt.

Sử dụng mẫu:

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

Sử dụng các phần mở rộng regex đệ quy của Perl 5.10 để phù hợp với bảng màu dài nhất như sau:

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

Sau đó, nó thay thế nó bằng chính nó ( $&) và nối thêm bất cứ chuỗi nào bắt đầu bằng ( $`), đảo ngược.


5

Brachylog 2, 8 byte, thách thức ngôn ngữ

ẹ;AcB↔Bc

Hãy thử trực tuyến! Câu hỏi yêu cầu một chức năng, vì vậy tôi đã cung cấp một chức năng; liên kết TIO lấy một đối số chạy một chức năng như một chương trình đầy đủ.

Giải trình

ẹ;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 ký tự

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

tốt đẹp với pop. đáng tiếc bạn không thể bật từ str
gnibbler

2

Con trăn ( 101 96)

chỉnh sửa: Rút ngắn dựa trên giải pháp @ gnibbler's

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] 

Nguyên:

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

Bạn có thể thay s = str (n) bằng s = n.
fR0DDY

@ fR0DDY, rằng công việc sẽ không nếu n là đủ lớn để cần một chặng đường dài
gnibbler

@ fR0DDY, Python không quan tâm quá nhiều đến ints vs longs nữa. int (2346765434567875432456) trả về 2346765434567875432456 trên v2.6.5. Tôi không thấy cách s=ngiúp đỡ; Tôi cần sphải là một chuỗi để tôi có thể đăng ký để có được phạm vi chữ số. Lý do ở đó là gì?
Hoa Long Tâm

@Hoa, tôi nghĩ rằng fR0DDY đã có backticks ở đó nhưng họ không xuất hiện trong các bình luận
gnibbler

@Hoa Đó là s = ​​[tick] n [tick].
fR0DDY

1

Python - 98 ký tự

Dựa vào câu trả lời của 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])

Không chắc chắn tôi đang sử dụng quyền này, nhưng: "NameError: tên toàn cầu 'next' không được xác định"
JB

@JB, Ah, bạn cần python2.6 cho điều đó :) nếu không nó có thể được viết return(...).next()thường sẽ tốn thêm một char, nhưng tôi sẽ bỏ không gian sau return. Dù sao đi nữa, Hoa đã cải thiện nó bằng cách sử dụng LC thay vì GE
gnibbler


1

Haskell, 85

Sử dụng cùng một thuật toán như hầu hết mọi người khác:

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

Ví dụ từ mô tả vấn đề:

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

1

Ruby 1.9, 72 ký tự

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

x * '' thay vì x.join lưu 2 ký tự.
steenslag

1
đẹp một @steenslag, nhờ phục vụ giảng dạy, tôi ruby người mới :-)
BẠN


1

JavaScript (ES6), 145 126 ký tự

 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}

Đã bình luận:

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 byte

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

Ung dung:

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

Tôi có cảm giác nó có thể chặt hơn rất nhiều nhưng nó không rõ ràng ngay lập tức với tôi như thế nào. Chức năng ngốn rất nhiều không gian nhưng tôi cần nó ở hai nơi.

Điều này hoạt động cho bất kỳ chuỗi, không chỉ số, và nó có thể là bất kỳ chiều dài.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.