컨텍스트와 문자열 연결


13

컨텍스트가있는 문자열

이 문제를 해결하기 위해 컨텍스트 가있는 문자열은 왼쪽 컨텍스트 , 데이터 부분오른쪽 컨텍스트 라고하는 3 중 문자열 입니다. 더 긴 문자열의 하위 문자열을 나타냅니다. 수직 파이프 |를 구분 기호로 사용하므로 컨텍스트가있는 문자열의 예 cod|e-go|lf는 왼쪽 컨텍스트는 cod, 데이터는 e-go, 오른쪽 컨텍스트는 lf입니다. 이 예는의 하위 문자열 e-go을 나타냅니다 code-golf.

이제 두 문자열을 컨텍스트와 연결하기 위해 aa|bcc|deecc|de|eee예제를 사용하여 다음과 같이 진행합니다 . 다이어그램에서와 같이 문자열을 정렬합니다

a a|b c c|d e e
      c c|d e|e e e

데이터 부분이 인접 해 있습니다. 연결의 데이터 부분은이 경우 데이터 부분의 연결입니다 bccde. 왼쪽 컨텍스트는 추가 사항을 첫 번째 데이터 파트의 왼쪽으로 확장하는 파트입니다 (이 경우) aa. 마찬가지로 올바른 컨텍스트는 eee이므로 연결은 컨텍스트가있는 문자열입니다 aa|bccde|eee. 두 번째 예를 들어, 고려 a|bb|cdaabb|cd|두 번째 단어는 비어있는 권리 컨텍스트를 가지고 곳. 정렬 다이어그램은

  a|b b|c d
a a b b|c d|

여기서 두 번째 단어의 왼쪽 컨텍스트는 첫 번째 단어의 왼쪽 컨텍스트보다 더 확장됩니다. 연결은 aa|bbcd|입니다.

그러나 정렬 다이어그램의 문자가 일치하지 않으면 연결이 존재하지 않습니다. 일례의 도면으로서 aa|bb|ccc|c|cIS

a a|b b|c c
      c|c|c

를 Where bc네 번째 열에는 동의, 그래서 그들은 연결될 수 없습니다.

작업

귀하의 임무는 |위와 같이 부분이 분리 된 컨텍스트를 가진 두 개의 문자열을 가져 와서 연결이 있으면 연결하고 그렇지 않은 경우 다른 것을 출력 하는 프로그램을 작성하는 것입니다. 컨텍스트가있는 유효한 문자열이 아닌 한 "무언가"는 출력이없는 것을 포함한 모든 값이 될 수 있으며 모든 경우에 동일합니다. 그러나 오류를 던지는 것은 용납되지 않습니다. STDIN-to-STDOUT 프로그램 또는 기능을 제공 할 수 있으며 익명 기능도 허용됩니다. 가장 작은 바이트 수가 이기고 표준 허점은 허용되지 않습니다.

테스트 사례

aa|bcc|dee cc|de|eee -> aa|bccde|eee
a|bb|cd    aabb|cd|  -> aa|bbcd|
a|b|cccd   aab|cc|c  -> aa|bcc|cd
a|b|c      b||cd     -> a|b|cd
aa|bb|cc   c|c|c     -> None
aaa|b|c    abb|cd|d  -> None
|bb|cd     abb|c|ed  -> None
a|b|c      a||cd     -> None

답변:


4

하스켈 184 182 201 199 155

s&t|(a,'|':b)<-f t,(x,'|':y)<-f$r s,x#b,a#y=r(y!r a)++b!r x|0<1=""
r=reverse
a!b=a++drop(length a-1)b
(#)a=and.zipWith(==)(r a).filter h
f=span h
h=(/='|')

예제 실행 :

"|a|"&"|b|" -- returns "|ab|"
"|a|x"&"|b|" -- returns ""

일치하는 것이 없으면 빈 문자열이 반환됩니다. 그렇지 않으면 결과가 반환됩니다.

부분 설명 :

# 두 개의 문자열을 가져오고 일치하는지 여부를 반환하는 함수입니다.

! 두 개의 문자열을 가져오고 두 번째에서 추가 문자로 연결된 첫 번째 문자열을 반환합니다 (있는 경우).

주 기능 &사용은 span (/='|')두 부분으로 입력 분할 a|b|ca, b|c컨텍스트가 일치하면, 확인 후 사용 !출력 조립 회.

편집 : 마법사 후기 regolfing은 매우 효과적 인 것 같습니다.


흠, 오류를 던지는 것이 특히 함수의 경우 허용되는 출력 방법이 아니라고 두려워합니다. |1<2=""정의에 추가하면 &해결됩니다. 사양에 더 명시 적으로 지정하지 않아서 죄송합니다. 편집하겠습니다.
Zgarb

@Zgarb 실제로, 이것은 고치지 않을 것입니다. '|'문자열이 맞지 않을 때 부호 가 너무 많은 문자열을 반환 합니까?
자부심을 가진 haskeller

일치하지 않는 모든 입력에 대해 동일한 문자열 인 한 확실합니다.
Zgarb

3

파이썬 (242 바이트)

import itertools as i
s='|'
j=''.join
r=reversed
m=lambda a,b:j(j(*set(p+q))for p,q in i.izip_longest(a,b,fillvalue=''))
def c(A,B):
 u,v,w,x,y,z=(A+s+B).split(s)
 try:return j(r(m(r(u+v),r(x))))[:-len(v)]+s+v+y+s+m(w,y+z)[len(y):]
 except:0

설명

lambda 함수 m는 공통 접두사를 공유하는 한 두 문자열 중 더 긴 문자열을 반환합니다. 그것은 빈 문자열을 연결하여이 작업을 수행 ''한 후 결과 회전, 누락 된 값 대신에 (형태를 취할 수있다 aa, ab, a, 또는 b일치 / 불일치 / 동일하지 않은 길이의 경우) 각 위치에서 고유의 문자 집합으로. join단일 인수를 기대하므로 둘 이상의 요소가 포함 된 세트의 압축을 풀면 a가 발생합니다 TypeError.

그런 다음 주요 기능

  • 용도 m컴바인하기 좌측 컨텍스트 및 데이터 부 와 제 단어 좌측 컨텍스트 (왼쪽 위에 반전 문자열 오른쪽)을 제의
  • 데이터 부분을 연결하고
  • 다시 사용 m컴바인하기 첫번째 단어의 오른쪽 컨텍스트데이터 부분과 오른쪽 컨텍스트 제의

두 개의 원래 단어의 데이터 부분은 새 컨텍스트의 오른쪽과 왼쪽에서 잘립니다.

우리는 잘못된 정렬로 인해 ma가 발생한다는 것을 알고 있으므로 TypeError이러한 경우 예외를 포착하고 암시 적으로 반환 None합니다.

테스팅

TESTCASES = [
    ('aa|bcc|dee', 'cc|de|eee', 'aa|bccde|eee'),
    ('a|bb|cd', 'aabb|cd|', 'aa|bbcd|'),
    ('a|b|cccd', 'aab|cc|c', 'aa|bcc|cd'),
    ('a|b|c', 'b||cd', 'a|b|cd'),
    ('aa|bb|cc', 'c|c|c', None),
    ('aaa|b|c', 'abb|cd|d', None),
    ('|bb|cd', 'abb|c|ed', None),
    ('a|b|c', 'a||cd', None),
]

for A, B, R in TESTCASES:
    print '{:<10} {:<9} -> {}'.format(A, B, c(A, B))

산출

aa|bcc|dee cc|de|eee -> aa|bccde|eee
a|bb|cd    aabb|cd|  -> aa|bbcd|  
a|b|cccd   aab|cc|c  -> aa|bcc|cd 
a|b|c      b||cd     -> a|b|cd    
aa|bb|cc   c|c|c     -> None      
aaa|b|c    abb|cd|d  -> None      
|bb|cd     abb|c|ed  -> None      
a|b|c      a||cd     -> None  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.