tplr20171109.cpp

#define USECHRONO
#include <cassert>
#include <climits>
#include <cstdlib>
#include <stack>
#include <map>
#include <numeric>
#include "eval.hpp"

using namespace aed;
using namespace std;

/* COMIENZO DE DESCRIPCION

   __USE_WIKI__

   #sum_sublist:# Implemente la funcion que dada una lista de
   enteros #L# y un entero #S,# encuentre y retorne una sublista
   cuya suma sea S. 

   #discrete_moving_mean:# Implemente la funcion que dada
   una lista de enteros #L# y un entero #w,# retorne una lista
   con los valores de la media movil con ventana fija de
   tamano #w.#

   #d10s:# Implemente la funcion que reciba un AOO #T# y retorne el
   camino  desde la raiz hasta el nodo con la etiqueta 10. 

   #is_cycle:# Implemente una funcion que determine si el
   grafo #G# es un ciclo dirigido o no.

   #existe_subc:# Implementar una funcion que dado un
   conjunto #S# y un valor #n,# determine si existe un
   subconjunto de #S# para el cual la suma de sus elementos
   sea n.

   #replace_btree:# Implemente una funcion que busque los
   nodos que cumplan con la condicion #pred# y los reemplace
   por el primero de sus descendientes que no la cumpla.

   [Tomado en el TPL Recup de 2017-11-09].  
   keywords: arbol binario, arbol orientado, conjunto, lista, programacion funcional

FIN DE DESCRIPCION */

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// sum_sublist (Valido para el TPL 1)
list<int> sum_sublist(list<int>& L, int S){
  list<int> R;
  if(S==0) return R;
  list<int>::iterator it = L.begin();
  while(it!=L.end()){
    int acum = 0;
    auto it2 = it;
    while(it2!=L.end()){
      acum += *it2;
      if(acum==S){
        R.insert(R.begin(),it,++it2);
        return R;
      }
      it2++;
    }
    it++;
  }
  return R;
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// discrete_moving_mean (Valido para el TPL 1)
list<int> discrete_moving_mean(list<int>& L, int w){
  list<int> R;
  list<int>::iterator it = L.begin();
  list<int> Laux;
  for(;it!=L.end();it++){
    Laux.push_back(*it);
    if(Laux.size()==w){
      R.push_back(accumulate(Laux.begin(),Laux.end(),0)/w);
      Laux.pop_front();
    }
  }
  return R;
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// d10s (Valido para el TPL 2)
list<int> d10s(tree<int> &T, tree<int>::iterator nodo){
  if(*nodo==10){
    return {*nodo};
  }
  tree<int>::iterator c = nodo.lchild();
  while(c!=T.end()){
    list<int> aux = d10s(T,c);
    if(aux.size()){
      aux.push_front(*nodo);
      return aux;
    }
    c++;
  }
  return {};
}

list<int> d10s(tree<int> &T){
	return d10s(T,T.begin());
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// is_cycle (Valido para el TPL 2)
bool is_cycle(graph_t &G){
  set<int> visited;
  int v = G.begin()->first;
  int first = v;
  while(visited.size()<G.size()){
    if(visited.count(v)) return false;
    visited.insert(v);
    if(G[v].size()!=1) return false;
    v = *(G[v].begin());
  }
  return (v==first);
}


//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// existe_subc (Valido para el TPL 3)
bool existe_subc(set<int>S,int n, set<int> S2){
  if(S.empty()){
    return (accumulate(S2.begin(),S2.end(),0)==n);
  }
  int x = *S.begin();
  S.erase(x);
  if(existe_subc(S,n,S2)) return true;
  S2.insert(x);
  if(existe_subc(S,n,S2)) return true;
  return false;
}

bool existe_subc(set<int> &S, int n) {
  return existe_subc(S,n,{});
}


//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// replace_btree (Valido para el TPL 3)

// Funcion auxiliar.
// Encuentra el primer nodo que no cumple el pred
btree<int>::iterator findX(btree<int>&T,btree<int>::iterator it,bt_fun_t f){
  if(it==T.end())
    return it;
  if(!f(*it))
    return it;
  btree<int>::iterator itl,itr;
  itl = findX(T,it.left(),f);
  itr = findX(T,it.right(),f);
  if(itl != T.end())
    return itl;
  else return itr;
}

void replaceBtree(btree<int>&T,btree<int>::iterator it,bt_fun_t f){
  if(it==T.end())
    return;
  if(f(*it)){
    btree<int>::iterator aux = findX(T,it,f);
    if(aux != T.end()){
      int remp = *aux;
      *it = remp;
    }else it = T.erase(it);
  }
  if(it != T.end()){
    replaceBtree(T,it.left(),f);
    replaceBtree(T,it.right(),f);
  }
}

void replaceBtree(btree<int>&T,bt_fun_t f){
  replaceBtree(T,T.begin(),f);
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
  
  Eval ev;
  int vrbs = 0;
  int seed = 123;
  int h1=0,h2=0,h3=0,h4,h5,h6;
  
  do {
    ev.eval<1>(sum_sublist,vrbs);
    h1 = ev.evalr<1>(sum_sublist,seed,vrbs);
    
    ev.eval<2>(discrete_moving_mean,vrbs);
    h2 = ev.evalr<2>(discrete_moving_mean,seed,vrbs);

    ev.eval<3>(d10s,vrbs);
    h3 = ev.evalr<3>(d10s,seed,vrbs);
    
    ev.eval<4>(is_cycle,vrbs);
    h4 = ev.evalr<4>(is_cycle,seed,vrbs);

    ev.eval<5>(existe_subc,vrbs);
    h5 = ev.evalr<5>(existe_subc,seed,vrbs);
    
    //ev.eval<6>(replace_btree,vrbs);
    //h6 = ev.evalr<6>(replace_btree,seed,vrbs);
    
    printf("S=%03d  ->  H1=%03d H2=%03d  H3=%03d H4=%03d  H5=%03d H6=%03d\n",
           seed,h1,h2,h3,h4,h5,h6);
    printf("\n\nIngrese un valor para la semilla:");
  } while (cin>>seed);
  
  return 0;
}

Generated by GNU Enscript 1.6.6.