Jour 22 : Marché aux singes
Dépôt GitHub
Le puzzle d'aujourd'hui était assez agréable car il était assez simple. Une grande partie de ce qu'il fallait faire se trouvait dans les instructions, c'est-à-dire une manipulation d'entiers puis une simple somme (au moins pour la partie 1).
Le code est assez simple, on effectue une boucle 2 000 fois, en stockant à chaque fois le nouveau numéro secret, pour pouvoir les résumer à la fin.
Ok, celui-ci a demandé un peu plus de puissance cérébrale, mais encore une fois, une grande partie de la logique était dans les instructions.
L'une des plus grandes différences est la fonction calc_price_changes(). Cette fonction traite une séquence de nombres et calcule simplement les « changements de prix » pour identifier les modèles.
Plongeons de plus près :
La fonction calc_price_changes :
Traite une liste de « secrets générés ».
Calcule les changements de « prix » (le dernier chiffre de chaque secret).
Identifie des modèles uniques de 4 changements consécutifs.
4.Agrège un score basé sur ces modèles.
Il faut deux arguments :
Une liste de nombres (représentant les secrets générés) ainsi qu'un objet de type dictionnaire (defaultdictcr) pour stocker et regrouper les scores pour des modèles uniques.
Un defaultdict est un outil très utile. Cela fonctionne comme un dictionnaire normal mais avec un avantage clé. S'il ne trouve pas la clé dans le dictionnaire, il se chargera de créer la clé et de lui attribuer la valeur par défaut du type transmis.
for p in range(len(price_change_sequence) - 4 + 1): changes = price_change_sequence[p: p + 4] key = tuple((changes[0][0], changes[1][0], changes[2][0], changes[3][0])) if key not in sequences: sequence_sum[key] += changes[3][1] sequences.add(key)
Le code ci-dessus utilise une fenêtre glissante 4 pour extraire des groupes de 4 tuples consécutifs (changement, prix).
Exemple : Si price_change_sequence est [(1, 5), (2, 7), (-1, 6), (3, 9)], un « morceau » est [(1, 5), (2, 7), (-1, 6), (3, 9)].
Nous extrayons ensuite uniquement les valeurs de changement du 4-tuple, par exemple -2,-1,1 etc. Si le modèle n'est pas déjà dans les séquences, c'est un nouveau modèle, nous pouvons donc ajouter le dernier prix (changements[ 3][1]) à séquence_sum[motif]. Marquez la clé comme traitée en l'ajoutant à l'ensemble des séquences.
À la fin de la fonction :
sequence_sum contient un mappage de modèles uniques (comme nous avons utilisé l'ensemble) à 4 changements avec leurs scores agrégés (basés sur le prix final dans chaque séquence).
Exemple : {(1, 2, -1, 3) : 9, (-2, 0, 1, -1) : 6}.
Disons que nous avons une entrée de
generated_secrets = [45, 46, 50, 53, 58, 61] sequence_sum = defaultdict(int) calc_price_changes(generated_secrets, sequence_sum)
Étapes :
1.Calculer les modifications de prix :
Prix : [5, 6, 0, 3, 8, 1] (derniers chiffres).
Modifications : [(1, 6), (-6, 0), (3, 3), (5, 8), (-7, 1)]
Sortie :
{(1, -6, 3, 5) : 8, (-6, 3, 5, -7) : 1}
Voici comment tout s’est déroulé :
Traitement des entrées : nous avons lu et converti l'entrée en une liste de numéros secrets.
Génération de séquence : pour chaque secret, nous l'avons fait évoluer de manière itérative sur 2 000 générations pour produire une séquence de valeurs dérivées.
Analyse des changements de prix : nous avons calculé les différences entre les prix successifs (derniers chiffres) dans les séquences, identifié des modèles uniques à 4 changements et des scores agrégés pour ces modèles.
Extraction des résultats : Enfin, nous avons déterminé le modèle le plus percutant en trouvant celui avec le score agrégé le plus élevé.
En divisant le problème en étapes claires et modulaires, nous avons traité efficacement les données, suivi les modèles et résolu le puzzle.
Comme toujours, j'espère que cela vous a aidé et que vous avez appris quelque chose de ma solution. N'hésitez pas à nous suivre ou à nous contacter sur Twitter
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!