"""
TP final -- Bibliothèque de conversion de bases
NSI Première -- Séquence 3 : Les fonctions

Fichier de départ : reprend les signatures et les docstrings (spécification)
de chaque fonction demandée dans le sujet. Complétez le corps de chaque
fonction là où c'est indiqué "A COMPLETER", exercice par exercice.

Rappel des contraintes du sujet :
  - pas de listes, pas d'indexation de chaîne (chaine[i]) -- uniquement des
    boucles for/while et des chaînes construites avec + ;
  - toutes les fonctions de conversion prennent une chaîne de caractères en
    entrée et renvoient une chaîne de caractères en sortie (même pour un
    nombre écrit en base 10).

A la fin (exercice 14), enregistrez (ou copiez) ce fichier sous le nom
conversions.py : ce sera votre bibliothèque, prête à être importée.
"""

# ============================================================
#  PARTIE A -- DECIMAL ET BINAIRE : L'ALLER-RETOUR
# ============================================================

# ----- Exercice 1 : decimal_vers_binaire -----

def decimal_vers_binaire(chaine_dec):
    """
    Précondition : chaine_dec est une chaîne représentant un entier
    naturel en écriture décimale (par exemple "57").
    Renvoie l'écriture binaire de ce nombre, sous forme de chaîne de
    caractères ("0" et "1" uniquement).
    """
    pass  # <- A COMPLETER


# ----- Exercice 2 : jeu de tests -----
# A COMPLETER : écrivez ici vos assert pour decimal_vers_binaire
# (au moins 3 cas, dont chaine_dec = "0")


# ----- Exercice 3 : trace à la main -----
# Pas de code ici -- complétez le tableau de trace sur votre feuille.


# ----- Exercice 4 : binaire_vers_decimal -----

def binaire_vers_decimal(chaine_bin):
    """
    Précondition : chaine_bin est une chaîne de "0"/"1".
    Renvoie la valeur décimale de ce nombre, sous forme de chaîne de
    caractères.
    """
    pass  # <- A COMPLETER


# ----- Exercice 5 : jeu de tests -----
# A COMPLETER : vos assert pour binaire_vers_decimal
# (au moins 2 cas, dont "0", et un aller-retour avec l'exercice 1)


# ============================================================
#  PARTIE B -- BINAIRE ET HEXADECIMAL : L'ALLER-RETOUR
# ============================================================

# ----- Exercice 6 : chiffre_vers_symbole / symbole_vers_chiffre -----

def chiffre_vers_symbole(chiffre):
    """
    Précondition : chiffre est un entier compris entre 0 et 15.
    Renvoie le symbole hexadécimal correspondant ("0".."9", "A".."F").
    """
    pass  # <- A COMPLETER


def symbole_vers_chiffre(caractere):
    """
    Précondition : caractere est un symbole hexadécimal ("0".."9", "A".."F").
    Renvoie l'entier (0 à 15) correspondant.
    """
    pass  # <- A COMPLETER


# ----- Exercice 7 : valeur_groupe -----

def valeur_groupe(groupe):
    """
    Précondition : groupe est une chaîne de 4 caractères "0"/"1".
    Renvoie la valeur décimale (entre 0 et 15) de ce paquet de bits.
    """
    pass  # <- A COMPLETER


# ----- Exercice 8 : code à trous -- binaire_vers_hexa -----

def binaire_vers_hexa(chaine_bin):
    """
    Précondition : chaine_bin est une chaîne de "0"/"1".
    Renvoie l'écriture hexadécimale du même nombre, sous forme de chaîne.
    """
    while len(chaine_bin) % 4 != 0:
        chaine_bin = "0" + chaine_bin

    resultat = ""
    groupe = ""
    for bit in chaine_bin:
        groupe = groupe + bit
        if len(groupe) == 4:
            resultat = resultat + ...  # <- A COMPLETER (1)
            groupe = ...  # <- A COMPLETER (2)
    return resultat


# ----- Exercice 9 : chiffre_vers_binaire4 -----

def chiffre_vers_binaire4(chiffre):
    """
    Précondition : chiffre est un entier compris entre 0 et 15.
    Renvoie l'écriture binaire de chiffre sur exactement 4 bits (avec des
    "0" en tête si besoin), sous forme de chaîne.
    """
    pass  # <- A COMPLETER


# ----- Exercice 10 : hexa_vers_binaire -----
# Fonction utilitaire fournie (ne pas modifier) : retire les "0" inutiles
# au début d'une chaîne binaire.

def enlever_zeros_inutiles(chaine):
    """
    Renvoie chaine privée de ses "0" de tête (mais renvoie "0" si chaine
    ne contient que des "0").
    """
    resultat = ""
    a_commence = False
    for caractere in chaine:
        if caractere == "1":
            a_commence = True
        if a_commence:
            resultat = resultat + caractere
    if resultat == "":
        resultat = "0"
    return resultat


def hexa_vers_binaire(chaine_hexa):
    """
    Précondition : chaine_hexa est une chaîne hexadécimale ("0".."9",
    "A".."F").
    Renvoie l'écriture binaire du même nombre, sous forme de chaîne.
    """
    pass  # <- A COMPLETER


# ----- Exercice 11 : jeu de tests -----
# A COMPLETER : vos assert pour valeur_groupe, binaire_vers_hexa,
# chiffre_vers_binaire4 et hexa_vers_binaire (au moins 2 cas par
# fonction, dont "0")


# ============================================================
#  PARTIE C -- COMBINER POUR HEXADECIMAL ET DECIMAL
# ============================================================

# ----- Exercice 12 : decimal_vers_hexa / hexa_vers_decimal -----

def decimal_vers_hexa(chaine_dec):
    """
    Précondition : chaine_dec est une chaîne représentant un entier
    naturel en écriture décimale.
    Renvoie l'écriture hexadécimale de ce nombre, sous forme de chaîne.
    """
    pass  # <- A COMPLETER


def hexa_vers_decimal(chaine_hexa):
    """
    Précondition : chaine_hexa est une chaîne hexadécimale.
    Renvoie la valeur décimale de ce nombre, sous forme de chaîne.
    """
    pass  # <- A COMPLETER


# ----- Exercice 13 : jeu de tests complet -----
# A COMPLETER : vos assert pour les six fonctions de la bibliothèque
# (au moins un cas par fonction, dont "0", et au moins un aller-retour)


# ============================================================
#  EXERCICE 14 -- EN FAIRE UNE VRAIE BIBLIOTHEQUE
# ============================================================
# Une fois toutes les fonctions ci-dessus terminées et testées :
#   1. Enregistrez (ou copiez) ce fichier sous le nom conversions.py.
#   2. Créez un NOUVEAU fichier, par exemple programme_principal.py,
#      dans le même dossier, et utilisez-y :
#
#          import conversions
#          print(conversions.decimal_vers_hexa(...))
#
#      pour convertir trois nombres de votre choix.