Chaque semaine, Mohammad S. Anwar envoie The Weekly Challenge, une chance pour nous tous de trouver des solutions à deux tâches hebdomadaires. Mes solutions sont d'abord écrites en Python, puis converties en Perl. C'est une excellente façon pour nous tous de pratiquer le codage.
Défi, Mes solutions
Vous recevez une chaîne, $str, et une liste de mots, @words.
Écrivez un script pour renvoyer vrai ou faux si la chaîne donnée peut être segmentée en une séquence séparée par des espaces d'un ou plusieurs mots de la liste donnée.
Avec TWC, j'ai tendance à réfléchir à la manière dont je résoudrais le problème lors de mon trajet domicile-travail lundi. J'ai pensé à l'exemple d'une chaîne de winwine et aux mots win et wine, ainsi qu'à la chaîne de winewin. Il ne semble pas y avoir de manière déterministe de voir quel mot je dois faire correspondre en premier.
Quelques jours plus tard, j'ai eu l'idée géniale que je résolvais en fait le mauvais problème. Une solution beaucoup plus simple consistait à utiliser des expressions régulières pour voir si un ou plusieurs mots correspondaient à la chaîne s.
Et c'est ce que j'ai écrit. J'utilise re.escape en Python et quotemeta en Perl pour échapper aux méta-caractères spéciaux dans la liste de mots.
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
Vous recevez un tableau d'entiers, @ints.
Écrivez un script pour trouver le nombre minimum de sauts pour atteindre le dernier élément. $ints[$i] représente la longueur maximale d'un saut vers l'avant à partir de l'index $i. Si le dernier élément est inaccessible, retournez -1.
Lorsque j'effectue ces tâches, j'utilise également TDD, ce que je ne fais pas dans mon travail quotidien. Si le test échoue, il s’agit généralement soit d’une erreur évidente, soit de quelque chose d’un peu plus délicat. Cette tâche était une des plus tardives. De nombreux débogages ont suivi.
Je sais que Python et Perl disposent d'excellents outils de débogage intégrés, mais je suis toujours fan de l'utilisation d'une grande quantité d'instructions d'impression.
Pour cette tâche, j'ai une fonction récursive appelée jump_game. Il prend deux paramètres : ints est la liste des entiers (en commençant par la liste complète) et move qui commence à un.
Si le premier entier est 0, je renvoie None (undef en Python) car aucun autre déplacement n'est possible. J'itère ensuite - avec une variable i - de la valeur de int[0] à 1. Si cette valeur est supérieure ou égale à un de moins que la longueur de la liste, nous avons une solution et je renvoie des mouvements. Pour les autres valeurs, j'appelle à nouveau la fonction en supprimant les i premières valeurs et en incrémentant les mouvements de un.
J'ai une variable min_moves pour garantir que nous renvoyons le nombre minimum de mouvements pour toutes les itérations.
def word_break(s: str, words: list) -> bool: pattern = '^(' + '|'.join(map(re.escape, words)) + ')+$' return True if re.search(pattern, s) else False
Quel était mon bug, demandez-vous ? Je vérifiais i >= len(ints) au lieu de i >= len(ints)-1.
$ ./ch-1.py weeklychallenge challenge weekly true $ ./ch-1.py perlrakuperl raku perl true $ ./ch-1.py sonsanddaughters sons sand daughters false
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!