Inspirado por essa pergunta despretensiosa do StackOverflow .
A ideia é simples; dado uma String e uma matriz de Strings, remova quaisquer instâncias de palavras na matriz (ignorando maiúsculas e minúsculas) da String de entrada diferente da primeira, juntamente com qualquer espaço em branco adicional que isso possa deixar. As palavras devem corresponder a palavras inteiras na String de entrada, e não partes das palavras.
por exemplo, "A cat called matt sat on a mat and wore a hat A cat called matt sat on a mat and wore a hat", ["cat", "mat"]
deve produzir"A cat called matt sat on a mat and wore a hat A called matt sat on a and wore a hat"
Entrada
- A entrada pode ser tomada como uma String e uma matriz de Strings ou uma matriz de Strings em que a String de entrada é o primeiro elemento. Esses parâmetros podem estar em qualquer ordem.
- A entrada String não pode ser considerada uma lista de Strings delimitadas por espaço.
- A String de entrada não terá espaços à esquerda, à direita ou consecutivos.
- Toda entrada conterá apenas caracteres [A-Za-z0-9], com exceção da String de entrada, incluindo também espaços.
- A matriz de entrada pode estar vazia ou conter palavras que não estão na String de entrada.
Resultado
- A saída pode ser o valor de retorno de uma função ou impressa em STDOUT
- A saída deve estar no mesmo caso que a String original
Casos de teste
the blue frog lived in a blue house, [blue] -> the blue frog lived in a house
he liked to read but was filled with dread wherever he would tread while he read, [read] -> he liked to read but was filled with dread wherever he would tread while he
this sentence has no matches, [ten, cheese] -> this sentence has no matches
this one will also stay intact, [] -> this one will also stay intact
All the faith he had had had had no effect on the outcome of his life, [had] -> All the faith he had no effect on the outcome of his life
5 times 5 is 25, [5, 6] -> 5 times is 25
Case for different case, [case] -> Case for different
the letters in the array are in a different case, [In] -> the letters in the array are a different case
This is a test Will this be correct Both will be removed, [this,will] -> This is a test Will be correct Both be removed
Como este é um código de golfe, a contagem de bytes mais baixa ganha!
This is a test Will this be correct Both will be removed
+this will
. As duas segundas palavras foram removidas corretamente, mas também removeram abe
após a segundawill
por algum motivo.@B=<>;$_=join$",grep!(/^$_$/xi~~@B&&$v{+lc}++),@F
lc
ser chamado sem parênteses. Impressionante! E usar um regex contra a matriz é muito melhor, obrigado! Eu luto para lembrar todas as suas dicas!Pitão, 27 bytes
Experimente online
Explicação
Tenho certeza de que os 10 bytes para verificação sem distinção entre maiúsculas e minúsculas podem ser reduzidos, mas não vejo como.
fonte
Stax , 21 bytes CP437
25 bytes quando descompactado,
O resultado é uma matriz. A saída conveniente para Stax é um elemento por linha.
Execute e depure online!
Explicação
fonte
Perl 6 , 49 bytes
Teste-o
Expandido:
fonte
Perl 5 ,
50bytesInclui
+1
para-p
Dê a sequência de destino seguida por cada palavra de filtro em linhas separadas em STDIN:
A
chop
só é necessária para corrigir o espaço à direita no caso da última palavra é removidoApenas o código:
Experimente online!
fonte
JavaScript (ES6), 98 bytes
fonte
K4 , 41 bytes
Solução:
Exemplos:
Explicação:
Divida em espaço em branco, minúsculas as duas entradas, procure correspondências, remova tudo, exceto a primeira ocorrência, junte a sequência novamente.
fonte
JavaScript (Node.js) , 75 bytes
Experimente online!
fonte
f=
na sua contagem de bytes. Você também pode salvar um byte, alterando os parâmetros, substituindo(s,a)=>
pors=>a=>
e chamando a função porf(s)(a)
.JavaScript ES6, 78 bytes
Como funciona:
fonte
f
para uma chamada recursiva, uma função sem nome também seria um envio válido; portanto, você pode salvar dois bytes soltando of=
.PowerShell v3 ou posterior, 104 bytes
Com o custo de um byte, ele pode ser executado no PS 2.0 substituindo
$Matches.0
por$Matches[0]
.Versão longa:
Uso
Salve como Whatever.ps1 e chame com a sequência e as palavras como argumentos. Se mais de uma palavra precisar ser passada, as palavras deverão ser agrupadas em @ ():
Alternativa sem arquivo (pode ser colada diretamente em um console PS):
salve o script como ScriptBlock (dentro de chaves) em uma variável e chame seu método Invoke () ou use-o com Invoke-Command:
fonte
Javascript, 150 bytes
fonte
Limpo ,
153142138134 bytesExperimente online!
Define a função
$ :: String [String] -> String
, literalmente fazendo o que o desafio descreve. Ele localiza e remove todas as ocorrências após a primeira, para cada palavra de destino.fonte
Retina,
4637 bytes-14 bytes graças a @Neil e +5 bytes por uma correção de bug.
Entrada no formato
word1,word2,word3,sentence
, porque não tenho certeza de como ter entrada em várias linhas (onde as entradas são usadas de maneira diferente) ..Explicação:
Experimente online.
fonte
+i`((.+),.*\2.* )\2( |$)
e a segunda,$1
mas noto que seu código falha deoften,he intended to keep ten geese
qualquer maneira.\b
em vez de(^|,)
, mas a má notícia é que eu acho que você precisa\b\3\b
(não criaram um caso de teste adequado ainda embora).Vermelho , 98 bytes
Experimente online!
fonte
Casca , 13 bytes
Leva uma lista de seqüências de caracteres e uma única sequência como argumentos, nesta ordem. Supõe que a lista esteja livre de duplicatas. Experimente online!
Explicação
fonte
Mínimo , 125 bytes
A entrada está
quot
na pilha, com a String de entrada como primeiro elemento e umaquot
das seqüências duplicadas como segundo elemento, ou seja,fonte
Python 3 , 168 bytes
Experimente online!
fonte
AWK , 120 bytes
Experimente online!
A parte "remover espaço em branco" tornou isso um pouco mais desafiador do que eu pensava. Definir um campo para
""
remove um campo, mas deixa um separador extra.O link TIO possui 28 bytes extras para permitir várias entradas.
A entrada é fornecida em 2 linhas. A primeira linha é a lista de palavras e a segunda é a "sentença". Observe que "palavra" e "palavra" não são consideradas idênticas à pontuação anexada. Ter requisitos de pontuação provavelmente tornaria esse um problema ainda mais divertido .
fonte
Ruby ,
63 61 6059 bytesExperimente online!
Uma versão mais curta que diferencia maiúsculas de minúsculas e falha ~ a cada 10 15 vezes devido à aleatoriedade (37 bytes)
fonte
Python 2 , 140 bytes
Experimente online!
Explicação:
re.sub(..)
pode tomar como argumento uma função em vez de uma string de substituição. Então aqui temos alguns lambda chiques. A função é chamada para cada ocorrência de padrão e um objeto é passado para essa função - matchobject. Este objeto possui informações sobre ocorrência fundada. Estou interessado no índice dessa ocorrência, que pode ser recuperado porstart()
ouend()
função. O último é mais curto, portanto é usado.Para excluir a substituição da primeira ocorrência de palavra, usei outra função de pesquisa de expressão regular para obter exatamente um primeiro e, em seguida, comparar índices, usando o mesmo
end()
O sinalizador
re.I
é uma versão curta dore.IGNORECASES
fonte