Tôi nên đặt gương ở đâu?


30

Đây là một tấm gương : |. Tôi chỉ phát hiện ra rằng bạn có thể dán một tấm gương ở giữa một chuỗi nếu chuỗi đó có thể được nhân đôi trên chính nó! Ví dụ: chuỗi abccba. Nếu bạn cắt nó một nửa, hai nửa là hình ảnh phản chiếu của nhau:

abc  <-->  cba

Vì vậy, chúng ta có thể dán một tấm gương ở giữa chuỗi và chuỗi mới của chúng ta là abc|cba. Đôi khi, chỉ một phần của chuỗi có thể được nhân đôi trên chính nó. Ví dụ: chuỗi "gương". Hai r được nhân đôi, nhưng phần còn lại của chuỗi thì không. Không sao, chúng ta sẽ loại bỏ các phần của chuỗi không phản chiếu lẫn nhau và chúng ta sẽ nhận được chuỗi sau:

r|r

Một số chuỗi có thể được nhân đôi ở nhiều nơi. Ví dụ: "Xin chào thế giới, xyzzyx". Tôi thích có nhiều văn bản phản chiếu trong gương của tôi, vì vậy bạn cần tìm nơi tốt nhất để đặt gương của tôi. Trong trường hợp này, bạn nên xuất chuỗi nhân đôi dài hơn và giống như ví dụ cuối cùng của chúng tôi, loại bỏ mọi thứ khác. Chuỗi này trở thành:

xyz|zyx

Một số chuỗi trông giống như chúng có thể được nhân đôi, nhưng thực tế không thể. Nếu một chuỗi không thể được nhân đôi ở bất cứ đâu, bạn sẽ không xuất ra gì.

Các thách thức:

Cho một chuỗi chỉ chứa có thể in-ascii, tìm nơi tốt nhất để đặt gương của tôi. Nói cách khác,

Tìm chuỗi con palindromic có độ dài lớn nhất, sau đó xuất nó với ký tự ống '|' ở giữa nó

Đầu vào sẽ dài 1-50 ký tự.

Bạn có thể cho rằng đầu vào sẽ không chứa gương |hoặc dòng mới. Ngoài ra, tất cả các nhân vật có thể in được đều là trò chơi công bằng. Nếu chuỗi con được nhân đôi dài nhất được buộc giữa hai chuỗi con, bạn có thể chọn chuỗi con nào để xuất. Ví dụ: đối với chuỗi "abba ollo", bạn phải xuất "ab | ba" hoặc "ol | lo", nhưng việc bạn xuất ra cái nào không quan trọng. Các chuỗi có phân biệt chữ hoa chữ thường, ví dụ "ABba" không nên xuất "AB | ba", nó sẽ xuất ra chuỗi trống.

Mẫu IO:

"Hello World"     --> "l|l"
"Programming Puzzles and Code-Golf"     --> Either "m|m" or "z|z"
"abcba"           --> ""
"Hulluh"          --> "ul|lu"
"abcdefggfedcba"  --> "abcdefg|gfedcba"
"abcdefggfabc"    --> "fg|gf"
"AbbA"            --> "Ab|bA"
"This input is a lot like the last one, but with more characters that don't change the output. AbbA" --> "Ab|bA"

Như thường lệ, đây là môn đánh gôn, vì vậy các sơ hở tiêu chuẩn được áp dụng và câu trả lời ngắn nhất bằng byte sẽ thắng!


Có giới hạn về độ dài của đầu vào không?
Mego

@Mego Miễn là về mặt lý thuyết thuật toán của bạn hoạt động trên bất kỳ đầu vào nào, tôi không quan tâm đến việc mất bao lâu / bao nhiêu bộ nhớ.
DJMcMayhem

Tôi đã hỏi bởi vì các công cụ regex vanilla chỉ có khả năng khớp với các palindromes có độ dài lên đến một giá trị hữu hạn xác định (trái ngược với các palindromes dài tùy ý), và khả năng của một giải pháp dựa trên regex sẽ phụ thuộc vào việc có hay không có phần trên ràng buộc vào độ dài của đầu vào.
Mego

@Mego Ah, điều đó có ý nghĩa. Giả sử đầu vào có thể dài tới 50 ký tự. Nghe như thế nào?
DJMcMayhem

Câu trả lời:


9

Pyth - 19 17 15 13 byte

Cảm ơn @FryAmTheEggman đã tiết kiệm cho tôi hai byte.

ARRGH trường hợp đặc biệt không có câu trả lời. Giải quyết được điều đó!

e_I#jL\|cL2.:

Phòng thử nghiệm .

e                Last element in list, this works out to longest one
  _I             Invariance under reverse, this detect palindrome
   #             Filter
   jL            Map join
    \|           By "|"
    cL2          Map chop in two pieces
     .:Q)        Substrings. Implicit Q). ) makes it do all substrings.

2
Không! Ninja muốn câu trả lời thứ ba; _;
Hạ cấp

Xin giải thích? : 3
Hạ cấp

@Downgoat anh ấy lấy tất cả các chuỗi con và cắt thành hai, nối từng cặp với |, lọc theo đối xứng, nối nó với [k] và lấy phần tử cuối cùng (dài nhất)
busukxuan

@Downgoat xong.
Maltysen

2
:Q)= Bignose
gcampbell

8

05AB1E , 19 17 14 byte

Mã số:

Œévy2ä'|ý©ÂQi®

Giải trình:

Π               # Get all substrings of the input
 é               # Sort by length (shortest first)
  vy             # For each element...
    2ä           # Split into two pieces
      '|ý        # Join by "|"
         ©       # Copy this into the register
          Â      # Bifurcate, pushing a and reversed a
           Q     # Check if it's a palindrome
            i®   # If so, push that string again
                 # Implicit, the top element is outputted

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


5

Python 2, 102 97 byte

def f(s):h=len(s)/2;r=s[:h]+'|'+s[h:];return s and max(r*(r==r[::-1]),f(s[1:]),f(s[:-1]),key=len)

Khá chậm và không hiệu quả ... Xác minh các trường hợp thử nghiệm nhỏ hơn trên Ideone .


4

JavaScript, 100 99 byte

s=>eval('for(O=i=0;s[i++];O=O[j+j]?O:o)for(o="|",j=0;(S=s[i-1-j])&&S==s[i+j++];o=S+o+S);O[1]?O:""')

hoặc là

s=>eval('for(O="",i=0;s[i++];O=O[j+j]||j<2?O:o)for(o="|",j=0;(S=s[i-1-j])&&S==s[i+j++];o=S+o+S);O')

Chỉ tò mò, những gì evalcho?
gcampbell

@gcampbell evalđể tránhreturn
edc65

Bạn không thể sử dụng toán tử dấu phẩy để tránh trả lại?
Thị trưởngMonty

@SpeedyNinja không. forkhông phải là một biểu thức, vì vậy nó thường sẽ yêu cầu niềng răng và mộtreturn
jrich


2

Võng mạc , 66 byte

Số lượng byte giả định mã hóa ISO 8859-1.

M!&`(.)+(?<-1>\1)+(?(1)¶)
O$#`.+
$.&
A-2`
^(.)+?(?=(?<-1>.)+$)
$&|

Hãy thử trực tuyến! (Dòng đầu tiên cho phép kiểm tra một số trường hợp kiểm tra được phân tách bằng nguồn cấp dữ liệu cùng một lúc.)

Hmmm, lâu hơn tôi muốn ...


2

JavaScript (ES6), 91

s=>[...s].map((d,i)=>{for(a='|',j=0;d=s[i-j],d&&d==s[i-~j];r=r[j+++j]?r:a)a=d+a+d},r='')&&r

Ít chơi gôn

f=s=>
  [...s].map(
    (d,i) => {
    for(a='|', j=0; d=s[i-j], d&&d==s[i-~j]; r = r[j++ +j]? r : a)
      a = d+a+d
    }, r=''
  ) && r

Kiểm tra

F=
s=>[...s].map((d,i)=>{for(a='|',j=0;d=s[i-j],d&&d==s[i-~j];r=r[j+++j]?r:a)a=d+a+d},r='')&&r

;[["Hello World", "l|l"]
,["Programming Puzzles and Code-Golf", "m|m"]
,["abcba", ""]
,["Hulluh", "ul|lu"]
,["abcdefggfedcba", "abcdefg|gfedcba"]
,["abcdefggfabc", "fg|gf"]
,["AbbA", "Ab|bA"]
,["This input is a lot like the last one, but with more characters that don't change the output. AbbA", "Ab|bA"]]
.forEach(t=>{
  var i=t[0],k=t[1],r=F(i)
  console.log(k==r?'OK ':'KO ',i+' -> '+r,k!=r?'(check '+k+')':'')
})  


2

Perl 5, 105 100 98 + 1 = 106 101 99 byte

/(?=((.)(?1)?\2)(?{[push@_,$1})(?!))/;($_)=sort{length$b<=>length$a}@_;substr($_,length>>1,0)='|'if$_

Tôi chỉ muốn đưa ra các biểu thức đệ quy đi. Cần -ptùy chọn. Chỉnh sửa: Đã lưu (gạch bỏ 4) 7 byte nhờ @ msh210. (Byte bị thiếu là do một khoản tiết kiệm được thay thế bởi lần lưu gần đây nhất của @ msh210.)


Tôi đã không kiểm tra bất kỳ trong số này, nhưng có lẽ điều này có thể được viết tắt nhiều cách khác nhau, bao gồm: (1) @_=(@_,$1)có thể được push@_,$1. (2) Bỏ qua các dòng mới và trận chung kết ;. (3) Tôi nghi ngờ có một điều kiện loại ngắn hơn bạn có thể sử dụng (nếu không có gì khác thì ít nhất --- có lẽ --- thay thế -cho <=>)
msh210

@ msh210 Cảm ơn vì hai điểm đầu tiên nhưng tôi đã thử -và nó không hoạt động (có lẽ cần parens để ưu tiên đánh bại việc tiết kiệm).
Neil

Hãy thử y...c>>1hoặc y...c/2thay vì length>>1. (Chưa được kiểm tra.)
msh210

@ msh210 Tôi rõ ràng nên đọc các mẹo chơi gôn ở Perl trước ...
Neil

Tôi đoán cặp parens cuối cùng của bạn cũng có thể đi.
msh210

2

Python 2, 91 byte

f=lambda s,p='':s and max((''<p<=s<p+'\x7f')*(p[::-1]+'|'+p),f(s[1:]),f(s[1:],s[0]+p),key=len)

Thay thế \x7fbằng ký tự DEL thực tế, đó là ASCII 127 (ghi có vào Dennis).

Điều này tuân theo một chiến lược tương tự như câu trả lời của Dennis về việc sử dụng maxvà phân nhánh đệ quy để tìm khoảng thời gian palindrom dài nhất. Nhưng, thay vào đó, nó tìm thấy một nửa bên trái, kiểm tra xem nửa bên phải được nhân đôi tương ứng xuất hiện ngay sau nó với một khởi động tự tạo .

Hàm đoán xem ký tự đầu tiên có ở nửa bên trái được nhân đôi hay không. Nếu không, nó chỉ làm rơi nó và đệ quy trên phần còn lại. Nếu có, nó được thêm vào ngăn xếp pcác ký tự đảo ngược. Nếu chuỗi bao giờ bắt đầu với ngăn xếp, chuỗi gương được tạo và được coi là một gương dài nhất có thể. Để tránh |như một đầu ra, chỉ các ngăn xếp không trống được xem xét.


2

Thạch , 17 byte

ẆŒḂÐfṪœs2j”|µẋLḂ$

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

Thực hiện với sự giúp đỡ từ ông XcoderDJMcMayhem trong trò chuyện

Làm thế nào nó hoạt động

ẆŒḂÐfṪœs2j”|µẋLḂ$ - Main link. Argument s  e.g.    ; 'AbbA'

Ẇ                 - All contiguous sublists
   Ðf             - Keep elements that are...
 ŒḂ               -  Palindromic                   ; [['A'], ['b'], ['b'], ['A'], ['bb'], ['AbbA']]
     Ṫ            - Final element                  ; 'AbbA'
      œs2         - Split into 2 chunks            ; ['Ab', 'bA']
         j”|      - Join with "|"                  ; 'Ab|bA'
            µ     - New link with ^ as argument
              LḂ$ - Is the length odd?             ; 1
             ẋ    - Repeat the string ^ many times ; 'Ab|bA'

1

Haskell, 126 111 byte

(!)=drop
f s|n<-length s=last$"":[a++'|':b|k<-[1..n],t<-map(!s)[1..n-k],let[a,b]=take k<$>[t,k!t],a==reverse b]

1

TSQL 227 223 byte

Tôi đã mã hóa độ dài tối đa 99 byte, điều này đã lưu các byte nhưng làm cho nó chậm hơn. Nó vẫn có một hiệu suất tốt mặc dù.

Chơi gôn

DECLARE @t varchar(99)='AbccbA'

,@z char(99)='',@a INT=0,@ INT=0WHILE @a<LEN(@t)SELECT
@z=IIF(LEN(x)>LEN(@z)/2and @t LIKE'%'+x+REVERSE(x)+'%'COLLATE
Thai_bin,x+'|'+REVERSE(x),@z),@=IIF(@=50,1,@+1),@a+=IIF(@=1,1,0)FROM(SELECT
SUBSTRING(@t,@a,@)x)x PRINT @z

Ung dung:

DECLARE @t varchar(99)='AbccbA'

,@z char(99)='',
@a INT=0,
@ INT=0
WHILE @a<LEN(@t)
  SELECT
    @z=IIF(LEN(x)>LEN(@z)/2and @t LIKE'%'+x+REVERSE(x)+'%'COLLATE Thai_bin,x+'|'
       +REVERSE(x),@z),
    @=IIF(@=99,1,@+1),
    @a+=IIF(@=1,1,0)
  FROM
    (SELECT SUBSTRING(@t,@a,@)x)x

PRINT @z

Vĩ cầm


1
Bạn có thể tắt 2 byte nếu bạn giới hạn ở mức 99 vì ví dụ cuối cùng chỉ dài 99 ký tự
Alex Carlsen

1
@VisualBean thankyou, đã thay đổi tập lệnh thành chỉ cho phép 99 ký tự, cũng thay đổi đối chiếu từ Thai_CS_AS sang thai_bin
t-clausen.dk

0

Python 2, 149 byte

R,L,s=range,len,input()
t=max([s[i:j/2+i/2]for i in R(L(s))for j in R(L(s)+1)if s[i:j]==s[i:j][::-1]and(j-i)%2<1],key=L)
print t+'|'*(L(t)>0)+t[::-1]

Dùng thử trực tuyến

Chương trình này tìm thấy nửa đầu của chuỗi con palindromic lớn nhất có độ dài chẵn và in chuỗi đó, theo sau là a |, theo sau là chuỗi đó đảo ngược. Nếu không có chuỗi phù hợp, tsẽ là chuỗi trống và '|'*(L(t)>0)sẽ đánh giá chuỗi trống.


0

Java 8, 294 283 232 byte

s->{int l=s.length(),i=0,j,z,y=0;String a,b="";for(;i<l;i++)for(j=0;j<=l-i;)if((a=s.substring(i,i+j++)).equals(new StringBuffer(a).reverse()+"")&(z=a.length())%2<1&z>y){y=z;b=a;}return y>0?b.substring(0,y/=2)+"|"+b.substring(y):"";}

Giải trình:

Hãy thử nó ở đây.

s->{                               // Method with String as both parameter and return-type
  int l=s.length(),                //  Length of the input-String
      i=0,j,                       //  Index-integers
      z,y=0;                       //  Temp-integers
  String a,b="";                   //  Temp-Strings
  for(;i<l;i++)                    //  Loop (1) from 0 to `l` (exclusive)
    for(j=0;j<=l-i;                //   Inner loop (2) from 0 to `l-i` (inclusive)
      if((a=s.substring(i,i+j++))  //    Set the current substring to `a`
          .equals(new StringBuffer(a).reverse()+"")
                                   //    If `a` is a palindrome
         &(z=a.length())%2<1       //    And the length of `a` is even
         &z>y){                    //    And the length of `a` is larger than `y`
        y=z;                       //     Change `y` to `z`
        b=a;}                      //     Change `b` to `a`
                                   //   End of inner loop (2) (implicit / single-line body)
                                   //  End of loop (1) (implicit / single-line body)
  return y>0?                      //  If the result-length is not 0:
    b.substring(0,y/=2)+"|"+b.substring(y)
                                   //   Return the result
   :                               //  Else:
    "";                            //   Return an empty String
}                                  // End of method
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.