Introdução
Suponha que você e seu amigo estejam jogando um jogo. Seu amigo pensa em uma sequência específica de nbits e sua tarefa é deduzir a sequência fazendo perguntas. No entanto, o único tipo de pergunta que você pode fazer é "Quanto tempo é a subsequência comum mais longa da sua sequência e S", onde Sestá qualquer sequência de bits. Quanto menos perguntas você precisar, melhor.
A tarefa
Sua tarefa é escrever um programa ou função que tenha como entrada um número inteiro positivo ne uma sequência binária Rde comprimento n. A sequência pode ser uma matriz de números inteiros, uma sequência ou outro tipo razoável de sua escolha. Seu programa deve produzir a sequência R.
Seu programa não tem permissão para acessar a sequência Rdiretamente. A única coisa que ele pode fazer Ré fornecê-lo como entrada para a função, len_lcsjuntamente com outra sequência binária S. A função len_lcs(R, S)retorna o comprimento da subsequência comum mais longa de Re S. Isso significa a sequência mais longa de bits que ocorre como uma subsequência (não necessariamente contígua) em ambos Re S. As entradas len_lcspodem ter diferentes comprimentos. O programa deve chamar essa função Re outras seqüências várias vezes e, em seguida, reconstruir a sequência com Rbase nessas informações.
Exemplo
Considere as entradas n = 4e R = "1010". Primeiro, podemos avaliar len_lcs(R, "110"), o que fornece 3, uma vez que "110"é a subsequência comum mais longa de "1010"e "110". Então sabemos que Ré obtido "110"inserindo um bit em alguma posição. Em seguida, podemos tentar len_lcs(R, "0110"), que retorna 3desde que as subsequências comuns mais longas são "110"e "010", portanto, "0110"não estão corretas. Então tentamos len_lcs(R, "1010"), que retorna 4. Agora sabemos disso R == "1010", para que possamos retornar essa sequência como a saída correta. Isso exigiu 3 chamadas para len_lcs.
Regras e pontuação
Em este repositório , você encontrará um arquivo chamado subsequence_data.txtcontendo 100 sequências binárias aleatórias de comprimentos entre 75 e 124. Eles foram gerados por tomar três carros alegóricos aleatórios entre 0 e 1, tendo sua média como a, e em seguida, lançando uma amoeda -biased nvezes. Você pontua é o número médio de chamadas paralen_lcs essas seqüências, sendo a pontuação mais baixa melhor. Sua submissão deve registrar o número de chamadas. Não há limites de tempo, exceto que você deve executar seu programa no arquivo antes de enviá-lo.
Sua submissão deve ser determinística. Os PRNGs são permitidos, mas devem usar a data de hoje 200116(ou o equivalente mais próximo) como a semente aleatória. Você não tem permissão para otimizar seu envio em relação a esses casos de teste específicos. Se eu suspeitar que isso esteja acontecendo, gerarei um novo lote.
Como não é um código de golfe, você deve escrever um código legível. O Código Rosetta possui uma página na subsequência comum mais longa ; você pode usá-lo para implementar len_lcsno seu idioma preferido.
lcsvez de len_lcs.
lcs(R, "01"*2*n)retorna R. ;) Mas isso poderia funcionar se chamada lcs(R, S)iria aumentar a pontuação len(S)em vez de 1, ou algo assim ...