69 lines
1.5 KiB
Python
69 lines
1.5 KiB
Python
from enum import Enum
|
|
from dataclasses import dataclass
|
|
|
|
class Etage(Enum):
|
|
A = 0
|
|
B = 1
|
|
C = 2
|
|
|
|
@dataclass
|
|
class Etat:
|
|
ascenseur: Etage = Etage.A
|
|
bouton_A: bool = False
|
|
bouton_B: bool = False
|
|
bouton_C: bool = False
|
|
|
|
def clone(self): return Etat(ascenseur=self.ascenseur, bouton_A=self.bouton_A, bouton_B=self.bouton_B, bouton_C=self.bouton_C)
|
|
|
|
def transition(etat: Etat, bouton_A: bool, bouton_B: bool, bouton_C: bool):
|
|
if bouton_A: etat.bouton_A = True
|
|
if bouton_B: etat.bouton_B = True
|
|
if bouton_C: etat.bouton_C = True
|
|
|
|
if etat.bouton_A:
|
|
ascenseur = Etage.A
|
|
etat.bouton_A = False
|
|
|
|
elif etat.bouton_B:
|
|
ascenseur = Etage.B
|
|
etat.bouton_B = False
|
|
|
|
elif etat.bouton_C:
|
|
ascenseur = Etage.C
|
|
etat.bouton_C = False
|
|
|
|
return etat
|
|
|
|
def tout_bool():
|
|
yield False
|
|
yield True
|
|
|
|
def tout_etage():
|
|
yield Etage.A
|
|
yield Etage.B
|
|
yield Etage.C
|
|
|
|
def tout_etat():
|
|
for etage in tout_etage():
|
|
for bouton_A in tout_bool():
|
|
for bouton_B in tout_bool():
|
|
for bouton_C in tout_bool():
|
|
yield Etat(ascenseur=etage, bouton_A=bouton_A, bouton_B=bouton_B, bouton_C=bouton_C)
|
|
|
|
def tout_entree():
|
|
for bouton_A in tout_bool():
|
|
for bouton_B in tout_bool():
|
|
for bouton_C in tout_bool():
|
|
yield (bouton_A, bouton_B, bouton_C)
|
|
|
|
set_ = set()
|
|
for etat in tout_etat():
|
|
transition_map = {}
|
|
for entree in tout_entree():
|
|
res = transition(etat.clone(), *entree)
|
|
if str(res) not in transition_map: transition_map[str(res)] = []
|
|
set_.add(str(etat) + " + " + str(entree) + "\n=> " + str(transition(etat, *entree)))
|
|
|
|
|
|
for line in set_:
|
|
print(line + "\n")
|