Parcours
/
Python
Python
/
Exercices
/
Atténuation de la fusion
Atténuation de la fusion

Atténuation de la fusion

Exercice d'apprentissage

Introduction

En Python, les instructions if, elif (une contraction de « else » et « if ») et else servent à contrôler le flux d'exécution et à prendre des décisions dans un programme. Contrairement à de nombreux autres langages de programmation, les versions 3.9 et antérieures de Python n'offrent pas d'instruction switch formelle, et utilisent à la place plusieurs instructions elif pour remplir un rôle similaire.

Python 3.10 introduit une variante de l'instruction switch, appelée structural pattern matching, qui sera traitée séparément dans un autre concept.

Les instructions conditionnelles utilisent des expressions qui doivent être évaluées à True ou False, soit en renvoyant directement un type bool, soit en étant évaluées comme « truthy » ou « falsy »truth value testing.

x = 10
y = 5

# The comparison '>' returns the bool 'True',
# so the statement is printed.
if x > y:
    print("x is greater than y")
...
>>> x is greater than y

Associé à un if, un bloc else facultatif s'exécute quand la condition du if d'origine est évaluée à False :

x = 5
y = 10

# The comparison '>' here returns the bool 'False',
# so the 'else' block is executed instead of the 'if' block.
if x > y:
    print("x is greater than y")
else:
    print("y is greater than x")
...
>>> y is greater than x

elif permet d'enchaîner plusieurs évaluations ou branches.

x = 5
y = 10
z = 20

# The 'elif' statement allows for the checking of more conditions.
if x > y:
    print("x is greater than y and z")
elif y > z:
    print("y is greater than x and z")
else:
    print("z is greater than x and y")
...
>>> z is greater than x and y

Les opérations booléennes et les comparaisons peuvent être combinées avec des instructions conditionnelles pour des tests plus complexes :

>>> def classic_fizzbuzz(number):
        if number % 3 == 0 and number % 5 == 0:
            say = 'FizzBuzz!'
        elif number % 5 == 0:
            say = 'Buzz!'
        elif number % 3 == 0:
            say = 'Fizz!'
        else:
            say = str(number)
        
        return say

>>> classic_fizzbuzz(15)
'FizzBuzz!'

>>> classic_fizzbuzz(13)
'13'

Instructions

Dans cet exercice, on va développer un système de contrôle simple pour un réacteur nucléaire.

Pour qu'un réacteur produise de la puissance, il doit se trouver dans un état de criticité. Si le réacteur se trouve dans un état inférieur à la criticité, il peut s'endommager. Si l'état du réacteur dépasse la criticité, il peut se surcharger et provoquer une fusion du cœur. On veut réduire les risques de fusion du cœur et gérer correctement l'état du réacteur.

Les trois tâches suivantes consistent toutes à écrire du code pour maintenir le réacteur dans un état idéal.

1. Vérifie la criticité

La première chose que doit faire un système de contrôle est de vérifier si le réacteur est équilibré en criticité. On dit d'un réacteur qu'il est équilibré en criticité s'il remplit les conditions suivantes :

  • La température est inférieure à 800 K.
  • Le nombre de neutrons émis par seconde est supérieur à 500.
  • Le produit de la température et des neutrons émis par seconde est inférieur à 500000.

Implémente la fonction is_criticality_balanced() qui prend en paramètres temperature, mesurée en kelvin, et neutrons_emitted, et qui renvoie True si les conditions de criticité sont remplies, False sinon.

>>> is_criticality_balanced(750, 600)
True

2. Détermine la plage de puissance de sortie

Une fois que le réacteur a commencé à produire de la puissance, il faut déterminer son rendement. Le rendement peut être réparti en 4 plages :

  1. green -> un rendement de 80 % ou plus,
  2. orange -> un rendement inférieur à 80 % mais d'au moins 60 %,
  3. red -> un rendement inférieur à 60 %, mais toujours d'au moins 30 %,
  4. black -> un rendement inférieur à 30 %.

La valeur en pourcentage peut se calculer ainsi : (generated_power/theoretical_max_power)*100, où generated_power = voltage * current. Note que cette valeur en pourcentage n'est généralement pas un nombre entier, donc fais bien attention à utiliser correctement les comparaisons < et <=.

Implémente la fonction reactor_efficiency(<voltage>, <current>, <theoretical_max_power>), qui prend trois paramètres : voltage, current et theoretical_max_power. Cette fonction doit renvoyer la plage de rendement du réacteur : 'green', 'orange', 'red' ou 'black'.

>>> reactor_efficiency(200,50,15000)
'orange'

3. Mécanisme à sécurité intégrée

Ta dernière tâche consiste à créer un mécanisme à sécurité intégrée pour éviter la surcharge et la fusion du cœur. Ce mécanisme déterminera si le réacteur se situe en dessous, au niveau ou au-dessus du seuil de criticité idéal. On peut alors augmenter, diminuer ou arrêter la criticité en insérant (ou en retirant) des barres de contrôle dans le réacteur.

Implémente la fonction fail_safe(), qui prend 3 paramètres : temperature, mesurée en kelvin, neutrons_produced_per_second et threshold, et qui renvoie un code d'état pour le réacteur.

  • Si temperature * neutrons_produced_per_second < 90 % de threshold, renvoie le code d'état 'LOW', ce qui indique que les barres de contrôle doivent être retirées pour produire de la puissance.

  • Si la valeur temperature * neutrons_produced_per_second se situe à moins de 10 % du threshold (soit entre 0 et 10 % en dessous du seuil, exactement au seuil, ou entre 0 et 10 % au-dessus du seuil), le réacteur est en criticité et le code d'état 'NORMAL' doit être renvoyé, ce qui indique que le réacteur est dans des conditions optimales et que les barres de contrôle sont dans une position idéale.

  • Si temperature * neutrons_produced_per_second ne se situe dans aucune des plages indiquées ci-dessus, le réacteur va subir une fusion du cœur et le code d'état 'DANGER' doit être renvoyé pour arrêter immédiatement le réacteur.

>>> fail_safe(temperature=1000, neutrons_produced_per_second=30, threshold=5000)
'DANGER'
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Python Exercism

Prêt à commencer Atténuation de la fusion ?

Inscris-toi sur Exercism pour apprendre et maîtriser Python avec 17 concepts146 exercices, et un vrai mentorat humain, le tout gratuitement.