Introdução
Eu já criei dois desafios em que a idéia é reconstruir um objeto usando o menor número possível de operações do tipo consulta; este será o terceiro.
A tarefa
Suas entradas devem ser uma sequência não vazia S
sobre o alfabeto abc
e seu comprimento, e sua saída deve ser S
. Sem restrições, isso seria uma tarefa trivial; O problema é que você não tem permissão para acessar S
diretamente. A única coisa que você pode fazer S
é chamar a função num_occur(T, S)
, onde T
está outra string, e num_occur
conta o número de ocorrências de T
in S
. As ocorrências sobrepostas são contadas como distintas; portanto, num_occur(T, S)
realmente retorna o número de índices, de i
modo que
S[i, i+1, …, i+length(T)-1] == T
Por exemplo, num_occur("aba", "cababaababb")
retornará 3
. Observe também que num_occur(S, S)
retornará 1
. O resultado de num_occur("", S)
é indefinido e você não deve chamar a função em uma sequência vazia.
Em resumo, você deve escrever uma função ou programa que aceite S
e length(S)
como entradas, chame num_occur
algumas seqüências mais curtas e S
várias vezes, reconstrua a S
partir dessas informações e as retorne.
Regras e pontuação
Seu objetivo é escrever um programa que faça o menor número num_occur
possível de chamadas . Em este repositório , você encontrará um arquivo chamado abc_strings.txt
. O arquivo contém 100 strings, cada uma em sua própria linha, entre os comprimentos 50 e 99. Sua pontuação é o número total de chamadas para num_occur
essas entradas , sendo a pontuação menor melhor. Sua solução preferencialmente acompanhará esse número enquanto ele é executado e o imprimirá após o término. As strings são geradas escolhendo letras uniformemente aleatórias de abc
; você pode otimizar esse método de geração de cadeias, mas não as próprias cadeias.
Não há limite de tempo, exceto que você deve executar sua solução nos casos de teste antes de enviá-la. Sua solução deve funcionar para qualquer entrada válida S
, não apenas para os casos de teste.
Você também deve compartilhar sua implementação num_occur
, se não estiver usando outra pessoa. Para começar, aqui está uma implementação em Python:
def num_occur(needle, haystack):
num = 0
for i in range(len(haystack) - len(needle) + 1):
if haystack[i : i + len(needle)] == needle:
num += 1
return num
fonte
S
ou apenas para os casos de teste?all non-empty strings
de qualquer tamanho?Respostas:
Javascript,
1432514311 chamadasComeçamos com uma string vazia e seguimos recursivamente adicionando uma nova letra no final ou no início da string atual enquanto ainda temos pelo menos uma correspondência.
Todos os resultados anteriores
numOccur()
são salvos nosym
objeto e usamos esses dados para rejeitar imediatamente qualquer nova sequência que não possa ser candidata.EDIT : Como sempre começamos
'a'
, sempre sabemos o número exato dea
na string. Usamos essas informações para finalizar o processo mais cedo, quando detectamos que apenas uma sequência dea
está faltando. Também foi corrigida a expressão regular inválida no Chrome e no IE.Snippet executável completo abaixo.
Mostrar snippet de código
fonte
Python, 15205 chamadas
É provável que esse envio seja abaixo do ideal, porque ele só usa
num_occur
para verificar se uma sequência é uma subcadeia de caracteresS
e nunca a utiliza para contar a quantidade de subcadeias.O algoritmo funciona armazenando uma string
current
que é construída para ser igual aS
no final. Aqui estão todas as etapas do algoritmo:Definimos
current
igual a''
Percorra cada letra do alfabeto e faça o seguinte:
2.1 Crie uma nova sequência
current_new
e defina-a comocurrent
seguida pela letra.2.2 Verifique se
current_new
está incluídoS
executandonum_occur
nele e veja se o resultado é maior que um.2.3 Se
current_new
estiver incluídoS
, definacurrent
comocurrent_new
e volte para a etapa 2. Senão, vamos para a próxima letra.Se o comprimento de
current
for igual ao comprimento deS
, podemos dizer que terminamos. Senão, voltamos à etapa 2, mas modificamos a etapa 2.1 paracurrent_new
igualar a letra seguida porcurrent
. Quando chegamos a esse passo novamente, terminamos.fonte
Python 2,
1495214754 chamadasMuito semelhante à primeira resposta, mas não tenta os próximos caracteres que resultam em substrings impossíveis que:
sabemos
num_occur
que eles não ocorrem no alvo (de chamadas anteriores)já usamos a substring com mais frequência do que ocorre de acordo com
num_occur
(adicionará a contagem de substrings em um minuto)feitofonte
Python
Chamadas do 1270512632Eu usei o esqueleto da função Loovjo. Eu nunca codifico em Python, eu precisava de um bootrap
EDIT:
Adicionado código para cadeias de comprimento de um caractere
Adicionado código para rejeitar padrões já correspondentes
fonte