﻿#! /usr/bin/env python3
# -*- coding: utf-8 -*-


""" Règles :

    # on fabrique toutes les fonctions au début, sans déclarer de variables
    # en général, une fonction doit soit :
        # renvoyer (return) un résultat, à partir d'éventuelles variables passées en arguments
        # modifier (pas de return) des variables passées en argument
        # rarement afficher, sauf pendant la production du code pour vérifier les résultats
    # le programme principal est à la fin et contient :
        # toutes les déclarations des variables (les variables globales)
        # l'utilisation des fonctions précédentes
        # tous les affichages nécessaires à la vérification du bon fonctionnement des fonctions
"""


""" conversion d'une chaîne de caractères avec des majuscules uniquement en début de chaque mots """
def capitales(phrase : str) -> str:
    # la variable phrase donnée en argument doit être une chaîne de caractères, et non vide, sinon le programme s'arrête
    assert isinstance(phrase, str) and len(phrase)
    # voici la première lettre, en majuscule, de la nouvelle phrase, la variable capitales
    capitales = phrase[0].upper()
    # on parcourt donc la phrase donnée en argument de son deuxième caractère à la fin
    for k in range(1, len(phrase)):
        # si le dernier caractère de la nouvelle phrase, non vide, est un espace
        if capitales[-1] == " ":
            # on ajoute la lettre courante en majuscule
            capitales = capitales + phrase[k].upper()
        else:
            # sinon on l'ajoute en minuscule
            capitales = capitales + phrase[k].lower()

    return capitales


""" fonction qui détermine si un mot est un palindrome """
def palindrome(mot : str) -> bool:
    # la variable mot passée en argument de la fonction palindrome doit être une chaîne de caractères
    assert isinstance(mot, str)
    # on utilise une nouvelle variable mot en minuscules par sécurité
    mot = mot.lower()
    # on parcourt la moitié des indices de mot
    for k in range(len(mot) // 2):
        # et on regarde si la k-ième lettre de mot en partant du début est différente de la k-ième en partant de la fin
        if mot[k] != mot[len(mot) - k -1]:

            return False

    return True


""" fonction qui inverse uniquement l'ordre des mots d'une phrase """
def reverse(phrase : str) -> str:
    assert isinstance(phrase, str)
    # initialisation des futurs mots à ajouter
    mot = ""
    # initialisation de la phrase inverse à fabriquer
    phrase_inverse = ""
    # parcourt de tous les caractères de la variable phrase de départ passée en argument
    for lettre in phrase:
        # si l'on a bien une lettre, on continue à fabriquer le futur mot
        if lettre != " ":
            mot = mot + lettre
        else:
            # sinon, on ajoute le mot puis un espace devant la phrase inverse
            phrase_inverse = " " + mot + phrase_inverse
            # il faut vider le mot après s'en être servi, pour préparer le mot suivant
            mot = ""
    # le dernier mot construit n'étant pas encore ajouté, car il faudrait un espace à la fin de phrase, on le fait ici
    phrase_inverse = mot + phrase_inverse

    return phrase_inverse


# programme principal
ma_phrase = "La vIe esT UN lONg FlEuVe tRANquilLe."
print(capitales(ma_phrase))
mon_mot = "** Kayak **"
print(palindrome(mon_mot))
print(reverse(ma_phrase))
