Introducción
Supongamos que se le entrega una permutación aleatoria de n
objetos. La permutación está sellada en una caja, por lo que no tienes idea de cuál es la n!
posible. Si logró aplicar la permutación a n
objetos distintos, podría deducir inmediatamente su identidad. Sin embargo, solo se le permite aplicar la permutación a n
vectores binarios de longitud , lo que significa que tendrá que aplicarla varias veces para reconocerla. Claramente, aplicarlo a los n
vectores con solo uno 1
hace el trabajo, pero si eres inteligente, puedes hacerlo con log(n)
aplicaciones. Sin embargo, el código para ese método será más largo ...
Este es un desafío experimental en el que su puntaje es una combinación de longitud de código y complejidad de consulta , lo que significa la cantidad de llamadas a un procedimiento auxiliar. La especificación es un poco larga, así que tengan paciencia conmigo.
La tarea
Su tarea es escribir una función con nombre (o el equivalente más cercano) f
que tome como entradas un número entero positivo n
y una permutación p
de los primeros n
números enteros, usando indexación basada en 0 o en 1. Su salida es la permutación p
. Sin embargo, no puede acceder a la permutación p
directamente . Lo único que puede hacer con él es aplicarlo a cualquier vector de n
bits. Para este propósito, utilizará una función auxiliar P
que toma una permutación p
y un vector de bits v
, y devuelve el vector permutado cuya p[i]
coordenada th contiene el bit v[i]
. Por ejemplo:
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
Puede reemplazar "bits" con dos valores distintos, como 3
and -4
, or 'a'
y 'b'
, y no necesitan ser reparados, por lo que puede llamar P
con ambos [-4,3,3,-4]
y [2,2,2,1]
en la misma llamada a f
. La definición de P
no se cuenta para su puntaje.
Puntuación
La complejidad de la consulta de su solución en una entrada dada es la cantidad de llamadas que realiza a la función auxiliar P
. Para que esta medida no sea ambigua, su solución debe ser determinista. Puede usar números generados de forma seudoaleatoria, pero también debe arreglar una semilla inicial para el generador.
En este repositorio encontrará un archivo llamado permutations.txt
que contiene 505 permutaciones, 5 de cada longitud entre 50 y 150 inclusive, usando indexación basada en 0 (incremente cada número en el caso basado en 1). Cada permutación está en su propia línea, y sus números están separados por espacios. Su puntaje es el recuento de bytes de f
+ complejidad de consulta promedio en estas entradas . La puntuación más baja gana.
Reglas extra
Se prefiere el código con explicaciones, y las lagunas estándar no están permitidas. En particular, los bits individuales son indistinguibles (por lo que no puede dar un vector de Integer
objetos P
y comparar sus identidades), y la función P
siempre devuelve un nuevo vector en lugar de reorganizar su entrada. Puede cambiar libremente los nombres de f
y P
, y el orden en que toman sus argumentos.
Si es la primera persona en responder en su lenguaje de programación, le recomendamos encarecidamente que incluya un arnés de prueba, incluida una implementación de la función P
que también cuente la cantidad de veces que se llamó. Como ejemplo, aquí está el arnés para 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()
En algunos idiomas, es imposible escribir tal arnés. En particular, Haskell no permite que la función pura P
registre la cantidad de veces que se llama. Por este motivo, puede volver a implementar su solución de tal manera que también calcule su complejidad de consulta y la use en el arnés.
abaaabababaa
y-4 3 3 3 -4 3
sería un vector de bits.