tpl1d20140830.cpp

#include "./eval.hpp"

using namespace aed;

/* COMIENZO DE DESCRIPCION

   __USE_WIKI__
  #large-even-list:# Dado un #vector<list<int>> &VL# buscar
  aquella lista #VL[j]# que contiene la maxima cantidad de
  pares y retornar la sublista de pares correspondientes (en
  el mismo orden que estan en #VL[j]# ).  Si hay varias
  listas con la maxima longitud retornar la primera.
 
  #interlaced-split# Dada una lista de enteros #L# y un
  entero positivo #m# dividir a #L# en #m# sublistas (en un vector
  de listas #vector< list<int> > VL# ) en forma
  _entrelazada_ es decir #(a0,a1,a2...)# van
  correspondientemente a las listas #VL[0]#, #VL[1]#, #VL[m-1],#
  #VL[0],# #VL[1]# ... Es decir, el elemento  #aj# va a la lista
  #VL[k]# donde #k=j%m# y #j# es la posicion entera en la lista. 

  #interlaced-join:# Es la inversa de
  #interlaced_split()#. Dado un  #vector< list<int> > VL# 
  juntarlos en una lista #L# de uno a la vez. Es decir, primero los
  primeros elementos de #VL[0]#, #VL[1]#, #...#, #VL[m-1]#,
  despues los segundos elementos, hasta que se acaben todas las
  listas. 

   [Tomado en el TPL1 de 2014-08-30].  
   keywords: lista

  FIN DE DESCRIPCION */

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void large_even_list(vector< list<int> >&VL,list<int>&L) {
  // Cantidad de listas
  int m = VL.size();
  // Limpiar la lista de salidad por las dudas
  L.clear();
  // La lista maxima actual es directamente L
  for (int j=0; j<m; j++) {
    // Lj es una referencia a lista VL[j]
    // tmp es un auxiliar que contendra los pares de VL[j]
    list<int> tmp, &Lj = VL[j];
    // Pone los pares de Lj en tmp
    list<int>::iterator q = Lj.begin();
    while (q!=Lj.end()) {
      if (*q%2==0) tmp.push_back(*q);
      q++;
    }
    // Si Lj tenia mas pares que el maximo actual L lo reemplaza
    if (tmp.size()>L.size()) L=tmp;
  }
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void interlaced_split(list<int>&L, int m, 
                      vector< list<int> >&VL) {
  // Limpia VL por si acaso y lo resizea a m
  VL.clear();
  VL.resize(m);
  // j va a ser el indice del elemento en la lista L
  int j=0;
  list<int>::iterator q = L.begin();
  // Recorre L y lo pone en la posicion correspondiente en VL
  while (q!=L.end()) VL[(j++)%m].push_back(*q++);
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Esta es la misma version que arriba pero `vanilla' 
void interlaced_split2(list<int>&L, int m, 
                      vector< list<int> >&VL) {
  // Limpia VL por si acaso y lo resizea a m
  VL.clear();
  VL.resize(m);
  // j va a ser el indice del elemento en la lista L
  int j=0;
  list<int>::iterator q = L.begin();
  // Recorre L y lo pone en la posicion correspondiente en VL
  while (q!=L.end()) {
    int k= j%m;
    VL[k].push_back(*q);
    j++; q++;
  }
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Version vanilla
void interlaced_join(vector< list<int> >&VL, list<int>&L) {
  // Limpiar L por si acaso
  L.clear();
  // Cantidad de listas
  int m = VL.size();
  while (1) {
    int allempty=1;
    for (int j=0; j<m; j++) 
      if (!VL[j].empty()) allempty=0;
    // Despues del lazo si allempty==true si estan todos vacios
    if (allempty) break;
    // Recorre cada lista VL[j] si no esta vacia
    // toma el primer elemento y lo inserta en L. 
    for (int j=0; j<m; j++) {
      list<int> &Lj = VL[j];
      if (!Lj.empty()) {
        L.push_back(Lj.front());
        Lj.pop_front();
      }
    }
  }
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// En esta version se chequea si estan todos vacios en
// el mismo lazo que se extraen los 1ros elementos
// de los VL[j]
void interlaced_join2(vector< list<int> >&VL, list<int>&L) {
  // Limpiar L por si acaso
  L.clear();
  // Cantidad de listas
  int m = VL.size();
  while (1) {
    int allempty=1;
    for (int j=0; j<m; j++) {
      list<int> &Lj = VL[j];
      if (!Lj.empty()) {
        allempty = 0;
        L.push_back(Lj.front());
        Lj.pop_front();
      }
    }
    if (allempty) break;
  }
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
  printf("sizeof(int) %d\n",sizeof(int));
  printf("sizeof(long int) %d\n",sizeof(long int));

  Eval ev;
  int vrbs = 0;
  int seed = 123;
  int h1,h2,h3;
  ev.eval1(large_even_list,vrbs);
  h1 = ev.eval1r(large_even_list,seed,0); // para SEED=123 debe retornar H1=581
  
  ev.eval2(interlaced_split,vrbs);
  h2 = ev.eval2r(interlaced_split,seed,0); // para SEED=123 debe retornar H2=421
  
  ev.eval3(interlaced_join2,vrbs);
  h3 = ev.eval3r(interlaced_join2,seed,0); // para SEED=123 debe retornar H3=505
  printf("SEED=%03d -> HASH1=%03d, HASH2=%03d, HASH3=%03d\n",
         seed,h1,h2,h3);
  return 0;
}

Generated by GNU Enscript 1.6.6.