J'ai jeté un coup d'œil à l'entrée du puzzle et j'ai été très intimidé.
Ensuite, j'ai lu ce que je devais faire pour la première partie et j'ai été temporairement mis à l'aise :
Je peux utiliser une simple expression régulière pour faire ça !
J'ai dû me rappeler d'échapper aux parenthèses, puis j'ai obtenu cette regex fonctionnelle :
/mul\((\d*),(\d*)\)/g
Maintenant, je dois faire l'extraction et les calculs appropriés pour chaque match
Voici le code de travail complet :
let total = [...input.matchAll(/mul\((\d*),(\d*)\)/g)].reduce( (total, match) => { total += match .slice(1, 3) .map(Number) .reduce((a, b) => a * b); return total; }, 0 );
Il génère la réponse correcte pour l'exemple d'entrée.
Essayer ma saisie de puzzle génère...
La bonne réponse !!!
Respiration profonde...........
............pour la partie 2
Je pensais que puisque l'entrée est pleine de mots différents, cela allait ajouter toutes sortes de nouvelles règles à prendre en compte.
Heureusement, juste deux nouveaux mots qui font office de début et de fin pour les déclarations mul valides.
Cela ressemble maintenant à un exercice consistant à isoler chaque séquence d'instructions valides en indexant chaque do() et don't() et en recherchant les bonnes parties pour les instructions mul à analyser.
Je souhaite utiliser regex pour faire correspondre toutes les occurrences de do() et don't() :
/don't\(\)|do\(\)/g
Avec cela, je devrais avoir des points de contrôle alternés le long du chemin de la chaîne d'entrée.
Si c'est le cas, je peux extraire des sous-chaînes entre un point de contrôle do() et don't(), et vérifier muls.
Permettez-moi de confirmer à la fois l'exemple et les entrées complètes.
Voici mon algorithme pour isoler le drapeau et son index :
let flags = [...input.matchAll(/don't\(\)|do\(\)/g)].map((el) => { return [el[0], el.index]; });
Confirmé :
Cela est devenu un peu plus compliqué.
Depuis que les choses sont activées, je dois récupérer de l'index 0 jusqu'au premier don't(). Donc, je dois trouver son index. Et vérifiez cette sous-chaîne.
À partir de là, je peux ignorer toutes les choses à ne pas faire () suivantes et rechercher la prochaine tâche à faire().
Avec cela comme nouvel index de départ, je dois trouver le prochain don't(). C'est mon nouveau point final. Vérifiez cette sous-chaîne.
Et répétez : recherchez le prochain do(), recherchez le suivant ne pas(), vérifiez la sous-chaîne.
Cela ressemble à une boucle while.
J'en saurai plus lorsque j'écrirai mon algorithme.
Beaucoup de conditions pour gérer l'ordre d'occurrence à ne pas faire sans motif :
/mul\((\d*),(\d*)\)/g
À ma joyeuse surprise, il génère la bonne réponse pour l'exemple d'entrée.
Que va-t-il générer après avoir traité ma saisie de puzzle ?
...
La bonne réponse !!!
Avant de vérifier, cependant, j'ai ajouté une instruction de journalisation de la console pour confirmer chaque index de début et de fin pour la sous-chaîne à vérifier.
Je les ai comparés à l'ordre des drapeaux dans le tableau.
Tout semblait bien, alors j'ai soumis.
Et j'ai obtenu la bonne réponse !
Quelle sensation délicieuse et enrichissante !
Un autre premier jour. Encore deux étoiles d'or durement gagnées.
Au jour 4 !
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!