#-*- coding:latin-1 -*-

"""
Problème 462 - 2 du BV de l'APMEP
On joue 20 fois à pile ou face et on obtient :
00 11 0000 1 0 11 00000 1 00
On regroupe les blocs formés par le même chiffre (comme suggéré graphiquement). 
Ici, il y en a 9. De tels blocs s'appellent des runs en anglais.

Un élève est censé avoir joué 50 fois à pile et face et prétend avoir 
obtenu le résultat suivant :
101 011 010 010 110 001 010 010 101 100 010 101 001 100 101 0100

Soit 36 runs.

La probabilité d'un nombre si élevé de runs est faible et fait douter de 
la réalité des lancers.

Écrire un algorithme qui simule 100 lancers de 50 P ou F et qui 
compte le nombre moyen de runs et imprime ce nombre de runs. 
"""
 
from random import *

def tirage(n) :
    """
    effectue n pile ou face? Stocke le résultat sous forme d'un string
    """
    tirage = ""
    for i in range(0,n) :
        tirage+=str(randrange(0,2))
    return tirage

def tirage2Runs(tirage) :
    """
    transforme un tirage en un tableau de runs. Chaque élément du tableau 
    est une suite de chiffres identiques
    En fait on peut se contenter de faire une boucle qui compte les changements de
    valeurs.
    """
    # création d'un tableau vide
    tab = []
    # il ne faut pas sortir de tirage. Ce compteur permet de s'en assurer
    i = 0
    # initialisation d'une chaine auquel on ajoutera les chiffres identiques
    # On parcourt la chaine tirage, en comparant les éléments. Si, ils sont identiques
    # on concaténe dans chaine, sinon, on stocke le résultat dans le tableau tab
    # et on recommence avec le caractère suivant
    # chaine contient le premier élément de tirage
    chaine=tirage[0]
    # boucle de parcourt
    for i in range(0,len(tirage)-1) :
        # test si positif, on concatène dans chaine les chiffres identiques 
        if  tirage[i] == tirage[i+1] :
            chaine += tirage[i]
         # sinon, on remplit le tableau, puis on remet 
        # chaîne à la valeur suivante
        else : 
            tab.append(chaine)
            chaine=tirage[i+1]
    # impression du tirage et du tableau des runs
    # On parcourt bien toute la liste, mais le dernier run n'est pas rajouté à
    # au tableau
    tab.append(chaine)
    print(tirage)
    print(tab)
    # le nombre de runs est la longueur du tableau tab
    # on retourne le nombre de runs dans ce tirage
    return len(tab)

s=0
for i in range(0,100) :
    s+=tirage2Runs(tirage(50))

    print("Simulatiion de 100 tirages de 50 piles ou faces, et calculs du nombre de runs")
print("Le nombre moyen de runs est : "+str(s/100))


