Mes premiers pas sur Python - acte II

Il y a quelques semaines de cela, je réalisais mes premiers scripts en Python, langage que j'ai toujours voulu apprendre mais pour lequel je manquais de use case concrets, ayant plus l'habitude de Powershell, travaillant sur des environnements Microsoft. Cependant, par curiosité et envie d'apprendre, je planche volontiers à l'occasion sur Python et c'est aujourd'hui pour un besoin purement personnel que j'ai écrit ces deux scripts.

Pour replacer le contexte, je participe à des compétitions de speedrunning de jeux rétro. Un score est calculé en fonction du temps réalisé pour compléter le jeu en question. Récemment, je me suis demandé si il n'était pas intéressant de valoriser les temps d'exécution très rapides en doublant chaque point attribué sous les 2 heures plutôt que d'avoir un traitement linéaire comme actuellement : on part d'une base de 36000 points (1 par seconde, jusqu'à 10 heures) et l'on soustrait un point pour chaque seconde.

Par exemple, pour une partie complétée en 1 heure, 50 minutes et 28 secondes, on a donc un score de 36000 - 6628 (1 x 3600 + 50 x 60 + 28) soit 29372. Avec ce calcul, on a donc 29372 ; mais avec la nouvelle formule, 36000 - 6628 + 572 soit 29944. Les 572 points proviennent des 572 secondes qui séparent le chronomètre des 2 heures.

J'ai donc développé deux scripts Python permettant de faire le calcul. Le premier script demande à l'utilisateur de saisir à la suite les valeurs. Les boucles try et if permettent de faire les contrôles de robustesse nécessaires :

hrCount = input("Hours: ")
mnCount = input("Minutes: ")
seCount = input("Seconds: ")
try:
	hrCount = int(hrCount)
	mnCount = int(mnCount)
	seCount = int(seCount)
except:
	print("Please input integer values as hours, minutes and seconds.")
	quit()
if seCount >= 60:
	print("Seconds value can't be higher than 60.")
	quit()
if mnCount >= 60:
	print("Minutes value can't be higher than 60.")
	quit()
totalSec = hrCount*3600+mnCount*60+seCount
if totalSec > 36000:
	print("Timer can't be higher than 10 hours.")
	quit()
base = 36000 - totalSec
if totalSec < 7200:
	bonus = 7200 - totalSec
else:
	bonus = 0
sc = base + bonus
print(base)
print(bonus)
print(sc)

Le script affiche à la fin le score de base calculé linéairement, le bonus puis le total.

Le deuxième script effectue le même traitement mais avec une approche différente. J'ai voulu alléger un peu le code et les contrôles de robustesse en utilisant le module argparse. Ce module permet d'ajouter des paramètres en ligne de commande au script : ainsi c'est Python lui-même qui va vérifier le type d'entrée de mes arguments (ici, des integer) et permettre d'afficher une aide.

import argparse
parser = argparse.ArgumentParser(description='Counts all seconds under a 2-hour timer twice.')
parser.add_argument('hrCount', metavar='h', type=int, help='Number of hours')
parser.add_argument('mnCount', metavar='m', type=int, help='Number of minutes')
parser.add_argument('seCount', metavar='s', type=int, help='Number of seconds')
args = parser.parse_args()

if args.seCount >= 60:
	print("Seconds value can't be higher than 60.")
	quit()
if args.mnCount >= 60:
	print("Minutes value can't be higher than 60.")
	quit()
totalSec = args.hrCount*3600+args.mnCount*60+args.seCount
if totalSec > 36000:
	print("Timer can't be higher than 10 hours.")
	quit()
base = 36000 - totalSec
if totalSec < 7200:
	bonus = 7200 - totalSec
else:
	bonus = 0
sc = base + bonus
print(base)
print(bonus)
print(sc)

Voici ce que cela donne en exécution. Le paramètre -h est directement intégré et n'a pas à être codé dans le script.

Les deux scripts sont disponibles dans des versions commentées dans l'archive en lien ci-dessous. J'ai utilisé la version 3.9 de Python sous macOS pour les écrire et les utiliser.

Lien pour marque-pages : Permaliens.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.