Einführung
Angenommen, Sie und Ihr Freund spielen ein Spiel. Ihr Freund denkt an eine bestimmte Abfolge von nBits, 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 Ses 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 nund eine binäre Folge Rvon 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, Rist, es als Eingabe für die Funktion len_lcszusammen mit einer anderen Binärsequenz zu geben S. Die Funktion len_lcs(R, S)gibt die Länge der längsten gemeinsamen Teilsequenz von Rund zurück S. Dies bedeutet die längste Folge von Bits, die als (nicht notwendigerweise zusammenhängende) Folge in beiden Rund auftritt S. Die Eingänge len_lcskönnen unterschiedlich lang sein. Das Programm sollte diese Funktion Rund andere Sequenzen einige Male aufrufen und dann die Sequenz Rbasierend auf diesen Informationen rekonstruieren .
Beispiel
Betrachten Sie die Eingänge n = 4und 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 Raus 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, 3da 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.txt100 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 awurde und anschließend eine aMünze mit Voreinstellung geworfen nwurde. 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_lcsin der Sprache Ihrer Wahl zu implementieren .
lcsstattdessen 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 ...