##########################################################
### Le 02/11/2021                                      ###
### Correction DS01: Introduction à la programmation   ###
### 1 SPE NSI4                                         ###
##########################################################


###############################################################################
#                            Exercice 1: (10 points)                          #
###############################################################################

# 1.1. Programmer une instruction qui affiche un texte entré 
# par l'utilisateur depuis le clavier.
# ----------------------------------------------------------

print(input('rentrez un texte, il sera affiché'))
  
      
# 1.2. Ecrire ce que va afficher le programme:
# --------------------------------------------

a = 3        # a = 3
c = 2        # c = 2
a = a + 1    # a = 4
b = a        # b = 4
b = b * 2    # b = 8
c = a ** b   # c = 4 ** 8 = 65536
print(a)     # 4
print(b)     # 8
print(c)     # 65536  (4 puissance 8)

'''
Le programme va afficher:
4
8
65536  (4 puissance 8)
'''


# 1.3. Ecrire ce que va afficher le programme:
# --------------------------------------------

a = 3
c = 2
a = a + 1
b = a
if a < c:
    a = b + 1
elif a == b:
    a = b
else:
    a = b - 1
b = b * 2
c = a ** b
print(a)
print(b)
print(c)

'''
Le programme va afficher:
4
8
65536  (4 puissance 8)
'''


# 1.4. Ecrire un programme qui affiche 100 fois votre nom,
# chaque fois sur une ligne différente.
# ---------------------------------------------------------

for i in range(100):
    print('MatheX')
  
  
# 1.5. Ecrire un programme qui:
#     1. Demande à l’utilisateur un nombre entre 0 et 20
#     2. Si ce nombre est inférieur à 15, lui dit ‘Pas assez’ et revient en 1.
#     3. Si ce nombre est supérieur ou égal à 15, lui dit ‘Bravo’ et se termine
# -----------------------------------------------------------------------------

n = int(input('rentrez un nombre entre 0 et 20: '))
while n < 15:
    print('Pas assez')
    n = int(input('rentrez un nombre entre 0 et 20: '))
print('Bravo')

# ou encore:
n = 0
while n < 15:
    print('Pas assez')
    n = int(input('rentrez un nombre entre 0 et 20: '))
print('Bravo')
    

# 1.6. Programmer une fonction qui prend deux nombres en paramètres
# et renvoie leur somme
# -----------------------------------------------------------------

def somme(a, b):
    return a + b


# 1.7. Ecrire ce que va afficher la programme ci-dessous:
#        a = [ 1 , 2 , 3 , 4 ]
#        b = [ a , a , 1 , 2 ]
#        print( a[1] )
#        print( b[1][3] ) 
# -------------------------------------------------------

a = [ 1 , 2 , 3 , 4 ]
b = [ a , a , 1 , 2 ]
print( a[1] )    # 2 (attention le premier indice est 0)
print( b[1][3] ) # 4 ( a[3] )

'''
Le programme va afficher:
2
4
'''


###############################################################################
#                            Exercice 2: ( 5 points)                          #
###############################################################################

# 2.1. Ecrire un programme qui affiche la table de multiplication de 3:
# ---------------------------------------------------------------------

for i in range(1, 10):
        print(3,'x',i,'=',3*i)


# 2.2. Ecrire un programme qui affiche en lignes les tables
#  de multiplication de 1 à 9:
# ---------------------------------------------------------

for j in range(1,10):
    for i in range(1, 10):
        print(j,'x',i,'=',j*i)

# 2.3. Ecrire un programme qui affiche en tableau les tables
#  de multiplication de 1 à 9:
# ----------------------------------------------------------

for i in range(1,10):
    ligne = ''
    for j in range(1, 10):
        ligne = ligne + str(j) + 'x' + str(i) + '=' + str(j*i) + '  '
    print(ligne) # manque l'alignement des colonnes

# on pourrait utiliser les paramètres et les options d'affichage
# ( end='' , % nombre caractères, ...)


# 2.4. Ecrire une fonction qui prend en paramètres
# un entier n et retourne une liste
# dont chaque élément est le tete d'une ligne de la table de n
# ['3x1=3', '3x2=6', '3x3=9', '3x4=12', '3x5=15','3x6=18', '3x7=21', '3x8=24', '3x9=27']
# -------------------------------------------------------------
        
def tableMultiplication(n):
    table = []
    for i in range (1, 10):
        table.append(str(n) + 'x' + str(i) + '=' + str(n*i))
    return table

print(tableMultiplication(3))


# En option (++): Utiliser cette fonction pour afficher
# en tableau les tables de multiplication
# ------------------------------------------------------

def tablesMultiplication(a, b):
    table = []
    for i in range (a, b+1):
        table.append(tableMultiplication(i))
    return table

def afficheTable(table):
    max_car = 5 # ou le déterminer
    for j in range(len(table[0])):
        ligne = ''
        for i in range(len(table)):
            ligne += table[i][j] + ' '
            if len(table[i][j]) == max_car:
                ligne += ' '
        print(ligne)

afficheTable(tablesMultiplication(1,9))


###############################################################################
#                            Exercice 3: ( 5 points)                          #
###############################################################################



def manche( coup_1, coup_2):
    '''
    compare les coups des deux joueurs ('R', 'P' ou 'C')
    et renvoie:
         0 si égalité  
         1 si coup_1 gagne coup_2
        -1 si coup_2 gagne coup_1
    rappel des règles:  R bat C, P bat R et C bat P
    '''
    # égalité si même coup
    if coup_1 == coup_2:
        return 0
    
    # Pierre(R) gagne contre Ciseaux
    elif coup_1 == 'R':
        if coup_2 == 'C':
            return 1
        else :
            return -1
    
    #  Papier gagne contre Pierre(R)  
    elif coup_1 == 'P':
        if coup_2 == 'R':
            return 1
        else :
            return -1
        
    # Ciseaux gagne contre Papier
    elif coup_1 == 'C':
        if coup_2 == 'P':
            return 1
        else :
            return -1

def coupJoueur(nom_joueur):
    '''
    demande à un joueur son coup (parmi 'R', 'P' ou 'C')
    lui redemande s'il est incorrect
    et le renvoie s'il est correct
    '''
    correct = False
    while correct == False:
        resultat = input(nom_joueur + ': Pierre (R), Papier (P) ou Ciseaux (C) ? ')
        if resultat in ['R', 'P', 'C']:
            correct = True
    return resultat
        
 
def match(n):
    '''
    demande pour chaque manche à chaque joueur son coup (parmi 'R', 'P' ou 'C')
    et renvoie :
          True  si le joueur 1 gagne le match (sur n points)
          False si le joueur 2 gagne le match (sur n points)
    '''
    point_1 = 0
    point_2 = 0
    while point_1 < n and point_2 < n:
        coup_1 = coupJoueur('Joueur 1')
        coup_2 = coupJoueur('Joueur 2')
        resultat = manche( coup_1, coup_2)
        if resultat == 1:
            point_1 += 1
        elif resultat == -1:
            point_2 += 1
        print('joueur 1:', point_1,'joueur 2:', point_2)
    if point_1 >= n:
        return True
    else:
        return False
        
    
win_1 = match(3)
if win_1:
    print('Le joueur 1 a gagné')
else:
    print('Le joueur 2 a gagné')
    

###############################################################################
#                            Fin de la correction                             #
###############################################################################     