Objetivo
Crie uma função para reverter a concatenação de cadeias
Entrada
Duas cadeias (alfanuméricas + espaços), onde uma deve ser subtraída pela outra.
- Você pode supor que a sequência a ser subtraída nunca será maior que a outra.
Saída
O resultado da subtração
Subtração
Você deve remover uma string do início ou do fim de outra string. Se a sequência estiver presente no início e no final, você poderá remover apenas uma, e a que será removida depende de você.
Se a sequência não está no início ou no final, ou não é uma correspondência exata, é uma subtração inválida e você deve gerar a sequência original.
Casos de teste
Subtração válida
'abcde','ab' -> 'cde'
'abcde','cde' -> 'ab'
'abab','ab' -> 'ab'
'abcab','ab' -> 'abc' or 'cab'
'ababcde','ab' -> 'abcde'
'acdbcd','cd' -> 'acdb'
'abcde','abcde' -> ''
'abcde','' -> 'abcde'
'','' -> ''
Subtração inválida (retorna a string original)
'abcde','ae' -> 'abcde'
'abcde','aa' -> 'abcde'
'abcde','bcd' -> 'abcde'
'abcde','xab' -> 'abcde'
'abcde','yde' -> 'abcde'
Entrada inválida (não precisa ser manipulada)
'','a' -> ''
Isso é código-golfe , então o código mais curto em bytes vence!
cde
? O que você quer dizer com válido? Precisamos julgar a validade da entrada ou você quer dizer que não receberemos entradas inválidas?'abcde','bcd' -> 'abcde'
para quebrar a minha solução'ababcde', 'ab'
→'abcde'
como um caso de teste. Alguns algoritmos ingênuos falham nesse.Respostas:
Java 8,
46454440 bytes-1 byte graças a TheLethalCoder
-1 byte porque sou burro (obrigado Rod!)
-4 bytes graças a Kevin Cruijssen
Experimente online! (inclui todos os casos de teste)
Uma resposta Java supera algumas outras linguagens práticas. Sorrisos. (e agora bate JS!)
fonte
a->b->
First
paraAll
para -2 bytes. Por causa do^
e$
sempre está no final ou no início da String, mesmo quereplaceAll
ele o substitua apenas uma vez. Experimente aqui. PS: Adicionei as contagens de bytes anteriores riscadas à sua resposta, que é o que geralmente é feito após as edições do code-golf aqui no PPCG.All
vez deFirst
, isso se tornará verdadeiro:"abab" + "ab" -> ""
JavaScript (ES6), 41 bytes
Recebe entrada através de sintaxe de currying, ie
f("abab")("ab")
.fonte
eval()
RegExes antes ?!Brachylog (Experimente Online!), 12 bytes
Experimente online!
Leva a string para subtrair da entrada padrão e a string para subtrair como argumento da linha de comando.
Explicação
fonte
Retina , 21 bytes
1 byte graças a Martin Ender.
Experimente online!
fonte
JavaScript (ES6),
76704541 bytesTente
fonte
new
.Perl 6 , 21 bytes
Tente
Expandido:
fonte
Japonês ,
119 bytesExperimente online!
fonte
TI-Basic (TI-84 Plus CE), 63 bytes
fonte
Ans
refere na quarta linha?Ans
refere-se ao último valor avaliado, portanto, neste caso, refere-se ao valor retornado porinString(
, que é o índice da substringStr2
na stringStr0
ou 0 se a substring não aparecer. Uma instrução if não modifica o valor de Ans; portanto, na quarta linha, o índice ainda estáAns
.inString
funcionava. Bom golfe!Mathematica, 162 bytes
estilo de entrada de teste ["abcde", "ab"]
fonte
#
vez de#1
- eles significam exatamente o mesmo. Além disso, em vez de usarStringJoin@t
, você pode trapacear juntando uma string vazia a ela""<>t
, que também une tudo automaticamentet
. Você já viu a página de dicas de golfe do Mathematica ?t={};
no início, por exemplo), mas pode ser mais fácil usar uma abordagem totalmente diferente - você já tentou usar oStringReplace
função?c=Characters;a=c@#;b=c@#2;
l@Intersection[a,b]
él[a∩b]
.Python,
696864575145 bytesIsso acabou sendo uma solução completamente diferente com o Regex.
Obrigado ao Value Ink por -2 bytes!
e Felipe Nardi Batista pelos enormes 6 bytes!
Experimente online!
fonte
re.sub(c.join("^|$"),'',s,1)
c+'$|^'+c
Bash ,
66.6149 bytesExperimente online!
menos golfe:
Usa maiúsculas e minúsculas para testar o início ou o fim e a subtração de prefixo / sufixo (% / #) da matriz
fonte
case
, mas mais do que o necessário. A 2ª e 3ª padrão poderiam ser fundidos em um único:*)c=${1#$2};;
. Em seguida, com apenas 2 ramos seria mais curto paraecho
cada diretamente em vez de usar variável$c
:case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac
. Ou você pode continuar usando-lo, mas semcase
:c=${1%$2};[[ $c = $1 ]]&&c=${1#$2};echo $c
.APL (Dyalog) ,
3130 bytes-1 graças a Zacharý .
Na verdade, isso usa concatenação reversa (isto é, inversa de)! Leva a string original como argumento à esquerda e o que subtrair como argumento à direita.
Experimente online!
Ungolfed:
Lenda:
{
...}
função anônima⍺
argumento esquerdo da função atual⍵
argumento correto da função atual0::
… Se ocorrer algum erro, execute isto, senão…⍣¯1⊢
inverso,∘⍵
concatenar ⍵ à direita⍵,
concatenar ⍵ à esquerdafonte
{0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}
.PHP, 54 bytes
Casos de teste
fonte
Python 2 , 68 bytes
Experimente online!
fonte
Haskell , 49 bytes
Experimente online! Uso:
f"" "abcdef" "ab"
. Como alternativa, defina(-)=f""
e use like"abcdef" - "ab"
.Essa solução sem regex funciona dividindo recursivamente a string em todas as suas correcções anteriores e posteriores e verificando se a string a ser subtraída corresponde a uma delas.
fonte
Python 2 ,
7265 bytesExperimente online!
-7 bytes graças a @FelipeNardiBatista
fonte
C #, 88 bytes
Compila para um
Func<string, Func<string, string>>
.fonte
Ruby (expressão lambda), 29 bytes
Yay para interpolação regex! Requer subtraendas seguras para regex, mas tudo bem conforme o desafio.
fonte
Tcl , 37 bytes
Experimente online!(agora executando todos os testes)
Tcl é simples.
proc s {a b}
define uma função nomeadas
que aceita parâmetrosa
eb
.regsub
substitui{}
, que é uma sequência vazia, o valor deb
quando está no início ou no final dea
. O retorno está implícito.fonte
C, 96 bytes
É do conhecimento geral que a manipulação de cordas em C é complicada, pois uma extensão do golfe seria masoquista limítrofe. Parece bom para mim.
Um dos programas menos legíveis que escrevi. Toma duas entradas (apesar da aparência da função), um
char**
apontador para a cadeia de caracteres para desconcatenar e umchar*
qual é a cadeia de caracteres a ser removida. O ponteiro de entrada é editado no lugar e se torna a saída (quem fala sobre vazamentos de memória de qualquer maneira).Exemplo de uso:
fonte
AWK ,
2132 bytesExperimente online!
O envio original substituiu ingenuamente o texto na primeira sequência, não apenas no começo ou no final.
Experimente online!
Originalmente tentado sem os aparelhos, mas era necessário truques para imprimir linhas vazias e / ou não correspondências, o que acabou adicionando mais bytes que esta versão.
fonte
R,
204241 bytes-1 byte graças a MickyT!
Retorna uma função anônima (que possui argumentos na ordem
b,a
). Calcula a diferença de cadeiaa-b
.sub
é uma substituição simples que troca a primeira ocorrência do padrão com, nesse caso, a sequência vazia''
. Constrói a regex comsprintf
para corresponder apenas no início e no final da sequência. Requer que opryr
pacote seja instalado.No link TIO, usa a
function(a,b)
definição mais detalhada para a função por mais quatro bytes.Experimente online!
fonte
'abcde','bcd' -> 'abcde'
caso?sub
é uma substituição simples que simplesmente troca a primeira ocorrência deb
ema
": Isso será trocado se a segunda string estiver no meio da primeira string?sprintf('^%s|%s$',b,b)
Lisp comum, 121 bytes
Experimente online!
O habitual prolixo Lisp comum!
Versão não destruída:
fonte
Kotlin , 91 bytes
Experimente online!
fonte
{a,b->var c=a.removePrefix(b);if(a==c){c=a.removeSuffix(b)};c}
Powershell,
3440 bytes+6 bytes quando
Invalid Subtraction
casos de teste foram adicionadosComente:
A expressão regexp
^$t|$t$
não funciona conforme o esperado: substitui as duas correspondências em vez de uma (sinalizadorg
sempre ativado). Então, somos forçados a usar o grupo negativo de lookahead.Script de teste:
Saída:
fonte
QBIC , 57 bytes
Whegh, isso é uma bagunça no QBIC / QBasic ...
fonte
Lua ,
7165 bytesAceitando sugestões
Experimente online!
fonte
Inicialmente, eu li errado as instruções. Obrigado, Ørjan Johansen por apontar meu erro!
PowerShell ,
4651 bytesExperimente online!
fonte
abcde
-bcd
não ocorre em nenhuma das extremidades da string.Excel, 129 bytes
fonte
sed ,
5653 bytesExperimente online!
fonte