La ronda de clasificacion fue dura y realmente interesante, pone a prueba la capacidad de enfrentar problemas, no me fue muy bien realmente aun que es mi primera vez que participo, amigos y compañeros me ayudaron en analisis del segundo y tercer problema aunque no con resultados exitosos :( pero bueno fue un momento para compartir conocimiento con ellos ,ver la forma como ellos trataban de solucionar y de dar aportes, a pesar del resultado logre desarrollar el punto 1 (Alien Language) y la verdad fue facil, al principio me enrrede en una solucion recursiva pero me inspire y pude descartarla, de no haberlo hecho no hubiera completado ese punto, les cuento como solucione ese punto al final.
Problem A: Alien LanguageCategory: Brute Force, String Manipulation
URL: http://code.google.com/codejam/contest/dashboard?c=90101#s=p0la idea principal es dada una serie de palabras N de longitud L, buscar en los D casos todas las palabras y encontrar similitud en ellos , los casos estaban dados por (abc..z) donde cada caracter dentro de los () podia ser , es decir o a, b, .. etc, un ejemplo mas claro es:
abc como palabra a encontrar en el caso y el caso es (ab)(bc)c la solucion seria que pueden encontrarse las siguientes soluciones para este caso, [abc,acc,bbc,bcc] y abc esta una sola ves asi la respuesta seria 1, pense haciendo una fucion que me generara n vectores posibles para sacar las combinaciones posibles, pero realizar esta funcion me tomaria mucho tiempo y en este momento analizando todo lo que paso no creo que me hubiese servido de mucha ayuda :P, la forma como enfrente este problema fue, en vez de crear una funcion que realizara los n vectores de combinaciones, use expresiones regulares en perl, asi primero convertia los () en [] para poder evaluarlas por medio de =~/Expresion/ entonces asi sabria si existia la palabra en el caso.
Esta es mi solucion para ese problema, funciona de igual manera para el set de dato pequeño y el grande (aprox 5000 palabras, 500 casos :P)
my ($L,$D,$N,$caso)="";
my (@lineas,@cabecera,@palabras,@respuesta)=();
open(Entrada,"A-large.in");
@lineas=< Entrada>;
@cabecera=split(" ",$lineas[0]);
close(Entrada);
$L=$cabecera[0];
$D=$cabecera[1];
$N=$cabecera[2];
for(my $i=1;$i<=$D;$i++){
$palabras[@palabras]=$lineas[$i];
}
for(my $i=($D+1);$i<@lineas;$i++){
my $contador=0;
$caso=$lineas[$i];
$caso=~s/\(/\[/g;
$caso=~s/\)/\]/g;
for(my $j=0;$j<@palabras;$j++){
if($palabras[$j]=~$caso){
$contador++;
}
}
$respuesta[@respuesta]=$contador;
}
open(Salida,">output-large");
for(my $i=0;$i<@respuesta;$i++){
print Salida "Case #".($i+1).": ".$respuesta[$i]."\n";
}
close(Salida);
En fin obtuve 33 puntos de 99 posibles :P es mi primera vez que participo , pero no sera la ultima, quiero agradecerles a mis amigos (colegas con quien trabajo) por el apoyo brindado