3 résolutions différentes en Python

3 résolutions issues directement du code des participants. 3 approches différentes.

→ Challenge Correction: Greenoïd #4 – Une faille dans le système

Quatrième corrigé des challenges de l’histoire originale Greenoïd, créée à l’occasion de la Battle Dev Thales 2024.

Il était question dans ce challenge de d’abord trier certaines valeurs, puis réaliser des moyennes, puis suivre des formules pour réaliser 2 calculs. Il fallait afficher les valeurs finales calculées dans le bon ordre.

Je vous propose ici les solutions des 3 premiers du classement final de la Battle Dev. Python a été utilisé pour les 3 résolutions. On va donc avoir ici du code « compact », réalisé dans le cadre d’une compétition de programmation, avec sans doute quelques bonnes pratiques laissées de côté… Mais ces 3 résolutions vont permettre de montrer comment un même problème peut être résolu avec des approches algorithmiques différentes !

Résolution Python #1

import math

def rem(l):
    l.remove(min(l))
    l.remove(max(l))

def val(l):
    return math.floor(sum(l) / len(l))

rem(co2)
rem(water)
rem(deforestation)
rem(agricultural)
rem(plastic)
rem(renewable)

P = math.floor(((val(co2) + val(plastic)/ 1000) /2) * (1 - val(renewable)/100))
R = math.floor(((100 - val(water)/10) + (100 - val(deforestation)/100) + val(agricultural) + val(renewable)) / 4)

if (P > R):
    print(R,P,sep="_")
else:
    print(P,R,sep="_")

Un peu d’explications :

  • Le module math, natif en Python, est importé
  • La fonction rem permet de retirer les valeurs extrêmes min et max (rem pour « remove » sans doute).
  • La fonction val calcule la valeur moyenne et est directement utilisée dans le calcul de P et R

Résolution Python #2

import math

def m(l):
    return math.floor((sum(l) - min(l) - max(l)) / (len(l) - 2))

p = math.floor((m(co2) + m(plastic) / 1000) / 2 * (1 - m(renewable) / 100))
r = math.floor(((100 - m(water)/10)+(100-m(deforestation)/100)+m(agricultural)+m(renewable))/4)

print(f"{min(p,r)}_{max(p,r)}")

Un peu d’explications :

  • Le module math, natif en Python, est encore une fois importé
  • Cette fois ci, une seule fonction m qui se charge de faire le calcul de la moyenne, en se basant sur une soustraction des valeurs extrêmes, et non en les retirant préalablement
  • Pas de if dans l’affichage final, mais une recherche du min et du max à la volée.

Résolution Python #3

for k in "co2 water deforestation agricultural plastic renewable".split():
    z = globals()[k]
    z.sort()
    z = z[1:-1]
    globals()[k] = sum(z)//len(z)

P = int((co2 + plastic/1000)/2*(1-renewable/100))
R = int(((100-water/10) + (100-deforestation/100) + agricultural + renewable)/4)
print(*sorted((P,R)), sep="_")

Un peu d’explications :

  • La boucle for k in « co2 … renewable ».split() parcourt les noms des variables sous forme de chaîne (séparés par des espaces) en les convertissant en liste avec .split().
  • globals()[k] permet d’accéder dynamiquement aux variables globales nommées (comme co2, water, etc.) à partir de la chaîne k. Cette technique accède aux variables en utilisant leur nom sous forme de texte.
  • z.sort() trie la liste associée à chaque variable en ordre croissant.
  • z = z[1:-1] élimine la première (min) et la dernière (max) valeur de chaque liste, ce qui retire les extrêmes pour éviter l’influence des valeurs aberrantes.
  • La somme des valeurs restantes est ensuite calculée et divisée par la longueur de la liste, arrondie à l’entier (via //), pour obtenir une moyenne. Cette valeur moyenne est ensuite réassignée à la variable globale correspondante (globals()[k]).
  • Les calculs de P et R sont réalisés, sans fonctions dans les calculs puisque les valeurs ont été calculées dans la boucle
  • print(*sorted((P,R)), sep= » ») affiche les valeurs de P et R triées en ordre croissant, séparées par un underscore (_). L’astérisque (*) décompose le tuple (P,R) pour passer chaque élément séparément à print().

Et voilà comment résoudre un challenge avec 3 approches différentes, et en puisant dans les possibilités du langage !


Qui a codé ce superbe contenu ?

Keep learning

Other content to discover