Introdução
Suponha que você receba uma permutação aleatória de n
objetos. A permutação é selada em uma caixa; portanto, você não tem idéia de quais são as n!
possíveis. Se você conseguiu aplicar a permutação a n
objetos distintos, poderá deduzir imediatamente sua identidade. No entanto, você só pode aplicar a permutação a n
vetores binários longos , o que significa que precisará aplicá-la várias vezes para reconhecê-la. Claramente, aplicá-lo aos n
vetores com apenas um 1
faz o trabalho, mas se você for inteligente, poderá fazê-lo com log(n)
aplicativos. O código para esse método será mais longo, embora ...
Esse é um desafio experimental em que sua pontuação é uma combinação de tamanho do código e complexidade da consulta , significando o número de chamadas para um procedimento auxiliar. As especificações são um pouco longas, então tenha paciência comigo.
A tarefa
Sua tarefa é escrever uma função nomeada (ou equivalente mais próximo) f
que tome como entrada um número inteiro positivo n
e uma permutação p
dos primeiros n
números inteiros, usando a indexação com base em 0 ou em 1. Sua saída é a permutação p
. No entanto, você não tem permissão para acessar a permutação p
diretamente . A única coisa que você pode fazer com isso é aplicá-lo a qualquer vetor de n
bits. Para esse propósito, você deve usar uma função auxiliar P
que capte uma permutação p
e um vetor de bits v
e retorna o vetor permutado cuja p[i]
th coordenada contém o bit v[i]
. Por exemplo:
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
Você pode substituir "bits" por quaisquer dois valores distintos, como 3
e -4
, ou 'a'
e 'b'
, e eles não precisam ser corrigidos, para que você possa chamar P
com os dois [-4,3,3,-4]
e [2,2,2,1]
na mesma chamada para f
. A definição de P
não é contada na sua pontuação.
Pontuação
A complexidade da consulta da sua solução em uma determinada entrada é o número de chamadas feitas para a função auxiliar P
. Para tornar essa medida inequívoca, sua solução deve ser determinística. Você pode usar números gerados pseudoaleatoriamente, mas também deve corrigir uma semente inicial para o gerador.
Em este repositório você encontrará um arquivo chamado permutations.txt
que contém 505 permutações, 5 de cada comprimento entre 50 e 150 inclusive, usando indexação baseada em 0 (incrementar cada número no caso base-1). Cada permutação está em sua própria linha e seus números são separados por espaços. Sua pontuação é a contagem de bytes de f
+ complexidade média da consulta nessas entradas . Menor pontuação ganha.
Regras Extra
O código com explicações é preferido e as brechas padrão não são permitidas. Em particular, os bits individuais são indistinguíveis (portanto, você não pode atribuir um vetor de Integer
objetos P
e comparar suas identidades), e a função P
sempre retorna um novo vetor em vez de reorganizar sua entrada. Você pode alterar livremente os nomes de f
e P
, e a ordem em que eles recebem seus argumentos.
Se você é a primeira pessoa a responder em sua linguagem de programação, é altamente recomendável incluir um equipamento de teste, incluindo uma implementação da função P
que também conta o número de vezes que foi chamada. Como exemplo, aqui está o chicote para o Python 3.
def f(n,p):
pass # Your submission goes here
num_calls = 0
def P(permutation, bit_vector):
global num_calls
num_calls += 1
permuted_vector = [0]*len(bit_vector)
for i in range(len(bit_vector)):
permuted_vector[permutation[i]] = bit_vector[i]
return permuted_vector
num_lines = 0
file_stream = open("permutations.txt")
for line in file_stream:
num_lines += 1
perm = [int(n) for n in line.split()]
guess = f(len(perm), perm)
if guess != perm:
print("Wrong output\n %s\n given for input\n %s"%(str(guess), str(perm)))
break
else:
print("Done. Average query complexity: %g"%(num_calls/num_lines,))
file_stream.close()
Em algumas línguas, é impossível escrever tal equipamento. Mais notavelmente, Haskell não permite que a função pura P
registre o número de vezes que é chamada. Por esse motivo, você tem permissão para reimplementar sua solução de forma que ela também calcule sua complexidade de consulta e a use no chicote.
abaaabababaa
e-4 3 3 3 -4 3
seria um vetor de bits.