#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
int conta(char c, char *s){
int num_vezes=0;
while(*s!='\0'){
if(*s== '\t'){
num_vezes++;
}
s++;
}
return num_vezes;
}
int ordenar(int vetorDeNumeros[], int tamanhoVetor){
int i;
int j;
int temp;
for(i=0;i<tamanhoVetor;i++){
for(j=0;j<tamanhoVetor;j++){
if(vetorDeNumeros[i] < vetorDeNumeros[j]){
temp = vetorDeNumeros[i];
vetorDeNumeros[i] = vetorDeNumeros[j];
vetorDeNumeros[j] = temp;
}
}
}
return vetorDeNumeros[0];
}
void clean(char * s){
int i=0;
while(s[i]!='\0'){
if(s[i]=='\n'){
s[i]='\0';
}
i++;
}
}
void RemoveSpaces(char* source)
{
char* i = source;
char* j = source;
while(*j != 0)
{
*i = *j++;
if(*i != ' ')
i++;
}
*i = 0;
}
void cleanequal(char * s){
int i=0;
while(s[i]!='\0'){
if(s[i]== '='){
s[i]=' ';
}
i++;
}
}
void append(char* s, char c)
{
s[len] = c;
s[len+1] = '\0';
}
char* expand_cell_references(const char* f, const char* const l, char* o); /*the magic engine*/
const char* get_cell_value(const char* coordinate_b, const char* coordinate_e);
//localiza pelo numero maximo de coisas que ele vai ler
static char matris[30][26][302] = {{{0}}};
int main() {
//int tamanho = 0;
char vetor[302];
int m;
int k=0;
int colunas = 0;
int vetorDeNumeros[30] = {0};
//inicia-se o loop
while(1) {
if(
!fgets(vetor
, 302, stdin
) //Recebe os dados || strcmp(vetor
, "\n") == 0) //Verifica se tem a quebra de linha {
break;
}
//Aqui eu insiro na funcao o vetor
char *s = vetor;
//Recebo a quantia de \t
m = conta('\t', s);
//Passo pra posicao do vetor, o numero de colunas
vetorDeNumeros[k] = m+1;
//Recebo o resultado do bubble sort
colunas = ordenar(vetorDeNumeros, k+1);
//faz a colocacao de cada elemento dentro de cada celula, tentei por funcao mas nao deu muito certo
char *ponteiro;
int j=0;
while(j<colunas) {
ponteiro
= strtok(vetor
, "\t"); while(ponteiro != NULL) {
strcpy(matris
[k
][j
], ponteiro
); ponteiro
= strtok(NULL
, "\t"); //REMOVE OS \N DESNECESSARIOS
clean(matris[k][j]);
//REMOVE OS IGUAIS
cleanequal((matris[k][j]));
//REMOVE OS ESPAÇOS GERADOS PELOS ESPAÇOS
RemoveSpaces(matris[k][j]);
j++;
}
}
//Quantia de linhas que foram
k++;
}
//int L = 0, linha=0;
//char col;
int i, c;
for(i = 0; i < k; i++) {
for(c = 0; c < colunas; c++) {
//printf("linha: %d coluna: %c >> |%s|", i, c, matris[i][c]);
//int line;
//int offset = 0, readCharCount;
//char op;
//char troca[301];
//char buffer[32];
char out[1024] = {0};
const char* value = matris[i][c];
expand_cell_references
(value
, value
+strlen(value
), out
); printf("%s\t", out
); /* Should be fine, really, as long as input fits inside matris */ // printf("%s\t", matris[i][c]);
}
}
/*
printf("%d lin, %d col\n\n", k, colunas);
int w,z;
for(w=0;w<k;w++){
for(z=0;z<colunas;z++){
printf("%s\t", matris[w][z]);
}
printf("\n");
}
*/
//system("pause");
return 0;
}
const char* get_cell_value(const char* coordinate_b, const char* coordinate_e)
{
#ifdef DEBUG
static const size_t maxrows = (sizeof(matris)/sizeof(*matris));
static const size_t maxcols = (sizeof(matris[0])/sizeof(*matris[0]));
#endif
size_t col = 0, row = 0;
const char* it;
for (it=coordinate_b; it != coordinate_e; ++it)
{
if (*it >= 'A' && *it <= 'Z')
col = 26*col + (*it - 'A');
if (*it >= '0' && *it <= '9')
row = 10*row + (*it - '0'); /* or use atoi and friends */
}
row--; /* 1-based row nums in Excel */
#ifdef DEBUG
assert(col
>=0 && col
< maxcols
); assert(row
>=0 && row
< maxrows
); #endif
return matris[row][col]; /* 1-based indexes in Excel */
}
char* expand_cell_references(const char* f, const char* const l, char* o)
{
enum parser_state {
other,
in_coord_col,
in_coord_row
} state = other;
/*temporary storage for coordinates being parsed:*/
char accum[16] = {0};
char* accit = accum;
while (f!=l)
{
switch(state) /*dummy, the transitions flow in fallthrough order for now*/
{
case other:
*(accit = accum) = 0; /*reset the accumulator*/
while (f!=l && !(*f>='A' && *f<='Z'))
*o++ = *f++;
/*fallthrough*/
case in_coord_col:
while (f!=l && *f>='A' && *f<='Z')
*accit++ = *f++;
/*fallthrough*/
case in_coord_row:
{
const char* expanded = accum;
if (f!=l && *f>='0' && *f<='9')
{
while (f!=l && *f>='0' && *f<='9')
*accit++ = *f++;
expanded = get_cell_value(accum, accit);
}
else
{
*accit = 0;
}
while (*expanded)
*o++ = *expanded++;
continue; /*state = other;*/
}
}
}
return o;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCmludCBjb250YShjaGFyIGMsIGNoYXIgKnMpewogICAgaW50IG51bV92ZXplcz0wOwogICAgd2hpbGUoKnMhPSdcMCcpewogICAgICAgIGlmKCpzPT0gJ1x0Jyl7CiAgICAgICAgICAgIG51bV92ZXplcysrOwogICAgICAgIH0KICAgICAgICBzKys7CiAgICB9CiAgICByZXR1cm4gbnVtX3ZlemVzOwp9CgppbnQgb3JkZW5hcihpbnQgdmV0b3JEZU51bWVyb3NbXSwgaW50IHRhbWFuaG9WZXRvcil7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IHRlbXA7CiAgICBmb3IoaT0wO2k8dGFtYW5ob1ZldG9yO2krKyl7CiAgICAgICAgZm9yKGo9MDtqPHRhbWFuaG9WZXRvcjtqKyspewogICAgICAgICAgICBpZih2ZXRvckRlTnVtZXJvc1tpXSA8IHZldG9yRGVOdW1lcm9zW2pdKXsKICAgICAgICAgICAgICAgIHRlbXAgPSB2ZXRvckRlTnVtZXJvc1tpXTsKICAgICAgICAgICAgICAgIHZldG9yRGVOdW1lcm9zW2ldID0gdmV0b3JEZU51bWVyb3Nbal07CiAgICAgICAgICAgICAgICB2ZXRvckRlTnVtZXJvc1tqXSA9IHRlbXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHZldG9yRGVOdW1lcm9zWzBdOwp9Cgp2b2lkIGNsZWFuKGNoYXIgKiBzKXsKICAgICBpbnQgaT0wOwogICAgIHdoaWxlKHNbaV0hPSdcMCcpewogICAgICAgICAgaWYoc1tpXT09J1xuJyl7CiAgICAgICAgICAgICBzW2ldPSdcMCc7CiAgICAgICAgICB9CiAgICAgICAgICBpKys7CiAgICAgfQp9Cgp2b2lkIFJlbW92ZVNwYWNlcyhjaGFyKiBzb3VyY2UpCnsKICBjaGFyKiBpID0gc291cmNlOwogIGNoYXIqIGogPSBzb3VyY2U7CiAgd2hpbGUoKmogIT0gMCkKICB7CiAgICAqaSA9ICpqKys7CiAgICBpZigqaSAhPSAnICcpCiAgICAgIGkrKzsKICB9CiAgKmkgPSAwOwp9Cgp2b2lkIGNsZWFuZXF1YWwoY2hhciAqIHMpewogICAgIGludCBpPTA7CiAgICAgd2hpbGUoc1tpXSE9J1wwJyl7CiAgICAgICAgICBpZihzW2ldPT0gJz0nKXsKICAgICAgICAgICAgIHNbaV09JyAnOwogICAgICAgICAgfQogICAgICAgICAgaSsrOwogICAgIH0KfQoKdm9pZCBhcHBlbmQoY2hhciogcywgY2hhciBjKQp7CiAgICAgICAgaW50IGxlbiA9IHN0cmxlbihzKTsKICAgICAgICBzW2xlbl0gPSBjOwogICAgICAgIHNbbGVuKzFdID0gJ1wwJzsKfQoKY2hhciogZXhwYW5kX2NlbGxfcmVmZXJlbmNlcyhjb25zdCBjaGFyKiBmLCBjb25zdCBjaGFyKiBjb25zdCBsLCBjaGFyKiBvKTsgLyp0aGUgbWFnaWMgZW5naW5lKi8KY29uc3QgY2hhciogZ2V0X2NlbGxfdmFsdWUoY29uc3QgY2hhciogY29vcmRpbmF0ZV9iLCBjb25zdCBjaGFyKiBjb29yZGluYXRlX2UpOwoKLy9sb2NhbGl6YSBwZWxvIG51bWVybyBtYXhpbW8gZGUgY29pc2FzIHF1ZSBlbGUgdmFpIGxlcgpzdGF0aWMgY2hhciBtYXRyaXNbMzBdWzI2XVszMDJdID0ge3t7MH19fTsKCmludCBtYWluKCkgewogICAgLy9pbnQgdGFtYW5obyA9IDA7CiAgICBjaGFyIHZldG9yWzMwMl07CiAgICBpbnQgbTsKICAgIGludCBrPTA7CiAgICBpbnQgY29sdW5hcyA9IDA7CiAgICBpbnQgdmV0b3JEZU51bWVyb3NbMzBdID0gezB9OwogICAgLy9pbmljaWEtc2UgbyBsb29wCiAgICB3aGlsZSgxKSB7CiAgICAgICAgaWYoCiAgICAgICAgICAgICAgICAhZmdldHModmV0b3IsIDMwMiwgc3RkaW4pIC8vUmVjZWJlIG9zIGRhZG9zCiAgICAgICAgICAgICAgICB8fCBzdHJjbXAodmV0b3IsICJcbiIpID09IDApIC8vVmVyaWZpY2Egc2UgdGVtIGEgcXVlYnJhIGRlIGxpbmhhCiAgICAgICAgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy9BcXVpIGV1IGluc2lybyBuYSBmdW5jYW8gbyB2ZXRvcgogICAgICAgIGNoYXIgKnMgPSB2ZXRvcjsKICAgICAgICAvL1JlY2VibyBhIHF1YW50aWEgZGUgXHQKICAgICAgICBtID0gY29udGEoJ1x0Jywgcyk7CiAgICAgICAgLy9QYXNzbyBwcmEgcG9zaWNhbyBkbyB2ZXRvciwgbyBudW1lcm8gZGUgY29sdW5hcwogICAgICAgIHZldG9yRGVOdW1lcm9zW2tdID0gbSsxOwogICAgICAgIC8vUmVjZWJvIG8gcmVzdWx0YWRvIGRvIGJ1YmJsZSBzb3J0CiAgICAgICAgY29sdW5hcyA9IG9yZGVuYXIodmV0b3JEZU51bWVyb3MsIGsrMSk7CiAgICAgICAgLy9mYXogYSBjb2xvY2FjYW8gZGUgY2FkYSBlbGVtZW50byBkZW50cm8gZGUgY2FkYSBjZWx1bGEsIHRlbnRlaSBwb3IgZnVuY2FvIG1hcyBuYW8gZGV1IG11aXRvIGNlcnRvCiAgICAgICAgY2hhciAqcG9udGVpcm87CiAgICAgICAgaW50IGo9MDsKICAgICAgICB3aGlsZShqPGNvbHVuYXMpIHsKICAgICAgICAgICAgcG9udGVpcm8gPSBzdHJ0b2sodmV0b3IsICJcdCIpOwogICAgICAgICAgICB3aGlsZShwb250ZWlybyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzdHJjcHkobWF0cmlzW2tdW2pdLCBwb250ZWlybyk7CiAgICAgICAgICAgICAgICBwb250ZWlybyA9IHN0cnRvayhOVUxMLCAiXHQiKTsKICAgICAgICAgICAgICAgIC8vUkVNT1ZFIE9TIFxOIERFU05FQ0VTU0FSSU9TCiAgICAgICAgICAgICAgICBjbGVhbihtYXRyaXNba11bal0pOwogICAgICAgICAgICAgICAgLy9SRU1PVkUgT1MgSUdVQUlTCiAgICAgICAgICAgICAgICBjbGVhbmVxdWFsKChtYXRyaXNba11bal0pKTsKICAgICAgICAgICAgICAgIC8vUkVNT1ZFIE9TIEVTUEHDh09TIEdFUkFET1MgUEVMT1MgRVNQQcOHT1MKICAgICAgICAgICAgICAgIFJlbW92ZVNwYWNlcyhtYXRyaXNba11bal0pOwogICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vUXVhbnRpYSBkZSBsaW5oYXMgcXVlIGZvcmFtCiAgICAgICAgaysrOwogICAgfQogICAgLy9pbnQgTCA9IDAsIGxpbmhhPTA7CiAgICAvL2NoYXIgY29sOwogICAgaW50IGksIGM7CiAgICBmb3IoaSA9IDA7IGkgPCBrOyBpKyspIHsKICAgICAgICBmb3IoYyA9IDA7IGMgPCBjb2x1bmFzOyBjKyspIHsKICAgICAgICAgICAgLy9wcmludGYoImxpbmhhOiAlZCBjb2x1bmE6ICVjID4+IHwlc3wiLCBpLCBjLCBtYXRyaXNbaV1bY10pOwogICAgICAgICAgICAvL2ludCBsaW5lOwogICAgICAgICAgICAvL2ludCBvZmZzZXQgPSAwLCByZWFkQ2hhckNvdW50OwogICAgICAgICAgICAvL2NoYXIgb3A7CiAgICAgICAgICAgIC8vY2hhciB0cm9jYVszMDFdOwogICAgICAgICAgICAvL2NoYXIgYnVmZmVyWzMyXTsKICAgICAgICAgICAgY2hhciBvdXRbMTAyNF0gPSB7MH07CiAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gbWF0cmlzW2ldW2NdOwogICAgICAgICAgICBleHBhbmRfY2VsbF9yZWZlcmVuY2VzKHZhbHVlLCB2YWx1ZStzdHJsZW4odmFsdWUpLCBvdXQpOwogICAgICAgICAgICBwcmludGYoIiVzXHQiLCBvdXQpOyAvKiBTaG91bGQgYmUgZmluZSwgcmVhbGx5LCBhcyBsb25nIGFzIGlucHV0IGZpdHMgaW5zaWRlIG1hdHJpcyAqLwogICAgICAgICAgICAvLyBwcmludGYoIiVzXHQiLCBtYXRyaXNbaV1bY10pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CiAgICAvKgogICAgICAgIHByaW50ZigiJWQgbGluLCAlZCBjb2xcblxuIiwgaywgY29sdW5hcyk7CiAgICAgICAgaW50IHcsejsKICAgICAgICBmb3Iodz0wO3c8azt3KyspewogICAgICAgICAgICBmb3Ioej0wO3o8Y29sdW5hczt6KyspewogICAgICAgICAgICAgICAgcHJpbnRmKCIlc1x0IiwgbWF0cmlzW3ddW3pdKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgICovCiAgICBwcmludGYoIlxuIik7Ci8vc3lzdGVtKCJwYXVzZSIpOwogICAgcmV0dXJuIDA7Cn0KCmNvbnN0IGNoYXIqIGdldF9jZWxsX3ZhbHVlKGNvbnN0IGNoYXIqIGNvb3JkaW5hdGVfYiwgY29uc3QgY2hhciogY29vcmRpbmF0ZV9lKQp7CiNpZmRlZiBERUJVRwogICAgc3RhdGljIGNvbnN0IHNpemVfdCBtYXhyb3dzID0gKHNpemVvZihtYXRyaXMpL3NpemVvZigqbWF0cmlzKSk7CiAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1heGNvbHMgPSAoc2l6ZW9mKG1hdHJpc1swXSkvc2l6ZW9mKCptYXRyaXNbMF0pKTsKI2VuZGlmCiAgICBzaXplX3QgY29sID0gMCwgcm93ID0gMDsKICAgIGNvbnN0IGNoYXIqIGl0OwogICAgZm9yIChpdD1jb29yZGluYXRlX2I7IGl0ICE9IGNvb3JkaW5hdGVfZTsgKytpdCkKICAgIHsKICAgICAgICBpZiAoKml0ID49ICdBJyAmJiAqaXQgPD0gJ1onKQogICAgICAgICAgICBjb2wgPSAyNipjb2wgKyAoKml0IC0gJ0EnKTsKICAgICAgICBpZiAoKml0ID49ICcwJyAmJiAqaXQgPD0gJzknKQogICAgICAgICAgICByb3cgPSAxMCpyb3cgKyAoKml0IC0gJzAnKTsgLyogb3IgdXNlIGF0b2kgYW5kIGZyaWVuZHMgKi8KICAgIH0KICAgIHJvdy0tOyAvKiAxLWJhc2VkIHJvdyBudW1zIGluIEV4Y2VsICovCgojaWZkZWYgREVCVUcKICAgIGFzc2VydChjb2w+PTAgJiYgY29sIDwgbWF4Y29scyk7CiAgICBhc3NlcnQocm93Pj0wICYmIHJvdyA8IG1heHJvd3MpOwojZW5kaWYKCiAgICByZXR1cm4gbWF0cmlzW3Jvd11bY29sXTsgLyogMS1iYXNlZCBpbmRleGVzIGluIEV4Y2VsICovCn0KCmNoYXIqIGV4cGFuZF9jZWxsX3JlZmVyZW5jZXMoY29uc3QgY2hhciogZiwgY29uc3QgY2hhciogY29uc3QgbCwgY2hhciogbykKewogICAgZW51bSBwYXJzZXJfc3RhdGUgewogICAgICAgIG90aGVyLAogICAgICAgIGluX2Nvb3JkX2NvbCwKICAgICAgICBpbl9jb29yZF9yb3cKICAgIH0gc3RhdGUgPSBvdGhlcjsKCiAgICAvKnRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb29yZGluYXRlcyBiZWluZyBwYXJzZWQ6Ki8KICAgIGNoYXIgYWNjdW1bMTZdID0gezB9OwogICAgY2hhciogYWNjaXQgPSBhY2N1bTsKICAgIHdoaWxlIChmIT1sKQogICAgewogICAgICAgIHN3aXRjaChzdGF0ZSkgLypkdW1teSwgdGhlIHRyYW5zaXRpb25zIGZsb3cgaW4gZmFsbHRocm91Z2ggb3JkZXIgZm9yIG5vdyovCiAgICAgICAgewogICAgICAgICAgICBjYXNlIG90aGVyOgogICAgICAgICAgICAgICAgKihhY2NpdCA9IGFjY3VtKSA9IDA7IC8qcmVzZXQgdGhlIGFjY3VtdWxhdG9yKi8KICAgICAgICAgICAgICAgIHdoaWxlIChmIT1sICYmICEoKmY+PSdBJyAmJiAqZjw9J1onKSkKICAgICAgICAgICAgICAgICAgICAqbysrID0gKmYrKzsKICAgICAgICAgICAgICAgIC8qZmFsbHRocm91Z2gqLwogICAgICAgICAgICBjYXNlIGluX2Nvb3JkX2NvbDoKICAgICAgICAgICAgICAgIHdoaWxlIChmIT1sICYmICpmPj0nQScgJiYgKmY8PSdaJykKICAgICAgICAgICAgICAgICAgICAqYWNjaXQrKyA9ICpmKys7CiAgICAgICAgICAgICAgICAvKmZhbGx0aHJvdWdoKi8KICAgICAgICAgICAgY2FzZSBpbl9jb29yZF9yb3c6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwYW5kZWQgPSBhY2N1bTsKICAgICAgICAgICAgICAgICAgICBpZiAoZiE9bCAmJiAqZj49JzAnICYmICpmPD0nOScpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZiE9bCAmJiAqZj49JzAnICYmICpmPD0nOScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWNjaXQrKyA9ICpmKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkID0gZ2V0X2NlbGxfdmFsdWUoYWNjdW0sIGFjY2l0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmFjY2l0ID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpleHBhbmRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgKm8rKyA9ICpleHBhbmRlZCsrOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKnN0YXRlID0gb3RoZXI7Ki8KICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbzsKfQo=