Herausforderung:
Ich habe Tausende von Songs in meiner Musiksammlung und zum Glück hat mein Lieblingsspieler eine Suchfunktion. Ich habe auch ein tolles Gedächtnis - ich kann mich an den Titel jedes Songs in meiner Sammlung erinnern. Ich bin jedoch sehr faul und tippe nicht gerne - jeder zusätzliche Tastendruck ist eine lästige Pflicht!
- Was ist die kürzeste Zeichenfolge, nach der ich suchen muss, um ein Lied zu isolieren? Hilf mir, eine Liste mit Schlüsseln zu speichern, mit denen ich das Tippen bei der Suche minimieren kann!
Das ist Code-Golf , also gewinnt der kürzeste Code.
Regeln:
Erstellen Sie anhand einer eingegebenen Liste mit Songtiteln eine Liste mit Suchschlüsseln, die den folgenden Einschränkungen unterliegen:
- Jeder Songtitel sollte einen Suchschlüssel haben.
- Die Gesamtzahl der Zeichen in der Ausgabeliste muss so gering wie möglich sein.
- Mein Lieblings-Musikplayer ist foobar2000 :
- Die Suchfunktion unterscheidet nicht zwischen Groß- und Kleinschreibung. (
apple
ist dasselbe wieaPpLE
). - Jeder Suchbegriff muss aus einem oder mehreren "Wörtern" in beliebiger Reihenfolge bestehen, die durch Leerzeichen getrennt sind:
- Jedes Wort muss eine Teilzeichenfolge des entsprechenden Songtitels sein .
- Wenn derselbe Teilstring mehrmals angegeben wird, muss er im entsprechenden Songtitel so oft vorkommen.
- Wenn eine Teilzeichenfolge selbst ein Leerzeichen enthält, muss diese Teilzeichenfolge in Anführungszeichen gesetzt werden.
- Die Suchfunktion unterscheidet nicht zwischen Groß- und Kleinschreibung. (
Hinweise:
- Oft gibt es für einige Songtitel mehrere Suchschlüssel, die Regel 2 erfüllen. In einem solchen Fall reicht jeder Schlüssel aus, aber Sie erhalten Brownie-Punkte, wenn Sie alle auflisten.
- Sie können davon ausgehen, dass die Eingabeliste nur ASCII-Zeichen enthält, für die UTF-8-Kompatibilität werden jedoch Brownie-Punkte vergeben.
- War es schwierig, Regel 3 zu befolgen? So funktioniert das:
Beispiel:
Wenn meine Musiksammlung nur aus zwei Alben bestand, Michael Jacksons Off the Wall und Thriler :
Sie können die obigen Listen verwenden, um Ihr Programm zu testen. Hier ist die Rohversion der zweiten Liste:
["Don't Stop 'Til You Get Enough","Rock with You","Working Day and Night","Get on the Floor","Off the Wall","Girlfriend","She's out of My Life","I Can't Help It","It's the Falling in Love","Burn This Disco Out","Wanna Be Startin' Somethin'","Baby Be Mine","The Girl Is Mine","Thriller","Beat It","Billie Jean","Human Nature","P.Y.T. (Pretty Young Thing)"]
["Wanta Be A Wanna B","Wanta Bea A Wanna B","Wanna Be A Wanna Bea"]
?Antworten:
Python 2, 556 Bytes
Probieren Sie es online aus.
-10 Bytes, danke an @Riker, @ovs
Ich brauchte ein paar Abende, um alles zum Laufen zu bringen.
Gibt den Namen des Songs, eine Reihe von Suchschlüsseln und die Länge der Suchschlüssel zusammen aus (einschließlich Leerzeichen und Anführungszeichen)
Einige Erklärungen:
Funktion
len()
wird hier sehr oft verwendet, so dass durch das Umbenennen Bytes gespart werdenWertet alle möglichen Teilzeichenfolgen mit der Länge n aus.
eval(...)
Erzeugt einen Befehl.zip(s,s[1:],s[2:],...,s[n:])
Erzeugt
n
aus jedem Index,s
wenn möglich, Teilfolgen mit einer Länge . Also fürs='budd'
undn='2'
es wird bu, ud, dd produzierenFiltern Sie, um zu überprüfen, ob die angegebenen Tasten (K) für einen eindeutigen Songtitel stehen.
resub wird für mehrere identische Schlüssel benötigt, z. B. ['nn', 'nn'] in den Beispielen.
Die innere Funktion
def R(r,t)
ist eine rekursive Funktion , um alle möglichen Kombinationen von Teilzeichenfolgen zu erstellen, die den Songtitel beschreiben können.Jede Kombination wird mit der aktuell kürzesten (sofern vorhanden) verglichen, um die Anzahl der erstellten Kombinationen zu verringern. Wenn sie größer ist, werden sie nicht als alle Ableitungen akzeptiert.
Die Funktion verwendet 2 Variablen, um den Status zu verfolgen:
n
für die Länge der aktuell kürzesten Tastenkombination undy
für die Kombination selbstDies berechnet die Länge der Tastenkombination.
' '.join
Fügen Sie Leerzeichen zwischen die Schlüssel ein und2*sum(...)
berechnen Sie die Anzahl der erforderlichen Anführungszeichen für Schlüssel mit Leerzeichen.Verwendet die erste Lambda-Funktion, um alle möglichen Tastenkombinationen (von jeder möglichen Länge) für die aktuelle Zeichenfolge abzurufen.
Zwei for-Zyklen, um alle generierten Schlüssel zu durchsuchen und einzeln an den nächsten rekursiven Schritt weiterzuleiten. Key Ort (
j
) am Ende der es richtig Scheibe String benötigt:r[j+T(u[i][j]):]
.Slice enthält eine Zeichenfolge, die dort beginnt, wo der aktuelle Schlüssel endet, sodass keine Überlappungen auftreten.
Wenn der Ort unbekannt ist, würden gleiche Schlüssel alles durcheinander bringen.
Viel länger als nur
y
, aber Schlüssel mit Leerzeichen sollten in Anführungszeichen gesetzt werdenquelle
0,
in einem Ihrer Bereiche entfernen :u=[L(r,i)for i in range(0,T(r))]
=>u=[L(r,i)for i in range(T(r))]
.S=map(str.lower,input())
für -5 Bytes