Substituição de seqüência extravagante


16

let S, ae bcada um representa uma string

Objetivo: Escreve uma string padrão de função de substituir onde o que você substituir todas as ocorrências aem uma string Scom bcontanto que ajá não faz parte de uma instância deb

por exemplo, se tivermos a string S=My oh my that there is a big ol' that

e queríamos fazer uma substituição sofisticada por a = that e b = that thereque iria substituir cada instância de thatcom that thereo tempo que a instância do thatnão é já um exemplo dethat there

Portanto, nesse caso, a saída seria: My oh my that there is a big ol' that there

O primeiro thatnão é substituído porque já faz parte de uma instância dethat there

Notas

  • Todas as 3 entradas devem ser cadeias contendo apenas caracteres ascii imprimíveis

  • A entrada pode ser fornecida como três cadeias de caracteres separadas ou uma lista de três cadeias de caracteres

  • Entrada será na ordem S, a,b salvo disposição em contrário, a resposta

  • Para aser considerada parte de b, toda a instância de adeve fazer parte de uma instânciab

Alguns casos de canto explicados

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

No exemplo acima, o último 22é substituído. Mesmo que parte dela faça parte de uma instância de b, a totalidade NÃO é parte da instância de b. Como a instância inteira de anão faz parte de uma instância, bela é substituída.

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

Este caso de teste ilustra o mesmo caso acima, mas talvez de uma maneira um pouco mais clara. Novamente 2, o meio é parte de uma instância de a, bem como parte de uma instância de b, no entanto, como anem tudo é parte da instância, bele ainda é substituído.

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

No caso de teste acima, a cadeia vazia antes e depois da pnão é substituída, pois pode ser totalmente considerada parte da instância de p.

Outros casos de teste

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"

Esta é uma pergunta para o código-golfe, de modo que a resposta mais curta em bytes vence.


Respostas:


6

Perl 6 , 76 bytes

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

Experimente online!

Bloco de código anônimo que recebe entrada com curry, como f(a,b)(s).

Tenho certeza de que isso corresponde à intenção da pergunta. Basicamente, ele faz a substituição apenas se a posição de anão estiver em nenhuma das correspondências sobrepostas de b.


2
no entanto, em testes há 2p: em pEpmpptpypvez depEpmptpyp
Nahuel Fouilleul 21/08/19

@Nahuel Fixed. Isso também deve lidar com os outros casos de teste (e eu acho que é o primeiro a fazê-lo)
Jo rei

@JoKing Infelizmente depois de repensar alguns dos casos de teste apontou, eu acho que o último caso de teste irá falhar [ 1222, 22, 122] -> 12122. Atualizei a pergunta para esclarecer e pedir desculpas por não ter esclarecido esse caso de canto anteriormente.
Quinn

Eu tive um problema semelhante com s/(?!$b)$a/$b/g, quando $ a é vazio porque string vazia depois pestava combinando (?!p)eu precisava(?<!p)(?!p)
Nahuel FOUILLEUL

1
@Quinn Fixed Eu acho?
Jo rei

5

Carvão , 55 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

≔⁰ε

Inicialize uma variável para mostrar onde a última correspondência substituída terminou.

F⌕Aθη

Encontre todas as correspondências sobrepostas de ain S.

F‹‹ιε

Se a próxima partida não se sobrepuser à última substituição bem-sucedida ...

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

... e também se sobrepõe nenhuma cópia bem S...

≔⁺⁺ω✂θει¹ζω

... concatenar a substring intermediária entre a última correspondência e essa correspondência com ba cadeia de saída ...

≔⁺ιLηε

... e atualize a última variável de final de correspondência para o final desta nova correspondência.

»⁺ω✂θε

No final, adicione qualquer restante Se produza o resultado.


1
@tsh OK esta é uma reescrita completa, espero que este agora cobre todos os casos possíveis ...
Neil

1
@ Neil Eu acredito que isso também é válido!
Quinn

@ Neil Eu acredito que isso é válido agora.
tsh

@ Quinn Ooh, isso me faz primeiro a validar sua resposta? Arrumado!
Neil

@Neil Acredito brincando também tem uma resposta válida
Quinn

3

Wolfram Language (Mathematica) , 43 122 96 88 bytes

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

Experimente online!

+79: deve ser corrigido.

Ligar como 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
Falha em 121212, 1, 121 - deve gerar 121212
Falco

@attinat Parece consertado para mim!
Quinn

1

Perl 5 ( -lpF/;/), 41 bytes

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

TIO


[ 1222, 22, 122] Deve saída 12122, mas o seu saídas11222
Quinn

ok não entendeu que, talvez fixo, e mais curto
Nahuel FOUILLEUL

Ah, não, na verdade, o último caso de teste tem um excesso de 12s, acontece que a pergunta que fiz foi muito mais difícil do que eu pensava originalmente!
Quinn

@Quinn, parece-me que não é consistente: 123, 23, 12-> 112mas 1212, 1, 121-> 1212(? Por que não deveria ser 121212)
Nahuel FOUILLEUL

parece ser o que deve ser esclarecido é que as posições em Snão deve combinar com b, ou que parte para pular antes de olhar para o próximo jogo
Nahuel FOUILLEUL
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.