﻿from lycee import *

def retourne(a):
    s = ""
    for i in range(len(a)):
        s += a[-i-1]
    return s

def retourne_mieux(a):
    return a[::-1]

def conversion_ent(a):
    rep = ""
    while (a > 0):
        rep,a = rep + str(a % 2), a//2
    return retourne(rep)

def conversion_frac(a,n): # a entre 0 inclus et 1 exclu
    rep = "."
    while(len(rep) < n+1 and a > 0):
        rep,a = rep + str(floor(2*a)), 2*a - floor(2*a)
    return rep

def conversion(a,n): # partie avant la virgule (donc int() et non floor(), même si c'est ici identique car on se ramène d'abord à un nombre positif) exacte, puis n chiffres après la virgule
    if a < 0:
        signe = "-"
    else:
        signe = ""
    a = abs(a)
    ent = signe + conversion_ent(int(a))
    frac = conversion_frac(a-int(a),n)
    if len(frac) == 1:
        return ent
    else:
        return ent + frac

def somme_n(n):
    rep = 0
    for i in range(1,n+1):
        rep += i
    return rep

def somme_n(f,n):
    rep = 0
    for i in range(n+1):
        rep += f(i)
    return rep

def table_mul(m,n):
    for i in range(m+1):
        print(i,"fois",n,"font",i*n)

def tables_mul(m,n):
    for i in range(n+1):
        table_mul(m,i)
        if i < n:
            print("")

def tout_pos_1(a): # erreur si non numérique
    rep = True
    for x in a:
        if x < 0:
            rep = False
    return rep

def tout_pos_2(a): # pas de nombre < 0
    for x in a:
        if isinstance(x,int) or isinstance(x,float):
            if x < 0:
                return False
    return True

def tout_pos_3(a): # tous sont des nombres >= 0
    for x in a:
        if isinstance(x,int) or isinstance(x,float):
            if x < 0:
                return False
        else:
            return False
    return True

def somme_chiffres(n):
    s = str(abs(n))
    somme = 0
    for i in s:
        somme += int(i)
    return somme

def somme_chiffres_avec_div(n):
    n = abs(n)
    somme = 0
    while(n > 0):
        somme += n % 10
        n = n // 10
    return somme

def somme_chiffres_alt(n):
    s = str(abs(n))
    somme = 0
    signe = 1
    for i in s:
        somme += signe * int(i)
        signe *= -1
    return somme

def somme_chiffres_alt_avec_div(n):
    n = abs(n)
    somme = 0
    signe = 1
    while(n > 0):
        somme += signe * (n % 10)
        signe *= -1
        n = n // 10
    return somme

def somme_chiffres_fix(n):
    somme = somme_chiffres(n)
    while(somme >= 10):
        somme = somme_chiffres(somme)
    return somme

def div2(n):
    return str(n)[-1] in ['2','4','6','8','0']

def div3(n):
    return somme_chiffres_fix(n) in [0,3,6,9]

# Pour le plaisir et pour donner une caractérisation mathématique :
def div4(n):
    if n < 0:
        n *= -1
    if n < 10:
        return n in [0,4,8]
    else:
        test = 2*int(str(n)[-2])+int(str(n)[-1])
        while (test > 10):
            test = 2*int(str(test)[-2])+int(str(test)[-1])
        return test in [0,4,8]

def div5(n):
    return str(n)[-1] in ['5','0']

def div9(n):
    return somme_chiffres_fix(n) in [0,9]

def div10(n):
    return str(n)[-1] == '0'

def div_11(n):
    somme = somme_chiffres_alt(abs(n))
    while(somme > 10 or somme < -10):
        somme = somme_chiffres_alt(abs(somme))
    return somme == 0

def trois_parmi_cinq (a,b,c,d,e):
    if (isinstance(a,bool) and isinstance(b,bool) and isinstance(c,bool)
            and isinstance(d,bool) and isinstance(e,bool)):
        return a + b + c + d + e == 3
    else:
        raise ValueError("Une valeur au moins n'est pas de type bool")

def exo8():
    tab = [0] * 50
    for i in range(1,51):
        for j in range(len(tab)):
            if (j+1) % i == 0:
                tab[j] = 1 - tab[j]
    return tab

def exo9():
    tab = [0] * 50
    for i in range(1,51):
        for j in range(0,len(tab)):
            if i % (j+1) == 0:
                tab[j] = 1 - tab[j]
    return tab

def verif_exo9():
    tab = [0] * 50
    for j in range(0,len(tab)):
        tab[j] = floor(50/(j+1)) % 2
    return tab
