# -*- coding: utf-8 -*-
"""
Created on Sat Feb 21 21:48:18 2015

@author: Roupoil
"""

# Première partie : fonctions sur les tableaux

# Question 1

def estmatrice(t):
    n=len(t[0])
    for i in t[1:]:
        if len(i)!=n:
            return False
    return True
    
# Question 2

def maxligne(t):
    n=len(t[0])
    for i in t[1:]:
        if len(i)>n:
            n=len(i)
    return n

def completion(t):
    u=t[:]
    n=maxligne(t)
    for i in u:
        for j in range(n-len(i)):
            i.append(0)
    return u
    
# Question 3
    
def occurrences(t,x):
    n=0
    for i in t:
        for j in i:
            if j==x:
                n=n+1
    return n
    
def listeoccurrences(t,x):
    l=[]
    for i in range(len(t)):
        for j in range(len(t[i])):
            if t[i][j]==x:
                l.append([i,j])
    return l
    
# Question 4

def nbreelements(t):
    n=0
    for i in t:
        n=n+len(i)
    return n
    
# Question 5

def moyenne(t):
    n=0
    m=0.0
    for i in t:
        n=n+len(i)
        for j in i:
            m=m+j
    return m/n
    

# Deuxième partie : démineur

# Question 1

from random import sample

def grille(n,p,k):
    l=[[i,j] for i in range(n) for j in range(p)]
    t=[[0 for j in range(p)] for i in range(n)]
    r=sample(l,k)
    for i in r :
        t[i[0]][i[1]]=9
    return t
    
# Question 2
    
def voisins(i,j,n,p):
    if [i,j]==[0,0]:
        return [[0,1],[1,0],[1,1]]
    elif [i,j]==[0,p-1]:
        return [[0,p-2],[1,p-2],[1,p-1]]
    elif [i,j]==[n-1,0]:
        return [[n-2,0],[n-2,1],[n-1,1]]
    elif [i,j]==[n-1,p-1]:
        return  [[n-2,p-2],[n-2,p-1],[n-1,p-2]]
    elif i==0:
        return [[0,j-1],[0,j+1],[1,j-1],[1,j],[1,j+1]]
    elif i==n-1:
        return [[n-2,j-1],[n-2,j],[n-2,j+1],[n-1,j-1],[n-1,j+1]]
    elif j==0:
        return [[i-1,0],[i-1,1],[i,1],[i+1,0],[i+1,1]]
    elif j==p-1:
        return [[i-1,p-2],[i-1,p-1],[i,p-2],[i+1,p-2],[i+1,p-1]]
    else:
        return [[i-1,j-1],[i-1,j],[i-1,j+1],[i,j-1],[i,j+1],[i+1,j-1],[i+1,j],[i+1,j+1]]

def voisinsmines(t,i,j):
    n=len(t)
    p=len(t[0])
    z=0
    for a in voisins(i,j,n,p):
        if t[a[0]][a[1]]==9:
            z=z+1
    return z
    
# Question 3
    
def remplissage(t):
    u=[[voisinsmines(t,i,j) for j in range(len(t[0]))] for i in range(len(t))]
    return u

# Question 4

def demineur1():
    n=input('Choisissez le nombre de lignes ')
    p=input('Choisissez le nombre de colonnes ')
    k=input('Choisissez le nombre de mines ')
    t=grille(n,p,k)
    u=remplissage(t)
    g=[[9 for j in range(p)] for i in range(n)]
    m=n*p-k
    x=1
    while m>0 and x==1:
        print('\n \n \n')
        for i in g:
            print(i)
        l=input('Choisissez une ligne où déminer ')-1
        c=input('Choisissez une colonne où déminer ')-1
        if g[l][c]==9:
            if t[l][c]==9:
                x=0
            else:
                g[l][c]=u[l][c]
                m=m-1
    if x==0:
        return ('Vous avez explosé ! ')
    else:
        return ('Bravo, vous avez gagné ! ')
                
# Question 5

def demineur2():
    n=input('Choisissez le nombre de lignes ')
    p=input('Choisissez le nombre de colonnes ')
    k=input('Choisissez le nombre de mines ')
    t=grille(n,p,k)
    u=remplissage(t)
    g=[[9 for j in range(p)] for i in range(n)]
    m=n*p-k
    x=1
    while m>0 and x==1:
        print('\n \n \n')
        for i in g:
            print(i)
        z=input('Souhaitez-vous placer un drapeau (taper 1) ou déminer (taper 2) ? ')
        if z==2:
            l=input('Choisissez une ligne où déminer ')-1
            c=input('Choisissez une colonne où déminer ')-1
            if g[l][c]==9:
                if t[l][c]==9:
                    x=0
                else:
                    g[l][c]=u[l][c]
                    m=m-1
        elif z==1:
            l=input('Choisissez une ligne où poser le drapeau ')-1
            c=input('Choisissez une colonne où poser le drapeau ')-1
            g[l][c]='M'
    if x==0:
        return ('Vous avez explosé ! ')
    else:
        return ('Bravo, vous avez gagné ! ')
        
# Question 6
        
def nettoyage(g,u):
    n=len(g)
    p=len(g[0])
    a=1
    while a!=0:
        a=0
        for i in range(len(g)):
            for j in range(len(g[i])):
                if g[i][j]==0:
                    for k in voisins(i,j,n,p):
                        if g[k[0]][k[1]]!=u[k[0]][k[1]]:
                            a=1
                            g[k[0]][k[1]]=u[k[0]][k[1]]
    return

def demineur3():
    n=input('Choisissez le nombre de lignes ')
    p=input('Choisissez le nombre de colonnes ')
    k=input('Choisissez le nombre de mines ')
    t=grille(n,p,k)
    u=remplissage(t)
    g=[[9 for j in range(p)] for i in range(n)]
    x=1
    while occurrences(g,9)>0 and x==1:
        print('\n \n \n')
        for i in g:
            print(i)
        z=input('Souhaitez-vous placer un drapeau (taper 1) ou déminer (taper 2) ? ')
        if z==2:
            l=input('Choisissez une ligne où déminer ')-1
            c=input('Choisissez une colonne où déminer ')-1
            if g[l][c]==9:
                if t[l][c]==9:
                    x=0
                else:
                    g[l][c]=u[l][c]
        elif z==1:
            l=input('Choisissez une ligne où poser le drapeau ')-1
            c=input('Choisissez une colonne où poser le drapeau ')-1
            g[l][c]='M'
        nettoyage(g,u)
    if x==0:
        return ('Vous avez explosé ! ')
    else:
        return ('Bravo, vous avez gagné ! ')
        

# Troisième partie : jeu de la vie

def voisinsvie(t,i,j):
    n=len(t)
    p=len(t[0])
    z=0
    for a in voisins(i,j,n,p):
        if t[a[0]][a[1]]==1:
            z=z+1
    return z
    
def remplissagevie(t):
    u=[[voisinsvie(t,i,j) for j in range(len(t[0]))] for i in range(len(t))]
    return u

def jeudelavie(t,n):
    l=[]
    m=t[:]
    for i in range(n):
        u=remplissagevie(m)
        for i in range(len(m)):
            for j in range(len(m[0])):
                if u[i][j]<2:
                    m[i][j]=0
                elif u[i][j]>3:
                    m[i][j]=0
                elif u[i][j]==3:
                    m[i][j]=1
        l.append(occurrences(m,1))
    for i in m:
        print (i)
    return l

