import doctest

##### Introduction

def factorielle(n):
    """
    Entrée
    ------
      Un entier positif ou nul.

    Sortie
    ------
      La factorielle de l'entier en entrée.

    Erreurs possibles
    -----------------
      Déclenche une erreur si l'entrée est négative.

    >>> factorielle(5)
    120

    >>> factorielle( -7 )
    Traceback (most recent call last):
    ...
    AssertionError
    """
    assert(n >= 0)
    if n < 2:
        return 1
    return n * factorielle(n-1)

factorielle(-2) # à commenter après exécution pour voir l'AssertionError


##### Exercice 1

def complement_chiffre(chiffre:int) :
    """
    Entrée
    ------
      Un chiffre binaire qui vaut 0 ou 1

    Sortie
    ------
      Le complémentaire de chiffre

    Erreurs possibles
    -----------------
      Déclenche une erreur si chiffre n'appartient pas à l'ensemble {0,1}


    """
    pass # à enlever

def complement_ecriture(ecriture:list) :
    """
    Entrée
    ------
      Une écriture binaire sous forme de liste de 0 et 1

    Sortie
    ------
      Le complémentaire de l'écriture binaire


    """
    pass # à enlever



##### Exercice 2

def encode_comp_2(n:int, k:int) :
    """
    Entrée
    ------
      n : un entier relatif à encoder sur k bits
      k : nombre de chiffre de l'encodage

    Sortie
    ------
      L'écriture binaire sous forme de liste d'entier 0 ou 1

    Erreurs possibles
    -----------------
      Déclenche une erreur si k est inférieur ou égal à 2
      Déclenche une erreur si n ne peut pas être encodé sur k bits en complément à 2



    """
    pass

def decode_comp_2(ecriture:list) :
    """
    Entrée
    ------
      ecriture : liste d'entier 0 ou 1

    Sortie
    ------
      La valeur décodée en base 10 de l'écriture binaire

    Erreurs possibles
    -----------------
      Déclenche une erreur si l'écriture binaire a une taille strictement inférieure à 2




    """
    pass







##### Exercice 3

def encode_gray(n:int, k:int) :
    """
    Entrée
    ------
      n : un entier relatif à encoder sur k bits
      k : nombre de chiffre de l'encodage

    Sortie
    ------
      g : l'écriture binaire (list d'entier 0 ou 1) du code de Gray de n sur k chiffres




    """
    pass
    
def decode_gray(g:list) :
    """
    Entrée
    ------
      g : l'écriture binaire (list d'entier 0 ou 1) du code de Gray de n sur k chiffres

    Sortie
    ------
      n : un entier relatif 




    """
    pass




doctest.testmod()
