Einführung
Angenommen, Sie und Ihr Freund spielen ein Spiel. Ihr Freund denkt an eine bestimmte Abfolge von n
Bits, und Ihre Aufgabe ist es, die Abfolge abzuleiten, indem Sie ihm Fragen stellen. Die einzige Art von Frage, die Sie stellen dürfen, ist "Wie lang ist die längste gemeinsame Teilfolge Ihrer Sequenz und S
", wobei S
es sich um eine beliebige Folge von Bits handelt. Je weniger Fragen Sie benötigen, desto besser.
Die Aufgabe
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die eine positive ganze Zahl n
und eine binäre Folge R
von Längen als Eingabe verwendet n
. Die Sequenz kann ein Array von Ganzzahlen, eine Zeichenfolge oder ein anderer sinnvoller Typ Ihrer Wahl sein. Ihr Programm soll die Sequenz ausgeben R
.
Ihr Programm darf nichtR
direkt auf die Sequenz zugreifen . Das einzige, was es tun darf, R
ist, es als Eingabe für die Funktion len_lcs
zusammen mit einer anderen Binärsequenz zu geben S
. Die Funktion len_lcs(R, S)
gibt die Länge der längsten gemeinsamen Teilsequenz von R
und zurück S
. Dies bedeutet die längste Folge von Bits, die als (nicht notwendigerweise zusammenhängende) Folge in beiden R
und auftritt S
. Die Eingänge len_lcs
können unterschiedlich lang sein. Das Programm sollte diese Funktion R
und andere Sequenzen einige Male aufrufen und dann die Sequenz R
basierend auf diesen Informationen rekonstruieren .
Beispiel
Betrachten Sie die Eingänge n = 4
und R = "1010"
. Erstens könnten wir beurteilen len_lcs(R, "110")
, was gibt 3
, da "110"
ist die längste gemeinsame Teilfolge von "1010"
und "110"
. Dann wissen wir , dass R
aus erhalten wird "110"
durch Einfügen eines Bits an einer bestimmten Position. Als nächstes könnten wir versuchen len_lcs(R, "0110")
, was zurückgibt, 3
da die längsten gemeinsamen Teilfolgen sind "110"
und "010"
somit "0110"
nicht korrekt ist. Dann versuchen wir len_lcs(R, "1010")
, was zurückkehrt 4
. Jetzt wissen wir das R == "1010"
, sodass wir diese Sequenz als die richtige Ausgabe zurückgeben können. Dies erforderte 3 Anrufe zu len_lcs
.
Regeln und Wertung
In diesem Repository finden Sie eine Datei mit dem Namen " subsequence_data.txt
100 zufällige binäre Sequenzen mit Längen zwischen 75 und 124". Sie wurden generiert, indem drei zufällige Gleitkommazahlen zwischen 0 und 1 verwendet wurden, der Durchschnitt als angegeben a
wurde und anschließend eine a
Münze mit Voreinstellung geworfen n
wurde. Ihre Punktzahl ist die durchschnittliche Anzahl der Anrufe inlen_lcs
diesen Sequenzen, wobei eine niedrigere Punktzahl besser ist. Ihr Beitrag sollte die Anzahl der Anrufe aufzeichnen. Es gibt keine zeitlichen Beschränkungen, außer dass Sie Ihr Programm für die Datei ausführen sollten, bevor Sie sie senden.
Ihre Vorlage soll deterministisch sein. PRNGs sind zulässig, aber sie müssen das heutige Datum 200116
(oder das nächstgelegene Äquivalent) als zufälligen Startwert verwenden. Es ist Ihnen nicht gestattet, Ihre Einreichung für diese speziellen Testfälle zu optimieren. Wenn ich vermute, dass dies geschieht, werde ich einen neuen Stapel generieren.
Dies ist kein Codegolf, daher wird empfohlen, lesbaren Code zu schreiben. Rosetta Code hat eine Seite mit der längsten gemeinsamen Untersequenz . Sie können das verwenden, um es len_lcs
in der Sprache Ihrer Wahl zu implementieren .
lcs
stattdessen zugreifen können len_lcs
.
lcs(R, "01"*2*n)
kehrt R
. ;) Aber das könnte funktionieren, wenn der Anruf lcs(R, S)
die Punktzahl um len(S)
1 erhöhen würde , oder so ähnlich ...