Bonnes clés

WBOY
WBOYoriginal
2024-08-19 16:34:501073parcourir

Good keys

Défi hebdomadaire 282

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 : Bon entier

Tâche

Vous recevez un entier positif, $int, comportant 3 chiffres ou plus.

Écrivez un script pour renvoyer le bon entier dans l'entier donné ou -1 si aucun n'est trouvé. Un bon entier est composé exactement de trois chiffres consécutifs correspondants.

Ma solution

Au départ, je pensais que cette tâche pouvait être effectuée avec un modèle d'expression régulière, mais il semble que j'avais tort. Je vais regarder d'autres membres de TPW pour voir s'ils peuvent le faire de cette façon.

Pour cette tâche, j'ai une variable pos qui itère de 0 à trois de moins que la longueur de la chaîne. Je vérifie ensuite quatre choses :

  1. Le chiffre à la position actuelle est le même que celui à la position suivante.
  2. Le chiffre à la position actuelle est le même que celui de la deuxième position suivante.
  3. La position est 0 (ce qui signifie qu'il n'y a aucun chiffre avant le chiffre actuel) ou le chiffre précédent n'est pas le même que le chiffre actuel.
  4. La position est inférieure de 3 à la longueur (ce qui signifie qu'il n'y a pas de chiffre après les trois chiffres actuels) ou le troisième chiffre suivant n'est pas le même que le chiffre actuel.

Si tout cela est vrai, je renvoie ces trois chiffres. Cela se fait sous forme de chaîne en Python, car « 000 » n'est pas un véritable entier. Si l'itérateur est épuisé, je renvoie -1.

def good_integer(n: int) -> str:
    value = str(n)
    length = len(value)

    for pos in range(length-2):
        if (
            value[pos] == value[pos+1]
            and value[pos] == value[pos+2]
            and (pos == 0 or value[pos] != value[pos-1])
            and (pos + 3 == length or value[pos] != value[pos+3])
        ):
            return value[pos:pos+3]

    return '-1'

Exemples

$ ./ch-1.py 12344456
444

$ ./ch-1.py 1233334
-1

$ ./ch-1.py 10020003
000

Tâche 2 : Changer les clés

Tâche

Vous recevez une chaîne alphabétique, $str, telle que saisie par l'utilisateur.

Écrivez un script pour trouver le nombre de fois que l'utilisateur a dû changer la clé pour taper la chaîne donnée. Le changement de clé se définit comme l'utilisation d'une clé différente de la dernière clé utilisée. Les touches "shift" et "caps lock" ne seront pas prises en compte.

Ma solution

Fait amusant. Lorsque je reçois un nouveau clavier (toutes les quelques années), je vois combien de temps il faut avant d'arracher la touche de verrouillage des majuscules. La plupart des claviers ne durent pas une journée !

Pour cette tâche, je convertis la chaîne en minuscules et commence avec deux variables. La valeur current_key est la touche actuellement enfoncée et est initialisée avec la première lettre de notre entrée. La variable changes correspond au nombre de modifications clés que j'apporte et commence par 0.

Je parcoure ensuite chaque lettre de la chaîne d'entrée. Si cette lettre est différente de current_key, je la mets à jour avec la nouvelle lettre et incrémente les modifications de 1.

def key_changes(s: str) -> int:
    s = s.lower()
    current_key = s[0]
    changes = 0

    for letter in s:
        if letter != current_key:
            current_key = letter
            changes += 1

    return changes

Exemples

$ ./ch-2.py pPeERrLl
3

$ ./ch-2.py rRr
0

$ ./ch-2.py GoO
1

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!

Déclaration:
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