#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "conio.h"
#include <vector>
 
#define NOTOKENS 6
 
int contarUnos(int conjunto[]);
unsigned long conversor(unsigned long n1,int base1,int base2);
void binarioCharInt(char *binarioA, int *binario2,int unos);
void imprimirBinarioInt(int *binarioI);
void generarPotencia(int conjunto[],int unos);
void inicializarPotencia(int conjunto[][NOTOKENS], int numeroConjuntos, int unos);
void IntToBin(int valor, int digitos, char *binario);
void crearConjuntoAux(int conjunto[], int conjuntoAux[], int unos);
void cambiarNumeros(int conjunto[], int conjuntoP[][NOTOKENS], int conjuntoPAux[][NOTOKENS], int numeroConjuntos, int unos);
void inicializarZeroes(int conjunto[][NOTOKENS], int numeroConjuntos);
void cambiarFinal(int conjuntoPAux[][NOTOKENS], int conjuntoFinal[][NOTOKENS], int numeroConjuntos, int unos);
void imprimirConjuntoInicial(int conjunto[]);
 
int main (void){
    int conjunto[NOTOKENS]={0,1,1,1,1,0};
    int unos = contarUnos(conjunto);
    int conjuntoAux[unos];
    imprimirConjuntoInicial(conjunto);
    crearConjuntoAux(conjunto,conjuntoAux,unos);
    generarPotencia(conjuntoAux,unos);
    return 0;
}
 
void imprimirConjuntoInicial(int conjunto[]){
    printf("Conjunto Inicial = ");     for(int i = 0;i<NOTOKENS;i++){
    }
}
 
void crearConjuntoAux(int conjunto[], int conjuntoAux[], int unos){
    int j=0;
    for(int i = 0;i<NOTOKENS;i++){
        if(conjunto[i]==1){
            conjuntoAux[j]=i+1;
            printf("%d, ",conjuntoAux
[j
]);             j++;
        }
    }
}
 
void generarPotencia(int conjunto[],int unos){
    int numeroConjuntos 
= (int)pow(2,unos
);     int conjuntoPotenciaAux[numeroConjuntos][NOTOKENS];
    int conjuntoPotencia[numeroConjuntos][NOTOKENS];
    int conjuntoPotenciaFinal[numeroConjuntos][NOTOKENS];
    inicializarZeroes(conjuntoPotencia,numeroConjuntos);
    inicializarZeroes(conjuntoPotenciaAux,numeroConjuntos);
    inicializarPotencia(conjuntoPotencia,numeroConjuntos,unos);
    inicializarPotencia(conjuntoPotenciaAux,numeroConjuntos,unos);
    cambiarNumeros(conjunto,conjuntoPotencia,conjuntoPotenciaAux,numeroConjuntos,unos);
    inicializarZeroes(conjuntoPotenciaFinal,numeroConjuntos);
    cambiarFinal(conjuntoPotenciaAux,conjuntoPotenciaFinal,numeroConjuntos,unos);
}
 
void inicializarPotencia(int conjunto[][NOTOKENS], int numeroConjuntos, int unos){
    unsigned long binario;
    unsigned long decimal;
    char binarioA[unos];
    int binario2[unos];
    binarioA[unos]=' ';
    for(int i = 0;i<numeroConjuntos;i++){
        binario=conversor(i,2,10);
        IntToBin(i,unos,binarioA);
        binarioCharInt(binarioA,binario2,unos);
        for(int j = 0;j<unos;j++){
            conjunto[i][j]=binario2[j];
        }
    }
}
 
void cambiarNumeros(int conjunto[], int conjuntoP[][NOTOKENS], int conjuntoPAux[][NOTOKENS], int numeroConjuntos, int unos){
    printf("nConjunto Potencia Auxnn");     for (int i=0;i<numeroConjuntos;i++){
        for(int j=0;j<unos;j++){
            if(conjuntoP[i][j]==1){
                    conjuntoPAux[i][j]=conjunto[j];
                    printf("%d ",conjuntoPAux
[i
][j
]);             }
        }
    }
}
 
void inicializarZeroes(int conjunto[][NOTOKENS], int numeroConjuntos){
    for(int i = 0;i<numeroConjuntos; i++){
        for(int j=0;j<NOTOKENS;j++){
            conjunto[i][j]=0;
        }
    }
}
 
void cambiarFinal(int conjuntoPAux[][NOTOKENS], int conjuntoFinal[][NOTOKENS], int numeroConjuntos, int unos){
    printf("nConjunto Potenciann");     int cambio=0;
    for(int i = 0;i<numeroConjuntos;i++){
        for(int j = 0;j<NOTOKENS;j++){
            cambio=conjuntoPAux[i][j];
            if(cambio!=0)conjuntoFinal[i][cambio-1]=1;
        }
    }
    for(int i = 0;i<numeroConjuntos;i++){
        for(int j = 0;j<NOTOKENS;j++){
            printf("%d",conjuntoFinal
[i
][j
]);         }
    }
}
 
int contarUnos(int conjunto[]){
    int cont=0;
    for(int i =0;i<NOTOKENS;++i){
        if(conjunto[i]==1)cont++;
    }
    return cont;
 
}
 
void binarioCharInt(char *binarioA, int *binario2,int unos){
    for(int i = 0;i<unos;i++){
        if(binarioA[i]=='0')binario2[i]=0;
        if(binarioA[i]=='1')binario2[i]=1;
    }
}
 
unsigned long conversor(unsigned long n1,int base1,int base2){
   unsigned long alg,mult=1,n2=0;
   while (n1 > 0){
      alg = n1 % base1;
      n1 /= base1;
      n2 += (alg*mult);
      mult *= base2;
   }
   return n2;
}
 
void imprimirBinarioInt(int *binarioI){
    for(int i = 0;i<NOTOKENS;i++){
    }
}
 
void IntToBin(int valor, int digitos, char *binario){
    for (int i = 0; i <= digitos; i++){
        if (((1 << i) & valor) > 0)
            binario[digitos-1-i]= '1';
        else
        binario[digitos-1-i]= '0';
    }
}