from jyquickhelper import add_notebook_menu
add_notebook_menu()

"""
Explanation: Correction de l'interrogation écrite du 26 septembre 2014
End of explanation
"""


def mul2014(n):
    return 1 if n % 2014 == 0 else 0

print(mul2014(2014), mul2014(2015))

"""
Explanation: Enoncé 1
Q1
Ecrire une fonction qui retourne 1 si $n$ est un multiple de 2014.
End of explanation
"""


import math
min ( math.cos(i) for i in range(1,11) )

"""
Explanation: Pour cette question, quelques élèves ont vérifié que n était plus petit que 2014 d'abord. Ce n'est pas vraiment la peine.
Q2
Calculer le minimum des cosinus des entiers de 1 à 10.
End of explanation
"""


list(range(0,10))

"""
Explanation: range(0,10) va de 0 à 10 exclu.
End of explanation
"""


def symetrie(s):
    i=0
    j=len(s)-1
    while i < j :
        if s[i] != s[j] : return False
        i += 1
        j -= 1
    return True

print(symetrie("kayak"), symetrie("kakaks"))

"""
Explanation: Q3
Ecire une fonction qui vérifie qu'une chaîne de caractères est symétrique (ex: kayak).
End of explanation
"""


def contient_A(s):
    return 1 if "A" in s else 0

print(contient_A("e"))

"""
Explanation: Sur cette question, on fait régulièrement deux erreurs lorsqu'on commence à programmer :

Le dernier indice est len(s)-1 et non len(s). Le premier indice est 0.
Il ne sert à rien que i aille de 0 à len(s)-1, aller de 0 à len(s)//2 suffit.

Enoncé 2
Q1
Ecrire une fonction qui retourne 1 si une chaîne de caractères contient un A, 0 sinon.
End of explanation
"""


import math
x = 0.3
sum ( x**(2*i) / math.sin(i) for i in range(1,11) )

"""
Explanation: Utiliser une boucle n'était pas nécessaire, un simple test suffit.
Q2
Calculer $\sum_{i=1}^{10} \frac{x^{2i}}{\sin i}$.
End of explanation
"""


def est_trie(tab):
    for i in range(1,len(tab)):
        if tab[i-1] > tab[i] : return False
    return True

est_trie( [1]),est_trie( [1,2,3]),est_trie( [1,2,3,0])

"""
Explanation: Q3
Ecrire qu'une fonction qui vérifie si un tableau est trié.
End of explanation
"""


def est_trie(tab):
    res = tab.copy()
    res.sort()
    return res == tab

"""
Explanation: Quelques élèves ont écrit quelque chose comme :
End of explanation
"""


def est_trie_nocopy(tab):
    res = tab
    res.sort()
    return res == tab

t = [ 0,1,2 ]
print( est_trie(t), est_trie_nocopy(t) )

t = [ 0,1,2,0 ]
print( est_trie(t), est_trie_nocopy(t) )

"""
Explanation: Bien que ceci soit tout-à-fait correct, le fait de trier une copie du tableau nécessite des calculs inutiles. Le coût d'un tri est en $O(n \ln n)$ alors que tester si le tableau est trié est au pire de $O(n)$ puisqu'il suffit de le parcourir une fois. J'ajoute une dernière remarque : sans copie la fonction est_trie retourne toujours vrai.
End of explanation
"""


t = [0,1,2]
t2 = t
t2[0] = 1000000000

t,t2

"""
Explanation: La raison est l'instruction res = tab crée une autre variable res mais l'instruction n'implique pas la copie de la liste. Elle ne fait que donner un autre nom à la même liste. Ainsi :
End of explanation
"""


