Le jeu de pause

Mary-Kate Olsen
Libérer: 2024-11-20 04:39:01
original
825 Les gens l'ont consulté

The Break Game

Défi hebdomadaire 295

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

Tâche 1 : Saut de mot

Tâche

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.

Ma solution

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
Copier après la connexion
Copier après la connexion

Exemples

$ ./ch-1.py weeklychallenge challenge weekly
true

$ ./ch-1.py perlrakuperl raku perl
true

$ ./ch-1.py sonsanddaughters sons sand daughters
false
Copier après la connexion
Copier après la connexion

Tâche 2 : Jeu de saut

Tâche

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.

Ma solution

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
Copier après la connexion
Copier après la connexion

Quel était mon bug, demandez-vous ? Je vérifiais i >= len(ints) au lieu de i >= len(ints)-1.

Exemples

$ ./ch-1.py weeklychallenge challenge weekly
true

$ ./ch-1.py perlrakuperl raku perl
true

$ ./ch-1.py sonsanddaughters sons sand daughters
false
Copier après la connexion
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal