Introdução
Nesse desafio, sua tarefa é encontrar subsequências generalizadas de cadeias. As subsequências não são necessariamente contíguas e também podem "envolver" a cadeia, passando pelo final e iniciando novamente desde o início. Você vai querer minimizar o número de envoltórios.
Mais formalmente, deixe u
e v
seja duas cordas e k ≥ 0
um número inteiro. Dizemos que u
é uma k
subsequência de empacotamento de v
, se houver índices distintos tais que , e na maioria dos índices, satisfaçam . Isso significa que pode ser encontrado no interior , indo da esquerda para a direita, escolhendo alguns de seus personagens no caminho e dando voltas na maioria das vezes (equivalentemente, fazendo na maioria das varreduras ). Observe que nenhum caractere pode ser escolhido mais de uma vez, mesmo após uma volta, e que as subsequências de empacotamento são exatamente as subsequências comuns com as quais todos estamos familiarizados.i1, i2, ..., ilen(u)
u == v[i1] v[i2] ... v[ilen(u)]
k
ij
ij > ij+1
u
v
k
k+1
v
0
A tarefa
Suas entradas são duas seqüências alfanuméricas não vazias u
e v
, e sua saída é o menor número inteiro, de k
modo que u
é uma k
subsequência de empacotamento v
. Se não k
existir, a saída será -1
.
Exemplo
Considere as entradas u := xyzyxzzxyx
e v := yxzzazzyxxxyz
. Se começarmos a procurar os personagens de u
in v
de uma maneira gananciosa, faremos 3 vezes:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Portanto, a saída correta é no máximo 3. Observe como o caractere mais à esquerda x
é selecionado uma vez e depois ignorado na segunda varredura, pois não pode ser reutilizado. No entanto, existe um método mais curto com apenas 2 wrap-arounds:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Acontece que uma volta (ou seja, duas varreduras) não é suficiente, portanto a saída correta é 2
.
Regras e Bônus
Você pode escrever uma função ou um programa completo e também pode alterar a ordem das entradas, se necessário. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Há um bônus de -10% para calcular todos os casos de teste em menos de 10 segundos no total. Testarei casos pouco claros na minha máquina; minha implementação de referência em Python leva cerca de 0,6 segundos. Eu tenho um laptop de 7 anos com CPU dual core de 1,86 GHz, que você pode levar em consideração.
Casos de teste
"me" "moe" -> 0
"meet" "metro" -> -1
"ababa" "abaab" -> 1
"abaab" "baabaa" -> 1
"1c1C1C2B" "1111CCCcB2" -> 3
"reverse" "reserved" -> 2
"abcdefg" "gfedcba" -> 6
"xyzyxzzxyx" "yxzzazzyxxxyz" -> 2
"aasdffdaasdf" "asdfddasdfsdaafsds" -> 2
fonte
x
é usado em três varreduras distintas. Só pode ser usado uma vez.Respostas:
Pitão, 34 bytes
Isso define uma função
g
, que aceita duas strings como parâmetro. Experimente on-line: Compilador / Executor PythEste código é muito ineficiente. Tem uma complexidade de tempo e memória de
len(v)!/(len(v)-len(u))!
. Não é possível resolver os casos de teste mais longos em menos de 10 segundos. (Ele também travará muito provavelmente, pois ficará sem memória.)fonte
Haskell, 160 * 0,9 = 144 bytes
Tempo para todos os casos de teste (nota: os argumentos são invertidos):
Como funciona (versão curta): força bruta simples que utiliza o mínimo de um caractere correspondente e o ignora. Paro a pesquisa quando terminar (retornando o número de ciclos) ou quando o ciclo for maior que o mínimo até agora (retornando -1).
Salvei muitos bytes em comparação com a minha primeira versão, principalmente porque mudei de um programa completo para uma função.
Com alguns comentários e espaçamento adequado, Haskell é bastante legível:
Para referência: versão antiga, programa completo, 187 bytes
fonte
JavaScript (ES6) 174 (193 - 10%)
Pesquisa recursiva, como a resposta do @ nimi, mantendo o mínimo de envolvimentos. O espaço das soluções é grande (sobretudo no último exemplo), mas reduzir a pesquisa nos mínimos encontrados atualmente mantém o tempo baixo. Edit 1 Adicione um caso de teste ausente, encurtado um pouco Edit 2 Não há necessidade de passar os parâmetros, é corrigido
Ungolfed
Teste no console Firefox / FireBug
Saída (última linha é o tempo de execução em ms)
fonte