#%% Exo n°1

def nzeros(n):
    return [0]*n

def nzeros1(n):
    W = []
    for _ in range(n):
        W.append(0)
    return W

def lstindice(L,x):
    W = []
    for k in range(len(L)):
        if L[k] == x:
            W.append(k)
    return W

def lstindicebis(L,x):
    return [k for k in range(len(L)) if L[k] == x]

def double(L):
    W = []
    for x in L:
        for _ in range(2):
            W.append(x)
    return W

def double1(L):
    W = []
    for k in range(len(L)):
        W.append(L[k])
        W.append(L[k])
    return W



#%% Exo n°2

def inverse0(L):
    W = []
    while L != []:
        W.append(L[-1])
        L.pop()
    return W

def inverse1(L):
    W = []
    for i in range(len(L)):
        W.append(L[len(L)-1-i])
    return W

def inverse2(L):
    W = []
    for i in range(1,len(L)+1):
        W.append(L[-i])
    return W

def inverse3(L):
    return L[::-1]

#%% Exo n°3

def pos0(L):
    W = []
    for x in L:
        if x >= 0:
            W.append(x)
    return W

def pos1(L):
    W = []
    for k in range(len(L)):
        if L[k] > 0:
            W.append(L[k])
    return W

#%% Exo n°4

from random import randint,choice

def tirageremise(k,n):
    L=[]
    for i in range(k):
        L.append(randint(1,n))
    return L


def urnevide(n): # sans choice
    L=[]
    L1=[i for i in range(1,n+1)]# liste des numéros dans l'urne au départ
    for _ in range(n):
        k=randint(0,len(L1)-1)
        L.append(L1[k])
        L1.pop(k)
    return L

def urnevide1(n): # avec choice
    L=[]
    L1 = [k for k in range(1,n+1)]
    for _ in range(n):
        x = choice(L1)
        L.append(x)
        L1.remove(x)
    return L

#%% Exo n°5

def appartient(t, elem):
    for x in t:
        if x == elem:
            return True # Dès qu'on trouve l'élément, on peut arrêter et répondre True
    return False # Si on a testé tous les éléments du tableau sans succès, on répond False

def estdans(t,elem):
    return elem in t

#%% Exo n°6

def inclus(L1,L2):
    for x in L1:
        if x not in L2:
            return False
    return True

def inclus1(L1,L2):
    "avec la fonction appartient de l'exo 5"
    for x in L1:
        if appartient(L2,x) == False: # ou not appartient(L2,x):
            return False
    return True

#%% Exo n°7

def minitab(l):
    m = l[0]
    for x in l[1:]:
        if x < m:
            m = x
    return m
# on ne connait pas la place du minimum dans la liste

def minitab0(l):
    "avec la fonction min"
    return min(l)



def minitabindice(l):
    m = l[0]
    indice = 0
    for k in range(1,len(l)):
        if l[k] < m:
            m = l[k]
            indice = k
    return m , indice
# renvoie le min et sa première place.

def minitabindice0(l):
    "avec la fonction min"
    mini = min(l)
    indice = 0
    for k in range(1,len(l)):
        if l[k] == mini:
            indice = k
            return mini, indice
# renvoie le min et sa première place, on peut se passer d'indice ici

#%% Exo n°8

def comptage(l,elem):
    T = [x for x in l if x == elem]
    return len(T)

def comptage1(l,elem):
    nb = 0
    for x in l:
        if x == elem:
            nb +=1
    return nb



#%% Exo n°9

def moyenne(l):
    s = 0
    #n = len(l)
    for x in l:
        s += x
    return s/len(l)

def moyenne1(l):
    "avec la fonction sum"
    return sum(l)/len(l)

#%% Exo n°10

def produit(L):
    p=L[0]
    for x in L[1:]:
        p *= x
    return p

def produit1(L):
    p=1
    for x in L:
        p *= x
    return p

def produit2(L):
    p= 1 # ou L[0]
    for k in range(len(L)): # ou for k in range(1,len(L)):
        p *= L[k]
    return p

import numpy as np

def produitV3(L):
    return np.prod(L)


#%% Exo n°11

def nombreZeros(L,i):
    if L[i] == 1:
        return 0
    else:
        nbrezeros = 0
        j = i
        while j < len(L) and L[j] == 0: # j<len(L) à mettre en premier
            #sinon message d'erreurs pour j=len(L)
            nbrezeros += 1
            j +=1
        return nbrezeros

def nombreZerosbis(L,i):
    "la plus propre"
    zeros = 0
    for x in L[i:]:
        if x == 1:
            return zeros
        else:
            zeros += 1
    return zeros

def nombreZerosMax(L):
    maxi = nombreZeros(L,0)
    for i in range(1,len(L)):
        if maxi < nombreZeros(L,i):
            maxi =  nombreZeros(L,i)
    return maxi

#on peut aussi utiliser la fonction max

#%% Exo n°12

def sousmot(mot,chaine):
    lmot, lchaine = len(mot), len(chaine)
    for i in range(lchaine - lmot + 1):
        if chaine[i : i + lmot] == mot:
            return True
    return False

def sousmot1(mot,chaine):
    return mot in chaine








