Celui des mots

DDD
Libérer: 2024-12-30 19:07:10
original
736 Les gens l'ont consulté

The one about words

Défi hebdomadaire 299

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 : Remplacer les mots

Tâche

Vous recevez un tableau de mots et une phrase.

Écrivez un script pour remplacer tous les mots de la phrase donnée qui commencent par l'un des mots du tableau donné.

Ma solution

Pour cette tâche, j'utilise une expression régulière pour effectuer la transformation. Le code complet est

def replace_words(words: list[str], sentence: str) -> str:
    regexp = r"(?<![a-z])(" + "|".join(map(re.escape, words)) + r")([a-z]*(?:'[a-z]+)?)"
    return re.sub(regexp, r'', sentence)
Copier après la connexion
Copier après la connexion

La première parenthèse (?

Pour la saisie depuis la ligne de commande, je prends la dernière valeur comme phrase et tout le reste comme mots.

Exemples

$ ./ch-1.py cat bat rat "the cattle was rattle by the battery"
the cat was rat by the bat

$ ./ch-1.py a b c "aab aac and cac bab"
a a a c b

$ ./ch-1.py man bike "the manager was hit by a biker"
the man was hit by a bike

$ ./ch-1.py can "they can't swim"
they can swim

$ ./ch-1.py row "the quick brown fox"
the quick brown fox
Copier après la connexion
Copier après la connexion

Tâche 2 : Recherche de mots

Tâche

Vous recevez une grille de caractères et une chaîne.

Écrivez un script pour déterminer si la chaîne donnée peut être trouvée dans la grille de caractères donnée. Vous pouvez commencer n'importe où et emprunter n'importe quel chemin orthogonal, mais vous ne pouvez pas réutiliser une cellule de la grille.

Ma solution

Pour cette tâche, je commence par vérifier que toutes les lignes ont le même nombre de colonnes. Je parcours ensuite chaque cellule. Si la lettre de cette cellule est la première lettre du mot, j'appelle la fonction find_match. Si cela renvoie vrai, cette fonction retournera vrai. Si ce n'est pas le cas, je passe à la cellule suivante contenant la lettre de départ. S'il n'en existe pas, je renvoie false.

def word_search(matrix: list[list[str]], word: str) -> bool:
    rows = len(matrix)
    cols = len(matrix[0])

    for row in range(rows):
        if len(matrix[row]) != cols:
            raise ValueError("Row %s has the wrong number of columns", row)

    for row in range(rows):
        for col in range(cols):
            if matrix[row][col] == word[0]:
                if find_match(matrix, word[1:], [[row, col]]):
                    return True

    return False
Copier après la connexion

La fonction find_match est une fonction récursive. Cela prend trois paramètres

  1. La matrice
  2. Les lettres restantes du mot (celles qui n'ont pas été mises en correspondance)
  3. Une liste (arrayref en Perl) des paires [row,col] de cellules que nous avons visitées.

À partir de la dernière position, nous pouvons nous déplacer dans l'une des quatre directions (haut, bas, gauche ou droite). Je vérifie que bouger dans cette direction ne nous met pas hors des limites ou n'est pas une cellule que nous avons déjà utilisée. Si ce n'est pas le cas et que la lettre de cette cellule correspond à la lettre que nous recherchons, j'appelle à nouveau la fonction, en retirant la première lettre du mot variable et en ajoutant la nouvelle position. Si j'arrive à un point où il ne reste plus de lettres, le mot peut être trouvé et je renvoie True.

def replace_words(words: list[str], sentence: str) -> str:
    regexp = r"(?<![a-z])(" + "|".join(map(re.escape, words)) + r")([a-z]*(?:'[a-z]+)?)"
    return re.sub(regexp, r'', sentence)
Copier après la connexion
Copier après la connexion

Exemples

$ ./ch-1.py cat bat rat "the cattle was rattle by the battery"
the cat was rat by the bat

$ ./ch-1.py a b c "aab aac and cac bab"
a a a c b

$ ./ch-1.py man bike "the manager was hit by a biker"
the man was hit by a bike

$ ./ch-1.py can "they can't swim"
they can swim

$ ./ch-1.py row "the quick brown fox"
the quick brown fox
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal