Jede Woche verschickt Mohammad S. Anwar die Weekly Challenge, eine Chance für uns alle, Lösungen für zwei wöchentliche Aufgaben zu finden. Meine Lösungen werden zunächst in Python geschrieben und dann in Perl konvertiert. Es ist eine großartige Möglichkeit für uns alle, etwas Programmieren zu üben.
Herausforderung, meine Lösungen
Sie erhalten eine Zeichenfolge, $str, und eine Wortliste, @words.
Schreiben Sie ein Skript, das „true“ oder „false“ zurückgibt, ob die angegebene Zeichenfolge in eine durch Leerzeichen getrennte Folge von einem oder mehreren Wörtern aus der angegebenen Liste segmentiert werden kann.
Bei TWC denke ich oft darüber nach, wie ich das Problem am Montag auf dem Weg nach Hause lösen würde. Ich dachte an das Beispiel einer Zeichenfolge „winwine“ und der Wörter „win“ und „wine“ sowie an die Zeichenfolge „winwine“. Es scheint keine deterministische Möglichkeit zu geben, zu erkennen, welches Wort ich zuerst finden sollte.
Ein paar Tage später hatte ich die geniale Idee, dass ich tatsächlich das falsche Problem löste. Eine viel einfachere Lösung bestand darin, reguläre Ausdrücke zu verwenden, um zu sehen, ob ein oder mehrere Wörter mit der Zeichenfolge s.
übereinstimmtenUnd das habe ich geschrieben. Ich verwende re.escape in Python und quotemeta in Perl, um alle speziellen Metazeichen in der Wortliste zu maskieren.
def word_break(s: str, words: list) -> bool: pattern = '^(' + '|'.join(map(re.escape, words)) + ')+$' return True if re.search(pattern, s) else False
$ ./ch-1.py weeklychallenge challenge weekly true $ ./ch-1.py perlrakuperl raku perl true $ ./ch-1.py sonsanddaughters sons sand daughters false
Sie erhalten ein Array von Ganzzahlen, @ints.
Schreiben Sie ein Skript, um die Mindestanzahl an Sprüngen zu ermitteln, um das letzte Element zu erreichen. $ints[$i] stellt die maximale Länge eines Vorwärtssprungs vom Index $i dar. Falls das letzte Element nicht erreichbar ist, geben Sie -1 zurück.
Beim Erledigen dieser Aufgaben verwende ich auch TDD, was ich in meinem Tagesjob nicht mache. Wenn der Test fehlschlägt, liegt in der Regel entweder ein offensichtlicher Fehler oder etwas Schwierigeres vor. Diese Aufgabe war eine von später. Es folgte eine Menge Fehlerbehebung.
Ich weiß, dass sowohl Python als auch Perl über ausgezeichnete integrierte Debugging-Tools verfügen, aber ich bin immer noch ein Fan davon, eine große Menge an Druckanweisungen zu verwenden.
Für diese Aufgabe habe ich eine rekursive Funktion namens jump_game. Es benötigt zwei Parameter: ints ist die Liste der ganzen Zahlen (beginnend mit der vollständigen Liste) und goes, die bei eins beginnen.
Wenn die erste Ganzzahl 0 ist, gebe ich None (undef in Python) zurück, da keine weitere Bewegung möglich ist. Dann iteriere ich – mit einer Variablen i – vom Wert von int[0] bis 1. Wenn dieser Wert größer oder gleich eins kleiner als die Länge der Liste ist, haben wir eine Lösung und ich gebe Züge zurück. Für andere Werte rufe ich die Funktion erneut auf, entferne die i ersten Werte und erhöhe die Bewegungen um eins.
Ich habe eine min_moves-Variable, um sicherzustellen, dass wir die Mindestanzahl an Zügen für alle Iterationen zurückgeben.
def word_break(s: str, words: list) -> bool: pattern = '^(' + '|'.join(map(re.escape, words)) + ')+$' return True if re.search(pattern, s) else False
Was war mein Fehler, fragen Sie? Ich habe nach i >= len(ints) statt nach i >= len(ints)-1 gesucht.
$ ./ch-1.py weeklychallenge challenge weekly true $ ./ch-1.py perlrakuperl raku perl true $ ./ch-1.py sonsanddaughters sons sand daughters false
Das obige ist der detaillierte Inhalt vonDas Pausenspiel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!