domino.py 3.82 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
import itertools

def seRepiten(lista):
    hay_repeticion = False              # Asumo que no hay repeticion
    for i in range(len(lista)):         # Para cada elemento de la lista
        repetidas = -1                  # Descontando asimismo al propio elemento
        
        for j in range(len(lista)):     # Quiero compararlo con toda la lista
                                        # Y en caso de estar repetido (sin cotarse)
            if lista[i] == lista[j] or (lista[i][0] == lista[j][1] and lista[i][1] == lista[j][0]):
                repetidas += 1          # reconozco que hay un elemento repetido
                
        if repetidas > 0:               # y en caso de haberlo
            hay_repeticion = True       # Confirmo que hay repeticion
        
    return hay_repeticion               # Devuelvo si es verdad o no que exista repeticion

def seContinuan(lista):
    hay_continuacion = False
    uniones = 0
    if len(lista) > 1:                  # En listas de mas de un par
        for i in range(len(lista)-1):       # Para cada elemento de la lista
            
            if lista[i][1] == lista[i+1][0]:    # En caso de continuarse
                uniones += 1                    # Cuento las uniones de la lista
        
        if len(lista)-1 == uniones: # En caso de que tener todas las listas unidas (maximo uniones = longitud-1)
            hay_continuacion = True
    
    elif len(lista) == 1:
        hay_continuacion = True
            
    return hay_continuacion

def esSecuenciaCorrecta(lista):
    es_correcta = False
    if seContinuan(lista) and not seRepiten(lista):
        es_correcta = True
    
    return es_correcta

def esCiclo(lista):
    hay_ciclo = False
    if lista[0][0] ==  lista[-1][1]:
        hay_ciclo = True
        
    return hay_ciclo

def subListas(lista):
    resultado = []
    for k in range(1, len(lista) + 1):
        for listita in itertools.combinations(lista, k):
            resultado.append(list(listita))
    return resultado

def invertirLista(lista):
    lista_inversa = lista[::-1]
    return lista_inversa

def ordenarMayorAMenor(lista):
    n = len(lista)
    for i in range(n - 1):
        for j in range(0, n - i - 1):
            if lista[j] > lista[j + 1]:
                lista[j], lista[j + 1] = lista[j + 1], lista[j]

def eliminarRepetido(listaDeListas):
    listasUnicas = []               
    for lista in listaDeListas:     # viendo todas las listas posibles
        ordenarMayorAMenor(lista)   # para compararlas y ver que no se repita la combinacion las ordeno
        irrepetible = True
        
        for listaUnica in listasUnicas:
            if lista == listaUnica:     # en caso de dos listas tengan el mismo orden, esto significa que esta repetida
                irrepetible = False
                break
            
        if irrepetible:
            listasUnicas.append(lista)
    
    return listasUnicas

def darCicloN(lista, n):    
    # ciclo comienza y termina en mismo valor, compuesto por n sublistas
    for i in range(len(lista)):                        
        dominoInverso = invertirLista(lista[i]) # invieeto los componentes de la lista para tener en cuenta las dos posibles ofrma del domino
        lista.append(dominoInverso) # las agrego a mi mano
        
    posibilidades = subListas(lista) # veo todas las combinaciones posibles
    posibilidades = eliminarRepetido(posibilidades)    # elimino las repetidas
    secuenciaFiltrada = []  # aca se guardaran aquellas secuencias que complan los requisitos
    for lista in posibilidades:
        if esSecuenciaCorrecta(lista) and esCiclo(lista) and len(lista) == n: # si es correcta la secuencia, es un ciclo y tiene el tamaño que busco
            secuenciaFiltrada.append(lista) # agrego a la lista
    return secuenciaFiltrada


lista8 = [[1, 2], [2, 2], [2, 6], [3, 6], [3, 3], [3, 2], [5, 4]]
print(darCicloN(lista8, 4))