Einführung
Angenommen, Sie erhalten eine zufällige Permutation von n
Objekten. Die Permutation ist in einer Box versiegelt, sodass Sie keine Ahnung haben, um welche der n!
möglichen es sich handelt. Wenn Sie es geschafft haben, die Permutation auf n
bestimmte Objekte anzuwenden , können Sie sofort auf ihre Identität schließen. Sie dürfen die Permutation jedoch nur auf längenbinäre n
Vektoren anwenden, dh , Sie müssen sie mehrmals anwenden, um sie zu erkennen. Das Anwenden auf die n
Vektoren mit nur einem 1
erledigt die Arbeit, aber wenn Sie klug sind, können Sie es mit log(n)
Anwendungen erledigen . Der Code für diese Methode wird allerdings länger sein ...
Dies ist eine experimentelle Herausforderung, bei der Ihre Punktzahl eine Kombination aus Codelänge und Abfragekomplexität ist , dh die Anzahl der Aufrufe einer Zusatzprozedur. Die Spezifikation ist ein bisschen lang, also nimm sie mit.
Die Aufgabe
Ihre Aufgabe ist es, eine benannte Funktion (oder das nächste Äquivalent) zu schreiben f
, die eine positive Ganzzahl n
und eine Permutation p
der ersten n
Ganzzahlen als Eingabe verwendet, wobei entweder eine 0-basierte oder eine 1-basierte Indizierung verwendet wird. Ihre Ausgabe ist die Permutation p
. Allerdings sind Sie nicht die Permutation zugreifen darf p
direkt . Das einzige, was Sie damit tun können, ist, es auf einen beliebigen Vektor von n
Bits anzuwenden . Zu diesem Zweck verwenden Sie eine Hilfsfunktion P
, die eine Permutation p
und einen Vektor von Bits aufnimmt v
und den permutierten Vektor zurückgibt, dessen p[i]
th-Koordinate das Bit enthält v[i]
. Beispielsweise:
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
Sie können "Bits" durch zwei unterschiedliche Werte ersetzen, z. B. 3
und -4
, oder 'a'
und 'b'
, und diese müssen nicht festgelegt werden, sodass Sie P
mit beiden [-4,3,3,-4]
und [2,2,2,1]
im selben Aufruf anrufen können f
. Die Definition von P
wird nicht auf Ihre Punktzahl angerechnet.
Wertung
Die Abfragekomplexität Ihrer Lösung für eine bestimmte Eingabe ist die Anzahl der Aufrufe der Hilfsfunktion P
. Um diese Kennzahl eindeutig zu machen, muss Ihre Lösung deterministisch sein. Sie können pseudozufällig generierte Zahlen verwenden, müssen dann aber auch einen Startwert für den Generator festlegen.
In diesem Repository finden Sie eine Datei mit dem Namen " permutations.txt
505 Permutationen", 5 mit einer Länge zwischen 50 und 150 einschließlich, wobei eine 0-basierte Indizierung verwendet wird (inkrementieren Sie jede Zahl im 1-basierten Fall). Jede Permutation steht in einer eigenen Zeile, und ihre Nummern werden durch Leerzeichen getrennt. Ihre Punktzahl entspricht der Anzahl der Bytes f
+ der durchschnittlichen Abfragekomplexität für diese Eingaben . Die niedrigste Punktzahl gewinnt.
Extra Regeln
Code mit Erläuterungen wird bevorzugt, und Standardlücken sind nicht zulässig. Insbesondere sind einzelne Bits nicht unterscheidbar (Sie können also keinen Vektor von Integer
Objekten angeben P
und ihre Identitäten vergleichen), und die Funktion gibt P
immer einen neuen Vektor zurück, anstatt die Eingabe neu anzuordnen. Sie können die Namen f
und P
sowie die Reihenfolge, in der sie ihre Argumente verwenden, frei ändern .
Wenn Sie die erste Person sind, die in Ihrer Programmiersprache antwortet, wird dringend empfohlen, ein Test-Gurtzeug einzuschließen, das eine Implementierung der Funktion enthält P
, die auch zählt, wie oft sie aufgerufen wurde. Hier ist als Beispiel das Gurtzeug für 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()
In einigen Sprachen ist es unmöglich, ein solches Geschirr zu schreiben. Insbesondere erlaubt Haskell der reinen Funktion nicht P
, die Anzahl der Aufrufe aufzuzeichnen. Aus diesem Grund können Sie Ihre Lösung so erneut implementieren, dass sie auch die Komplexität der Abfrage berechnet, und diese im Kabelbaum verwenden.
abaaabababaa
und-4 3 3 3 -4 3
wären ein Vektor von Bits?