거울을 어디에 두어야합니까?


30

이것은 거울 |입니다. 문자열 자체를 미러링 할 수 있다면 문자열 중간에 거울을 붙일 수 있다는 것을 알았습니다! 예를 들어, string abccba입니다. 반으로 자르면 두 개의 반쪽이 서로의 거울 이미지입니다.

abc  <-->  cba

따라서 문자열 중간에 거울을 붙일 수 있으며 새 문자열은 abc|cba입니다. 때로는 문자열의 일부만 자체적으로 미러링 될 수 있습니다. 예를 들어 문자열 "미러"입니다. 두 r은 미러링되지만 나머지 문자열은 미러링되지 않습니다. 괜찮습니다. 우리는 서로 미러링되지 않는 문자열 부분을 제거하고 다음 문자열을 얻습니다.

r|r

일부 문자열은 여러 곳에 미러링 될 수 있습니다. 예를 들어 "Hello World, xyzzyx"입니다. 거울에 많은 텍스트가 반영되는 것을 좋아하므로 거울을 놓을 가장 좋은 장소를 찾아야합니다. 이 경우 더 긴 미러 된 문자열을 출력하고 마지막 예와 같이 다른 모든 것을 제거해야합니다. 이 문자열은 다음과 같습니다.

xyz|zyx

일부 문자열 미러링 할 수있는 것처럼 보이지만 실제로는 그렇지 않습니다. 문자열을 어디에서나 미러링 할 수 없으면 아무것도 출력하지 않아야합니다.

도전 과제 :

인쇄 가능한 ASCII 만 포함 된 문자열이 주어지면 내 거울을 놓을 가장 좋은 곳을 찾으십시오. 다른 말로,

가장 큰 짝수 길이의 회문 하위 문자열을 찾은 다음 파이프 문자 '|'로 출력하십시오. 그 중간에.

입력 길이는 1 ~ 50 자입니다.

입력에 미러 |또는 줄 바꾸기가 포함되지 않는다고 가정 할 수 있습니다 . 그 외에도 모든 인쇄 가능한 ASCII 캐릭터는 공정한 게임입니다. 가장 긴 미러 된 하위 문자열이 두 개의 하위 문자열로 묶인 경우 출력 할 문자열을 선택할 수 있습니다. 예를 들어, 문자열 "abba ollo"의 경우 "ab | ba"또는 "ol | lo"를 출력해야하지만 어떤 것이 출력되는지는 중요하지 않습니다. 문자열은해야 대소 문자를 구분, 예를 들어, "아바"입니다 하지 출력 "AB | 바"가 출력 빈 문자열해야한다.

샘플 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"

평소와 같이 이것은 코드 골프이므로 표준 허점이 적용되며 바이트 단위의 최단 답변이 이깁니다!


입력 길이에 제한이 있습니까?
Mego

@ Mego 알고리즘이 이론적으로 모든 입력에서 작동하는 한, 시간이 얼마나 걸리거나 얼마나 많은 메모리가 필요한지는 상관하지 않습니다.
DJMcMayhem

바닐라 정규식 엔진은 길이가 긴 회문을 지정된 유한 값까지만 일치시킬 수 있기 때문에 (임의로 긴 회 문과는 달리) 정규식 기반 솔루션의 가능성은 상단이 있는지 여부에 달려 있습니다 입력 길이에 바인딩됩니다.
Mego

@Mego Ah, 말이 되네요. 입력의 길이는 최대 50 자일 수 있습니다. 그 소리는 어때?
DJMcMayhem

답변:


9

Pyth- 19 17 15 13 바이트

2 바이트를 절약 해 준 @FryAmTheEggman에게 감사합니다.

대답이없는 특별한 경우가 있습니다. 해결했습니다!

e_I#jL\|cL2.:

테스트 스위트 .

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
안돼! pyth 답변에 닌자; _;
Downgoat

설명해주세요 : 3
Downgoat

@Downgoat 그는 모든 부분 문자열을 가져 와서 두 개로 자르고, 각 쌍을 |으로 결합하고, 대칭으로 필터링하고, [k]에 추가하고 마지막 요소 (가장 긴)를
얻습니다

@Downgoat이 완료되었습니다.
Maltysen

2
:Q)= Bignose
gcampbell

8

05AB1E , 19 17 14 바이트

암호:

Œévy2ä'|ý©ÂQi®

설명:

Œ                # 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

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .


5

파이썬 2, 102 97 바이트

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)

오히려 느리고 비효율적입니다 ... Ideone 에서 작은 테스트 사례를 확인하십시오 .


4

자바 스크립트, 100 99 바이트

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:""')

또는

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')

궁금한 점은 무엇 eval입니까?
gcampbell

@gcampbell eval피하기return
edc65

쉼표 연산자를 사용하여 반환을 피할 수 없습니까?
MayorMonty

트윗 담아 가기 for은 표현식이 아니므로 일반적으로 중괄호와return
jrich가


2

레티 나 , 66 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

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

온라인으로 사용해보십시오! 첫 번째 줄은 한 번에 여러 줄 바꿈으로 구분 된 테스트 사례를 테스트 할 수 있습니다.

흠, 내가 원하는 것보다 훨씬 길어


2

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

덜 골프

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

테스트

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

펄 5 105 100 98 + 1 = 106 (101) 99 바이트

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

방금 재귀 정규 표현식을 사용하고 싶었습니다. -p옵션이 필요합니다 . 편집 : @ msh210 덕분에 7 바이트가 저장되었습니다 (4로 건너 뛰었습니다). (누락 된 바이트는 @ msh210의 최신 저장으로 대체 된 저장으로 인한 것입니다.)


나는이 중 하나를 시험하지 않았다, 그러나 아마이 등 다양한 방법으로 축약 할 수있다 : (1) @_=(@_,$1)이 될 수 있습니다push@_,$1 . (2) 줄 바꿈과 마지막을 생략하십시오 ;. 난 당신이 (당시 아무것도 적어도 --- 아마도 --- 대체 할 경우 사용할 수있는 짧은 정렬 상태가 용의자 (3) -에 대한 <=>)
msh210

@ msh210 처음 두 가지 점에 대해 감사하지만 이미 시도했지만 -작동하지 않았습니다 (아마도 우선 순위에 대한 parens가 필요하므로 저축을 무너 뜨릴 수 있습니다 ).
Neil

대신 y...c>>1또는 y...c/2대신 사용해보십시오 length>>1. (테스트되지
않음

@ msh210 나는 분명히 Perl에서 골프를위한 팁을 먼저 읽었어야했다.
Neil

당신의 마지막 한 쌍의 외투도 갈 수있을 것 같아요.
msh210

2

파이썬 2, 91 바이트

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)

바꾸다 \x7f ASCII 127 (데니스에 신용)는 실제 문자 DEL로.

이것은 가장 긴 회문 간격을 찾기 위해 반복적으로 분기하고 사용 하는 Dennis의 대답 과 유사한 전략을 따릅니다 max. 그러나 대신 왼쪽 절반을 찾아 해당 미러 오른쪽 절반이 자체 제작 시작으로 .

이 함수는 첫 번째 문자가 미러 된 왼쪽 절반에 있는지 추측합니다. 그렇지 않다면 그냥 떨어 뜨리고 나머지 부분에서 반복됩니다. p맞으면 반전 된 문자 스택 에 추가됩니다 . 문자열이 스택으로 시작하면 미러 문자열이 생성되어 가능한 가장 긴 미러로 간주됩니다. |출력으로 피하기 위해 비어 있지 않은 스택 만 고려됩니다.


2

젤리 , 17 바이트

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

온라인으로 사용해보십시오!

Xcoder 씨의 도움으로 완료DJMcMayhem의 채팅했습니다.

작동 원리

ẆŒḂÐ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

하스켈, 126 111 바이트

(!)=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 바이트

길이를 최대 99 바이트로 하드 코딩했습니다.이 바이트를 저장했지만 느리게 만들었습니다. 그래도 여전히 괜찮은 성능을 발휘합니다.

골프 :

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

언 골프 드 :

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

깡깡이


1
마지막 예는 99 자이므로 99로 제한하면 2 바이트를 줄일 수 있습니다.
Alex Carlsen

1
99 개 문자도 thai_bin에 Thai_CS_AS에서 데이터 정렬을 변경 허용에 감사합니다 @VisualBean 스크립트를 변경
t-clausen.dk

0

파이썬 2, 149 바이트

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]

온라인으로 사용해보십시오

이 프로그램은 짝수 길이의 가장 큰 회문 하위 문자열의 전반부를 찾아 해당 문자열을 인쇄하고 |그 뒤에 문자열을 반전시킵니다. 적합한 문자열이 없으면 t빈 문자열이되고 빈 문자열로 '|'*(L(t)>0)평가됩니다.


0

Java 8, 294 283 232 바이트

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):"";}

설명:

여기에서 시도하십시오.

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