#! /usr/bin/python

# 1ra Practica Laboratorio 
# Complementos Matematicos I
# Consigna: Implementar los siguientes metodos

import sys

grafo_adyacencia1 = (["A", "B", "C", "D"], 
                     [[0, 1, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0],])

grafo_adyacencia2 = (["A", "B", "C", "D"], 
                     [[0, 2, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0],])

def leer_grafo_stdin():
    '''
    Lee un grafo desde entrada estandar y devuelve su representacion como lista.
    Ejemplo Entrada: 
        3
        A
        B
        C
        A B
        B C
        C B
    Ejemplo retorno: 
        (['A','B','C'],[('A','B'),('B','C'),('C','B')])
    '''
    pass


def imprime_grafo_lista(grafo):
    '''
    Muestra por pantalla un grafo. El argumento esta en formato de lista.
    '''
    pass


def lista_a_incidencia(grafo_lista):
    '''
    Transforma un grafo representado por listas a su representacion 
    en matriz de incidencia.
    '''
    pass


def incidencia_a_lista(grafo_incidencia):
    '''
    Transforma un grafo representado una matriz de incidencia a su 
    representacion por listas.
    '''
    pass


def imprime_grafo_incidencia(grafo_incidencia):
    '''
    Muestra por pantalla un grafo. 
    El argumento esta en formato de matriz de incidencia.
    '''
    pass


def lista_a_adyacencia(grafo_lista):
    '''
    Transforma un grafo representado por listas a su representacion 
    en matriz de adyacencia.
    '''
    pass


def adyacencia_a_lista(grafo_adyacencia):
    '''
    Transforma un grafo representado una matriz de adyacencia a su 
    representacion por listas.
    '''

    nodos = grafo_adyacencia[0][:]
    ma = grafo_adyacencia[1]
    lista = [(nodos[i], nodos[j])
             for i in range(0, len(nodos)) 
             for j in range(0, len(nodos))
             if ma[i][j]
             ]
    return (nodos, lista)


def adyacencia_a_lista2(grafo_adyacencia):
    '''
    Transforma un grafo representado una matriz de adyacencia a su 
    representacion por listas.
    '''

    nodos = grafo_adyacencia[0][:] # Hace una copia
    ma = grafo_adyacencia[1]
    lista = [[(nodos[i], nodos[j])] * ma[i][j]
             for i in range(0, len(nodos))
             for j in range(0, len(nodos))
             if ma[i][j]
             ]
    
    lista2 = [i for fila in lista for i in fila]
    return (nodos, lista2)


def imprime_grafo_adyacencia(grafo_adyacencia):
    '''
    Muestra por pantalla un grafo. 
    El argumento esta en formato de matriz de adyacencia.
    '''
    pass


def leer_grafo_archivo(file_path):
    '''
    Lee un grafo desde un archivo y devuelve su representacion como lista.
    Ejemplo Entrada: 
        3
        A
        B
        C
        A B
        B C
        C B
    Ejemplo retorno: 
        (['A','B','C'],[('A','B'),('B','C'),('C','B')])
    '''
    pass


def lee_entrada():
    count = 0
    for line in sys.stdin:
        count = count + 1
        print "Linea: [{0}]".format(line)
    print "leidas {0} lineas".format(count)


def lee_entrada2():
    count = 0
    try:
        while (True):
            line = raw_input()
            count = count + 1
            print "Linea: [{0}]".format(line)
    except (EOFError):
        pass
    
    print "leidas {0} lineas".format(count)
   

def lee_archivo(file_path):
    print "leyendo archivo: {0}".format(file_path)
    count = 0
    for line in open(file_path, "r"):
        count = count + 1
        print "Linea: [{0}]".format(line)
    print "leidas {0} lineas".format(count)


def main():
    lee_entrada1()
    # Para leer desde un archivo
#    if (len(sys.argv) < 2):
#        print "ERROR. Argumento (file) faltante"
#        return    
#    lee_archivo(sys.argv[1])
    

if __name__ == "__main__":
    main()
