Máy phát điện đóng cửa Palindromic hai chiều


24

Giới thiệu

Một đóng cửa palindromic của một chuỗi đầu vào là palindrom ngắn nhất có thể được xây dựng từ chuỗi đầu vào nơi palindrom cuối cùng bắt đầu với chuỗi đầu vào.

Đối với thử thách này, chúng tôi sẽ xem xét việc đóng cửa hai chiều như vậy

  • Trái Palindromic Đóng của một chuỗi đầu vào là palindrom ngắn nhất có thể bắt đầu bằng chuỗi đầu vào.
  • Đóng Palindromic phải của một chuỗi đầu vào là palindrom ngắn nhất có thể kết thúc bằng chuỗi đầu vào.
  • Đóng cửa Palindromic hai chiều của một chuỗi đầu vào là ngắn hơn của Đóng cửa Palindromic bên trái hoặc bên phải của chuỗi đầu vào.

Bài tập

Nhiệm vụ của bạn rất đơn giản. Đưa ra một chuỗi (chỉ bao gồm ASCII có thể in, các dòng mới và khoảng trắng), xuất ra đóng cửa hai chiều của chuỗi đó. Trong trường hợp hòa, một trong hai lần đóng cửa bên trái hoặc bên phải là đầu ra hợp lệ.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và in kết quả sang STDOUT (hoặc thay thế gần nhất) hoặc trả về dưới dạng chuỗi.

Bạn có thể giả định rằng đầu vào sẽ không bao giờ là một chuỗi rỗng.

Một vài ví dụ:

<Input>   -> <Output>
"abcdef"  -> "abcdefedcba"  (or "fedcbabcdef")
"abcba"   -> "abcba"
"abcb"    -> "abcba"
"cbca"    -> "acbca"

Tín dụng ý tưởng ban đầu được chuyển đến VisualMelon, ý tưởng cuối cùng với sự giúp đỡ từ Martin và Zgarb

Các thuật ngữ đóng cửa palindromic, đóng cửa pallindromic trái và đóng cửa palindromic phải được sử dụng và định nghĩa đầu tiên bởi bài viết này .


1
Tôi muốn xem một giải pháp palindromic ...
ojdo 17/03/2015

2
@ojdo Tôi đã nghĩ đến việc thêm nó như một phần thưởng, nhưng tôi khá chắc chắn rằng hầu hết các câu trả lời sẽ chỉ sử dụng các bình luận để tạo ra bảng màu. Nếu một số câu trả lời thực sự có thể là một palindrom quá, mà không dựa vào ý kiến, tôi sẽ để lại một tiền thưởng cho câu trả lời đó!
Tối ưu hóa

Câu trả lời:


11

Bình thường, 22 19

hfq_TTsm,+z_d+_dzyz

Hãy thử trực tuyến .

Giải trình

Việc đóng palindromic hai chiều là một trong hai dạng AXhoặc XA, trong đó Xlà chuỗi đầu vào và Alà một chuỗi con của X. Tôi thực sự phải là một chuỗi con liền kề của X, một tiền tố cho một hình thức, một hậu tố cho hình thức khác. Nhưng tôi không quan tâm đến những khuyết điểm này. Một chuỗi con (liền kề hoặc không) là tất cả những gì tôi cần trong Pyth.

                        Implicit: z = raw_input() // Read a string
                 yz     A list with all substrings (contiguous or not) of z
       m                For each of these substrings d, build
        ,                  a pair of two strings:
         +z_d              ( z + inveres(d) ,
             +_dz            inverse(d) + z )
      s                 Sum (put all created pairs into a list)
 fq_TT                  filter elements T, where inverse(T) == T (Palindrom)
h                          Take the first element

Chỉnh sửa

Phiên bản cũ đã ra lệnh cho các chuỗi sau khi lọc theo chiều dài .olN.... Chỉ cần nhận ra, điều đó ytrả về các chuỗi con theo thứ tự chiều dài. Vì vậy, các palindromes đã được sắp xếp.


6

Clip , 40

(sl`f[a=ava}+m[i+v+ixx}Rlxm[i+xvu0ix}Rlx

Thí dụ

Documents>java -jar Clip4.jar palindrome.clip
abcb
abcba

Giải trình

(sl`                                        .- The shortest                     -.
    f[a=ava}                                .- palindrome                       -.
            +                               .- among the following two sets:    -.
             m[i      }Rlx                  .- For each number up to length(x)  -.
                +                           .- combine                          -.
                 v+ix                       .- the last i chars of x, reversed  -.
                     x                      .- and x.                           -.
                          m[i       }Rlx    .- For each number up to length(x)  -.
                             +              .- combine                          -.
                              x             .- x and                            -.
                               vu0ix        .- the first i chars of x, reversed.-.

6

CJam, 30 byte

Bây giờ thực sự hy vọng sẽ thấy một câu trả lời của CJam .. Vì vậy, đây là: P

q:Q,{)QW%/(Q+Q@+s}%{,}${_W%=}=

Tôi thực sự ghét {,}$khối đó trong đó, nhưng tôi nhận được một danh sách không có thứ tự các palindromes có thể do thuật toán thế hệ tôi đang sử dụng.

Giải thích mã

q:Q,{            }%             "Read the input string, store in Q, take length and";
                                "run the code block that many times";
     )QW%                       "Increment the iteration index and Put reversed Q on stack";
         /                      "Split reversed Q into parts of incremented iteration index";
          (Q+                   "Take out the first part and prepend it to Q";
             Q@+s               "Take the rest of the parts and append them to Q";
                   {,}$         "At this point, we have all possible prepended and appended";
                                "sequences of the input string. Sort them by length";
                       {_W%=}=  "Take the first sequence which is a palindrome";

Dùng thử trực tuyến tại đây


6
Tôi thực sự ghét {,}$khối đó trong đó quá! Đùa thôi, tôi không biết bất cứ điều gì ở CJam làm.
Alex A.

4

Con trăn 2 115 113 109 105 96 byte

f=lambda x:[x for x in sum([[x[:~i:-1]+x,x+x[i::-1]]for i in range(len(x))],[])if x==x[::-1]][0]

Có thể hy vọng golf xuống hơn nữa. Bits có thể đáng lưu ý:

  • sử dụng tổng cho hai danh sách hiểu trong một
  • xây dựng các thuật ngữ theo thứ tự được sắp xếp để tránh sự cần thiết của min (được đề xuất bởi @Jakube)

1
Các mục không hoàn toàn theo thứ tự được sắp xếp, vì vậy điều này không thành công cho các chuỗi như a.
Sp3000 17/03/2015

4

Toán học, 96 byte

Phải có một cách thanh lịch hơn thế này ...

""<>#&@@SortBy[r=Reverse;#/.{b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}&/@{r@#,#}&@Characters@#,Length]&

Điều này xác định một hàm không tên, lấy một chuỗi và trả về kết quả.

Ý tưởng cơ bản là

  • Chia chuỗi thành Characters.
  • Tạo thành một mảng với danh sách này và đảo ngược của nó.
  • Sử dụng khớp mẫu để tìm đúng palindromic của mỗi trong số chúng:

    {b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}
    

    Lưu ý rằng điều này không thực sự trả về một danh sách phẳng. Ví dụ: {a,b,c}bạn nhận được

    {a,b,{c,b,a}}
    
  • Sắp xếp hai kết quả theo chiều dài.

  • Chọn ngắn hơn và nối nó lại thành một chuỗi với ""<>#&@@.

Nó xuất ra abacabakhi đầu vào là abac. Câu trả lời đúng là cabac. Tôi nghĩ bạn nên làm phẳng chúng trước khi sắp xếp theo chiều dài.
alephalpha 17/03/2015

1
@alephalpha Tìm thấy một bản sửa lỗi tốt hơn mà không yêu cầu thay đổi kích thước mã (và đó thực sự là ý định của tôi đằng sau việc không sắp xếp nó).
Martin Ender

2

Brachylog (2), 6 byte, thách thức postdates ngôn ngữ

~{↔?a}

Hãy thử trực tuyến!

Như thường lệ đối với Brachylog, đây là một chức năng, không phải là một chương trình đầy đủ.

Giải trình

~{↔?a}
~{   }   Find a value that produces {the input} upon doing the following:
  ↔        reversing it;
   ?       asserting that we still have the same value;
    a      and taking either a prefix, or a suffix.

Theo như tôi biết (đó không phải là ngôn ngữ của tôi, nhưng có vẻ như không thể), ađã không được thêm vào Brachylog cho thử thách này, nhưng nó thực sự tiện dụng ở đây. Chúng tôi sử dụng phương pháp "đảo ngược và khẳng định nó không thay đổi" để khẳng định rằng giá trị chúng tôi tìm thấy là một bảng màu.

Về lý do tại sao điều này tạo ra palindrom ngắn nhất , thứ tự đánh giá của Prolog (và do đó của Brachylog) bị ảnh hưởng nặng nề bởi điều đầu tiên mà nó đánh giá. Trong trường hợp này, đó là một lệnh "đảo ngược" và (giống như hầu hết các hoạt động danh sách), nó đặt một thứ tự đánh giá nhằm mục đích giảm thiểu kích thước của danh sách kết quả. Vì nó giống như kích thước của đầu ra, chương trình vui vẻ kết thúc tối thiểu hóa chính xác điều đúng, có nghĩa là tôi không cần thêm bất kỳ gợi ý rõ ràng nào.


a- Adfix không được thêm cho thử thách này. Tôi không có biểu tượng có sẵn với khả năng ghi nhớ tốt cho tiền tố và hậu tố, do đó tôi đã hợp nhất cả hai vào tiền tố có thể lấy các chỉ mục để chọn tiền tố hoặc hậu tố chỉ khi cần.
Gây tử vong vào

1

Hồng ngọc, 76 + 2 = 78

Với cờ dòng lệnh -pl( lcó thể không cần thiết tùy thuộc vào cách bạn thực hiện nhập liệu), hãy chạy

$_=[[$_,r=$_.reverse]*"\0",r+"\0#$_"].min_by{|s|s.sub!(/(.*)\0\1/){$1}.size}

Cho một xâu 'abaa', tạo ra chuỗi 'cbca 0 ACBC' và 'ACBC 0 cbca', nơi 0 là nhân vật chưa in ra với mã ascii 0. Sau đó nó xóa một bản sao của chuỗi dài nhất khung lặp đi lặp lại 0 nó tìm thấy trong mỗi, 'a' trong lần đầu tiên và 'cbc' trong lần thứ hai, để có được hai lần đóng cửa. Sau đó, nó đưa ra kết quả ngắn nhất.

Điều thực sự kỳ lạ duy nhất về mã đánh gôn là nó rút ngắn các chuỗi tại chỗ trong khi sắp xếp chúng, thứ mà chúng ta có thể thoát khỏi vì min_bychỉ thực hiện khối một lần cho mỗi phần tử được so sánh (cả vì đó là biến đổi Schwartzian và vì chỉ có hai các yếu tố để so sánh).


1

Python 3, 107 byte


f=lambda a:[i for i in[a[:i:-1]*j+a+a[-1-i::-1]*(1-j)for i in range(len(a))for j in(0,1)]if i==i[::-1]][-1]

Để kiểm tra:

>>> print("\n".join(map(f, ["abcdef", "abcba", "abcb", "cbca"])))
abcdefedcba
abcba
abcba
acbca

1

Haskell, 107 byte

import Data.List
r=reverse
f s=snd$minimum[(length x,x)|x<-map(s++)(tails$r s)++map(++s)(inits$r s),x==r x]

Kiểm tra:

*Main> mapM_ (putStrLn.f) ["abcdef", "abcba", "abcb", "cbca"]
abcdefedcba
abcba
abcba
acbca

1

J, 66 62 byte

3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

Khá đơn giản. Hai thủ thuật tôi sử dụng:

Đóng cửa palindromic bên phải là đóng cửa palindromic bên trái của chuỗi đảo ngược.

Tìm độ dài của chuỗi có độ dài tối thiểu và độ nhạt màu với biểu thức min (is_palindrom / length).

   f=.3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

   f 'lama'
lamal

Hãy thử trực tuyến tại đây.

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.