Às vezes acontece que, ao digitar uma frase, fico distraído e acabo digitando o mesmo par de palavras duas vezes duas vezes seguidas.
Para garantir que outras pessoas não se incomodem com isso, sua tarefa é escrever um programa que resolva esse problema!
Tarefa
Dada uma sequência de entrada (se for importante para o seu idioma, você pode assumir uma entrada apenas ASCII que não contém alimentações de linha.) str
, Que contém em algum lugar no meio uma substring que ocorre duas vezes em sucessão imediata, retorne a sequência com uma instância desta substring removido.
No caso de múltiplas possibilidades, retorne a resposta mais curta possível (ou seja, escolha a substring de repetição consecutiva mais longa e remova essa).
No caso de várias substrings repetitivas consecutivas com o mesmo comprimento, remova a primeira (ou seja, a primeira encontrada ao ler a sequência da frente para trás).
Você pode presumir que a entrada está correta (ou seja, sempre contém uma subsequência consecutiva de substring), o que pode ajudar a diminuir o nível.
Exemplos
- Entrada:
hello hello world
-> Saída:hello world
. - Entrada:
foofoo
-> Saída:foo
. (Então: Sim, a sequência pode consistir apenas na parte repetida duas vezes). - Entrada:
aaaaa
-> Saída:,aaa
como a substring consecutiva de repetição mais longa está aquiaa
. - Entrada:
Slartibartfast
-> Esta não é uma entrada válida, pois não contém uma subsequência consecutiva consecutiva, portanto, você não precisa lidar com este caso. - Entrada:
the few the bar
-> Esta é outra entrada inválida, pois a parte repetida deve seguir imediatamente a parte original. Nesse caso,the
ethe
são separados por outra coisa intermediária, portanto, esta entrada é inválida. - Entrada:
ababcbc
-> Saída:abcbc
. As duas substrings de repetição consecutivas mais longas possíveis sãoab
ebc
. Comoab
é encontrado anteriormente na cadeia, esta é a resposta correta. - Entrada:
Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
. Saída:Buffalo buffalo buffalo buffalo Buffalo buffalo
. (A substituição realizada deve fazer distinção entre maiúsculas e minúsculas). - Entrada:
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
-> Saída:Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Somente a substring de repetição consecutiva mais longa é removida.
Seu código deve ser o mais curto possível, já que esse é um código-golf , portanto a resposta mais curta em bytes vence. Boa sorte!
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
como entrada, a saída deve serSometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Somente a duplicação encontrada mais longa é removida.p
inhappens
Respostas:
Perl 6 , 40 bytes
Tente
fonte
Retina ,
3533 bytesA contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Explicação
Como os mecanismos regex procuram correspondências da esquerda para a direita, não é trivial encontrar a correspondência mais longa, independentemente da posição. Isso pode ser feito com os grupos de balanceamento do .NET, mas o resultado é bastante desagradável:
Então imaginei que tentaria evitar isso usando outros recursos do Retina.
Começamos aplicando essencialmente todas as substituições possíveis, uma em cada linha. Para fazer isso, correspondemos à posição na frente de uma partida (em vez da própria partida), para permitir correspondências sobrepostas. Isso é feito colocando o regex real em um lookahead. Essa cabeça de captura captura o restante, exceto a duplicata que queremos remover no grupo 2. Escrevemos novamente o grupo 2 (excluindo a duplicata), um avanço de linha e, em seguida, toda a entrada até a partida, o que nos dá basicamente uma nova linha para ser substituído.
No final, teremos uma linha para cada partida, com a duplicata correspondente removida. No final, também haverá a entrada completa novamente sem nenhuma substituição.
Agora que temos todas as substituições possíveis, queremos o resultado mais curto (o que corresponde à repetição removida mais longa).
Então, primeiro classificamos as linhas por comprimento.
E então mantemos apenas a primeira linha.
fonte
Geléia ,
2219 bytes-2 bytes graças a Dennis (evite uma inversão de argumento, remova um incremento sutilmente redundante)
Experimente online!
Programa completo (foi encontrado um erro por
ÐṀ
não agir com a aridade correta sobre as díades, que será corrigida em breve; embora eu não tenha certeza de que isso pode gerar códigos mais curtos aqui).Quão?
Localiza a primeira das fatias mais longas da entrada, de modo que exista uma repetição na entrada e a remove da entrada.
fonte
JavaScript (ES6),
8174 bytesEditar: salvou 7 bytes roubando o
m[r.length]
truque de @ Arnauld .fonte
PowerShell , 87 bytes
Experimente online! (todos os casos de teste)
Explicação
Basicamente, partindo de dentro, corremos
Matches
com o(.+)\1
regex, para retornar todos os objetos correspondentes para a sequência especificada. A regex corresponde a qualquer sequência de caracteres que é seguida por ela mesma.Em seguida, os objetos de correspondência resultantes são canalizados
sort
para serem classificados por suaLength
propriedade (encurtados para curinga). Isso resulta em uma matriz de correspondências classificadas por comprimento, crescente e, portanto, indexe com[-1]
para obter o último elemento (o mais longo). O valor dessa correspondência é a correspondência, não o grupo, portanto inclui a repetição; portanto, recuperamos o objeto Group (|% Gr*
) e, em seguida, o valor desse (|% V*
) para obter a maior sequência repetida. Coisa é que o objeto de grupo é na verdade uma matriz porque o grupo 0 é sempre a correspondência, mas eu quero o grupo real (1), portanto o valor resultante é realmente o valor s , portanto indexando para obter o segundo elemento[1]
. Esse valor é convertido para um objeto regex e, em seguida, oReplace
O método é chamado na string original, substituindo por nada, e somente a primeira correspondência é substituída (|% Re* $s '' 1
).fonte
Haskell , 101 bytes
A principal função é
f
, leva e retorna aString
.Experimente online!
Quando eu comecei isso, eu importados
Data.List
e usadosmaximum
,tails
,inits
eisPrefixOf
. De alguma forma, isso se transformou nisso. Mas eu ainda consegui raspar 11 bytes ...Notas
splitAt
/a
divide uma string em um determinado índice.s
é a sequência de entrada.i
é a lista de números[0 .. length s - 1]
,-1
é asplitAt
solução alternativa que se divide no final se for fornecido um índice muito grande.n
élength s
menos a meta atual de comprimento para a parte repetida, é escolhida dessa maneira, para que não tenhamos que usar duas listas de números e / ou a sintaxe detalhada da lista decrescente.p
,r
, Et
são uma divisão threeway des
, comr
o pretendido repetido parte. Ofmap
usa o(,) String
Functor
para evitar uma variável para uma divisão intermediária.!!0
seleciona o primeiro elemento da lista de correspondências.fonte
Geléia ,
2321 bytesAgradecemos a JonathanAllan por sua
Ṭœp
idéia, que salvou 2 bytes.Experimente online!
fonte
Mathematica,
636059 bytes4 bytes salvos devido a Martin Ender .
Função anônima. Pega uma string como entrada e retorna uma string como saída.
fonte
~SortBy~StringLength
ordena cordas alfabeticamente se seus comprimentos são o mesmo ...SortBy
e agruparStringLength
uma lista para obter uma classificação estável.JavaScript (ES6), 70 bytes
Casos de teste
Mostrar snippet de código
fonte
aaaabaaab
, mas bom uso dereduce
.Isso deve ser um comentário, mas não tenho reputação suficiente para comentar. Eu só quero dizer ao @Neil que seu código pode ser reduzido para 77 bytes. Você não precisa usar asserção direta na regex. Aqui está a versão reduzida:
fonte
aabab
é o exemplo mais curto de falha na sugestão.C #, 169 bytes
Explicação
Esta é a abordagem da força bruta: tente todas as subseqüências possíveis até encontrarmos a subseqüente repetição mais longa. Sem dúvida, o Regex é mais eficiente, mas lidar com o Regex em C # tende a ser bastante detalhado.
fonte
PHP,
8482 bytesNota: usa a codificação IBM-850.
Execute assim:
Explicação
Tweaks
fonte