멋진 문자열 교체


16

하자 S, ab각각의 문자열을 나타냅니다

목표 : 당신이 모든 항목을 대체 할 경우 표준 문자열 기능을 대체 쓰기 a문자열 Sb너무 오래 같은 것은 a이미 인스턴스의 일부가 아닙니다b

예를 들어 문자열 S=My oh my that there is a big ol' that

그리고 우리는 멋진로 교체하고 싶어 a = that하고 b = that there우리의 모든 인스턴스 대체 할 that과를 that there의 인스턴스로 한that 이미의 인스턴스가 아닌that there

따라서이 경우 출력은 다음과 같습니다. My oh my that there is a big ol' that there

첫번째 that 는 이미 인스턴스의 일부이므로 대체되지 않습니다that there

노트

  • 3 개의 입력은 모두 인쇄 가능한 ASCII 문자 만 포함하는 문자열이어야합니다

  • 입력은 3 개의 개별 문자열 또는 3 개의 문자열 목록으로 제공 될 수 있습니다.

  • 입력 순서 Sa,,b 그렇지 않으면이 질문에 대해 명시하지 않는 한

  • a의 일부로 간주 되려면의 b모든 인스턴스가 인스턴스의 a일부 여야합니다.b

일부 코너 사례 설명

Input:  ["1222", "22", "122"]
Output: "12122"

위의 예에서 후자 22가 바뀝니다. 그것의 일부는의 인스턴스의 일부이지만, 그것 b의 전부는의 인스턴스의 일부가 아닙니다 b. 의 전체 인스턴스는 인스턴스의 a일부가 아니므 b로 대체됩니다.

Input:  ["123 ", "23", "12"]
Output: "112 "

이 테스트 사례는 위와 동일하지만 약간 더 명확한 방법을 보여줍니다. 다시 2중간에는 인스턴스의 일부와 인스턴스의 a일부 b이지만 인스턴스의 a일부가 아니기 b때문에 여전히 인스턴스의 일부가 아닙니다 .

Input: ["Empty", "", "p"]
Output: "pEpmptpyp"

위의 테스트 사례에서 앞뒤 빈 문자열은 모두 p의 인스턴스의 일부로 간주 될 수 있으므로 대체되지 않습니다 p.

다른 테스트 사례

Input:  ["aabbaa", "aa", "aabb"]
Output: "aabbaabb"

Input:  ["Hello World!", "o", " no"]
Output: "Hell no W norld!"

Input: ["Wow, oh wow, seriously WOW that's... wow", "wow", "WOW,"]
Output: "Wow, oh WOW,, seriously WOW that's... WOW,"

Input: ["Empty", "", "b"]
Output: "bEbmbpbtbyb"

Input: ["Empty", "b", "br"]
Output: "Empty"

Input: ["Empty", "pty", "Empty"]
Output: "Empty"

Input:  ["aabbaaa", "aa", "PP"]
Output: "PPbbPPa"

Input:  ["121212","1","121"]
Output: "121212"

이것은 코드 골프에 대한 질문이므로 바이트 단위의 최단 답변이 이깁니다.


답변:


6

펄 6 , 76 바이트

{$^b;$^a;&{S:g/$a<?{$!=$/;all m:ex/$b/>>.&{$!.to>.to||.from>$!.from}}>/$b/}}

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

과 같이 입력 된 익명 입력 코드 블록 f(a,b)(s).

나는 이것이 질문의 의도와 일치한다고 확신합니다. 기본적으로의 위치 a가의 겹치는 일치 내에 있지 않은 경우에만 대체를 수행합니다 b.


2
그러나 테스트에는 2p가 있습니다. pEpmpptpyp대신pEpmptpyp
Nahuel Fouilleul

@Nahuel 고정. 이것은 또한 다른 테스트 사례를 처리해야합니다 (그리고 그렇게 먼저 생각합니다)
Jo King

지적 테스트 케이스의 일부를 재검토 한 후 불행하게도 @JoKing, 내가 마지막으로 테스트 케이스가 실패 할 것이라고 생각 [ 1222, 22, 122] -> 12122. 이 코너 사례를 더 명확하게 밝히지 않았다는 점을 명확히하고 사과하기 위해 질문을 업데이트했습니다.
Quinn

내가 가진 유사한 문제가 있었다 s/(?!$b)$a/$b/g빈 문자열 뒤에 있기 때문에 $ a가 비어 p일치 된 (?!p)내가 필요(?<!p)(?!p)
나우 Fouilleul

1
@Quinn 고정 된 것 같아요?
Jo King

5

, 55 바이트

≔⁰εF⌕AθηF‹‹ιε⬤⌕Aθζ∨‹ικ›⁺ιLη⁺κLζ«≔⁺⁺ω✂θει¹ζω≔⁺ιLηε»⁺ω✂θε

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔⁰ε

마지막으로 교체 한 일치가 종료 된 위치를 표시하도록 변수를 초기화하십시오.

F⌕Aθη

a에서 겹치는 모든 일치 항목을 찾습니다 S.

F‹‹ιε

다음 경기가 마지막으로 성공한 교체와 겹치지 않으면 ...

⬤⌕Aθζ∨‹ικ›⁺ιLη⁺κLζ«

... 그리고 그것은 또한의 카피 중복없는 b의를 S...

≔⁺⁺ω✂θει¹ζω

... 그리고 마지막 일치 와이 일치 사이의 중간 부분 문자열을 b출력 문자열 과 연결 합니다 ...

≔⁺ιLηε

... 그리고 마지막 일치 종료 변수를이 새로운 일치의 끝으로 업데이트하십시오.

»⁺ω✂θε

마지막에 나머지를 추가하십시오 S 결과를 출력하십시오.


1
@tsh OK 이것은 완전한 재 작성입니다. 이것이 가능한 모든 사례를 다루기를 바랍니다 ...
Neil

1
@Neil 나는 이것 또한 유효하다고 믿는다!
Quinn

@Neil 나는 이것이 유효하다고 생각합니다.
tsh

@Quinn Ooh, 저의 답변이 먼저 유효합니까? 산뜻한!
Neil

@Neil JoKing도 유효한 답변을 가지고 있다고 생각합니다
Quinn

3

볼프람 언어 (티카) , 43 (122) 96 88 바이트

##2~StringReplacePart~Cases[#2~P~#,{a_,b_}/;And@@(#2<b||#>a&@@@P@##2)]&
P=StringPosition

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

+79 : 고정해야합니다.

로 전화하십시오 f[a,S,b].

                                                                      & (* a function which finds *)
                            #2~P~#,                                     (* the positions {start,end} where a occurs in S *)
                      Cases[       {a_,b_}/;And@@(#2<b||#>a&@@@     )]  (* which are not a subrange of any of the *)
                                                               P@##2    (* positions of b in S, *)
##2~StringReplacePart~                                                  (* and replaces those parts of the string with b *)
P=StringPosition

2
121212, 1, 121 실패-121212 출력
Falco

@attinat 나에게 고정 된 것 같습니다!
Quinn

1

펄 5 ( -lpF/;/), 41 바이트

($_,$a,$b)=@F;s/(?<!(?=$b).)(?!$b)$a/$b/g

TIO


[ 1222, 22, 122]가 출력해야 12122하지만, 네 출력11222


오, 실제로 마지막 테스트 케이스에 너무 많은 12것이 있습니다. 내가 만든 질문이 원래 생각했던 것보다 훨씬 어렵다는 것이 밝혀졌습니다!
Quinn

@Quinn, 그것은 일관성이없는 것 같습니다. 123 , 23, 12> - 112하지만 1212, 1, 121-> 1212(? 그것은 안하는 이유 121212)
나우 Fouilleul

분명 S해야 할 것은 b다음 경기를 찾기 전에 어떤 포지션이 일치하지 않아야하는지 또는 어느 부분을 건너 뛸
것인지입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.