Einführung
Ich habe zuvor zwei Herausforderungen erstellt, bei denen es darum geht, ein Objekt mit möglichst wenigen Abfragearten zu rekonstruieren. Dies wird der dritte sein.
Die Aufgabe
Ihre Eingaben müssen eine nicht leere Zeichenfolge S
über dem Alphabet abc
und seiner Länge sein, und Ihre Ausgabe muss sein S
. Ohne Einschränkungen wäre dies natürlich eine triviale Aufgabe. der Haken ist, dass Sie nicht S
direkt zugreifen dürfen . Das Einzige, was Sie tun dürfen, S
ist, die Funktion aufzurufen num_occur(T, S)
, wobei T
es sich um eine andere Zeichenfolge handelt, und num_occur
die Anzahl der Vorkommen von T
in zu zählen S
. Überlappende Vorkommen werden als eindeutig gezählt, sodass num_occur(T, S)
die Anzahl der Indizes tatsächlich i
so zurückgegeben wird, dass
S[i, i+1, …, i+length(T)-1] == T
Zum Beispiel num_occur("aba", "cababaababb")
wird zurückkehren 3
. Beachten Sie auch, dass num_occur(S, S)
zurückkehren wird 1
. Das Ergebnis von num_occur("", S)
ist undefiniert, und Sie sollten die Funktion nicht für eine leere Zeichenfolge aufrufen.
Kurz gesagt, Sie sollten eine Funktion oder ein Programm schreiben, die S
bzw. das length(S)
als Eingaben verwendet, num_occur
einige kürzere Zeichenfolgen und S
einige Male aufruft , S
aus diesen Informationen rekonstruiert und diese zurückgibt.
Regeln und Wertung
Ihr Ziel ist es, ein Programm zu schreiben, das so wenig num_occur
wie möglich aufruft . In diesem Repository finden Sie eine Datei namens abc_strings.txt
. Die Datei enthält 100 Zeichenfolgen, jede in einer eigenen Zeile, mit einer Länge zwischen 50 und 99. Ihre Punktzahl gibt die Gesamtzahl der Anrufe num_occur
an diesen Eingängen an , wobei eine niedrigere Punktzahl besser ist. Ihre Lösung protokolliert diese Nummer vorzugsweise während der Ausführung und druckt sie nach Abschluss aus. Die Zeichenfolgen werden durch Auswahl von gleichmäßig zufälligen Buchstaben generiert abc
. Sie können für diese Methode zum Generieren der Zeichenfolgen optimieren, jedoch nicht für die Zeichenfolgen selbst.
Es gibt keine zeitliche Begrenzung, außer dass Sie Ihre Lösung für die Testfälle ausführen sollten, bevor Sie sie senden. Ihre Lösung sollte für alle gültigen Eingaben funktionieren S
, nicht nur für die Testfälle.
Sie werden ermutigt, auch Ihre Implementierung num_occur
mitzuteilen, wenn Sie nicht die einer anderen Person verwenden. Um den Ball ins Rollen zu bringen, folgt eine Implementierung in Python:
def num_occur(needle, haystack):
num = 0
for i in range(len(haystack) - len(needle) + 1):
if haystack[i : i + len(needle)] == needle:
num += 1
return num
quelle
S
oder nur für die Testfälle funktionieren ?all non-empty strings
von welcher Länge?Antworten:
Javascript,
1432514311 AnrufeWir beginnen mit einer leeren Zeichenfolge und gehen unseren Weg rekursiv, indem wir am Ende oder am Anfang der aktuellen Zeichenfolge einen neuen Buchstaben einfügen, solange wir noch mindestens eine Übereinstimmung haben.
Alle vorherigen Ergebnisse von
numOccur()
werden imsym
Objekt gespeichert und wir verwenden diese Daten, um neue Zeichenfolgen, die möglicherweise kein Kandidat sein können, sofort abzulehnen.EDIT : Da wir immer mit beginnen
'a'
, kennen wir immer die genaue Anzahla
in der Zeichenfolge. Wir verwenden diese Informationen, um den Prozess früher zu beenden, wenn wir feststellen, dass nur eine Sequenz vona
fehlt. Außerdem wurde der reguläre Ausdruck behoben, der in Chrome und IE ungültig war.Vollständiges ausführbares Snippet unten.
Code-Snippet anzeigen
quelle
Python, 15205 Anrufe
Diese Übermittlung ist höchstwahrscheinlich suboptimal, da sie nur verwendet wird
num_occur
, um zu überprüfen, ob eine Zeichenfolge eine Teilzeichenfolge istS
, und sie wird niemals verwendet, um die Anzahl der Teilzeichenfolgen tatsächlich zu zählen.Der Algorithmus speichert einen String,
current
der so aufgebaut ist, dass erS
am Ende gleich ist. Hier sind alle Schritte des Algorithmus:Wir setzen
current
gleich''
Gehen Sie jeden Buchstaben im Alphabet durch und gehen Sie folgendermaßen vor:
2.1. Erstellen Sie eine neue Zeichenfolge
current_new
und setzen Sie sie gleich,current
gefolgt von dem Buchstaben.2.2. Überprüfen Sie, ob
current_new
in enthalten ist,S
indem Sie darauf ausführennum_occur
, und prüfen Sie, ob das Ergebnis größer als eins ist.2.3. Wenn
current_new
in enthalten istS
, setzen Siecurrent
aufcurrent_new
und fahren Sie mit Schritt 2 fort. Anderenfalls fahren wir mit dem nächsten Buchstaben fort.Wenn die Länge von
current
gleich der Länge von istS
, können wir sagen, dass wir fertig sind. Andernfalls kehren wir zu Schritt 2 zurück, ändern jedoch Schritt 2.1, umcurrent_new
dem Buchstaben zu entsprechen, gefolgt voncurrent
. Wenn wir diesen Schritt wieder erreichen, sind wir fertig.quelle
Python 2,
1495214754 AnrufeSehr ähnlich der ersten Antwort, aber es werden keine weiteren Zeichen ausprobiert, was zu unmöglichen Teilzeichenfolgen führt, die:
wir wissen,
num_occur
dass sie nicht im Ziel vorkommen (aus früheren Aufrufen)wir haben den Teilstring schon öfter benutzt, als es laut vorkommt
num_occur
(wird das Zählen von Teil in einer Minute hinzufügen)getanquelle
Python
1270512632 AnrufeIch habe das Loovjo-Funktionsskelett verwendet. Ich habe nie in Python programmiert. Ich brauchte einen Bootsrap
BEARBEITEN:
Code für Strings mit einer Zeichenlänge hinzugefügt. Code
hinzugefügt, um bereits übereinstimmende Muster abzulehnen
quelle