5 horas en la World Finals 2016

Me dieron muchas ganas de escribir cosas que fuimos pensando, analizando y descubriendo en nuestros dos años como competidores a lo cuál, personalmente, le dediqué mucho tiempo. Todas estas cosas que voy a intentar volcar acá son producto de miles de errores, choques contra una pared y consejos de otras personas (entre las cuáles debo mencionar si o si al genio de Nico Alvarez), pero sobre todo producto de mi fascinación por poder lograr que el Caloventor funcione lo mejor posible.

En este posteo, voy a intentar relatar la World Finals 2016 desde adentro, sobre todo desde mi punto de vista. Creo que es una competencia ejemplificadora ya que nos preparamos mucho para ella y tuvimos casi todos los errores que podíamos llegar a tener. Voy a intentar ser lo más detallista posible, porque nunca encontré una guía detallada que nos ayude, pero seguro me voy a comer varios detalle.

Foto en el Warm Up
En esta competencia, nosotros íbamos a buscar el premio de campeón latinoaméricano, el cuál nosotros creíamos estar disputando (como finalmente pasó) contra las universidades de Pernambuco y Campina Grande. Las decisiones que fuimos tomando fueron en base a ese objetivo, aunque en algún momento pensamos que podíamos llegar a pelear alguna que otra medalla.

00:00
Arranca la competencia. Cada uno tiene su rol inicial bien definido y pensado. Esto es importante, porque al principio los nervios y la ansiedad te comen vivo y cuesta pensar si no estás organizado. Los tres sabíamos en que condiciones estába cada uno, yo en particular no había dormido un carajo y estaba con algo de fiebre pero estaba muy motivado, el Marian estaba hiper-nervioso, y Martín... Martín nunca sabe como está, ja. Pero ambos habían dormido bien que no es poco. Los 3 con muchas pilas ya que nos habíamos motivado 15 minutos antes de que nos íbamos a comer vivo a los Brasileros, je. Esas cosas que uno sueña y la mayoría de veces no pasa.

Nuestra tablita final luego de las 5 horas
Martín arrancó codeando el template, que es un archivo base que copiamos solo una vez al principio para no hacer 10 veces lo mismo (y que sobre todo sirve para menguar los nervios), y a ordenar todas las cosas necesarias en la compu, yo me puse a copiar la tablita (ver imagen) y Mariano a leer desde el A.

Yo soy el que busca el trivial y leo E+. Pegué una ojeada, descarte F,G,H,I y me puse a leer primero el J y como parecía hard volví al E.

Llega el primer solve del C, y lo mandamos a Mariano a pensarlo. En eso Martín me cuenta el L diciendo que parecía de mi onda, lo pienso y me pareció idéntico a un problema que ya había pensado, por lo que me puse a codear algo "esperando a ver si entraba". Mando y metó un TLE completamente ilógico. Releó el código y veo que había cerrado mal una llave, que pajero. Lo arreglo, mando y metemos el L!

Brasil festejando nuestro RTE
Marian tenía el C y entra a codearlo, Tin estaba leyendo el K y yo me pongo a pensar el E. Me pareció que era para el Marian, vuelvo a pensar el J pero no llego a nada, anotó que es Hard y lo dejo. A todo esto el Marian producto de sus nervios iniciales mando un RTE por hacer algo con complejidad exponencial, con la presión de que la gente lo metía.


Resumen (a la 0:30) - (45avos - 5tos LATAM)
A: Math-Bardo.
B: No leído.
C: Codeando/Debugueando (Marian) (40 AC)
D: No leído.
E: Math-a la espera de Marian (3 AC)
F: No leido
G: No leído
H: No leído
I: No leído
J: Pensando (Pablo).
K: Pensando (Tin).
L: AC
M: La idea está pero hay que codearlo y es una paja (Tin)

Por suerte se ordenó, y sumado a que nadie lo molestaba porque no se nos ocurría una puta idea, metió el AC con lo que subimos momentaneamente a la zona de medallas. So, entra el C. Yo me había puesto a leer el D, y Tin el K. Le cuento al Marian el E, y se me ocurre la idea del D. Como la máquina estaba vacía me la iba a poner a codear, pero yo no soy el coder así que le pregunto a Tin si estaba con alguna idea o le contaba el D. Estaba bloqueado con el K, por lo que le cuento la solución del D por arriba pero le digo que se lo ponga a ver él porque no lo había leído completo. A todo esto el Marian me cuenta su idea del E pero era una fruta que en el podía tardar 10^18. Nos lo ponemos a pensar juntos (que es algo que no solemos hacer antes de la primer hora mucho pero dado la presión inicial valió la pena) y se me ocurre una idea pero que había que codear algo del diego que podía llegar a tardar como 20 minutos. El Marian me da el visto bueno y cómo la máquina estaba desocupada, Marian me deja el E y se pone a pensar el G que lo venían metiendo. Yo me pongo a copiar lo que teníamos en el diego (ese nombre le ponemos a los algoritmos que llevamos impresos en papel) hasta que termino y Tin estaba pseudocodeando el D.

Resumen (a la 1:00) - (27avos - LATAM Champions)
A: No leído bien, parece para Pablo.
B: No leído. (1 AC)
C: AC
D: Pseudocodeando (Tin)
E: Codeando el Diego (Pablo) (18 AC)
F: No leido
G: Pensando (Marian) (5 AC)
H: No leído
I: No leído
J: Dejado, Med/Hard.
K: Leído. (2 AC)
L: AC
M: La idea está pero hay que codearlo y es una paja (Tin)

Cuando termino de codear, Tin se pone a codear el D, mientras yo imprimo lo del diego y Marian entra a revisarme el código (cosa clave que otro revise lo del diego, en este caso me arreglo mínimo como 5 errores de tipeo) y yo a pseudocodear la otra parte del E. A todo esto Marian tenía la idea del G, me la cuenta diciendome que es algo que nunca habíamos codeado. Yo le dije que no había apuro porque teníamos dos problemas , y como la máquina de repente estaba a full se pone a pseudocodear la idea en papel. Muchas veces es más rápido escribir en papel que frente a una computadora y es algo que no muchos equipos hacen.  

Estar frente a la compu te pone presión de que tenés que hacer cosas útiles porque la estás ocupando. Nuestro método de laburo era generalmente cooperativo: Siempre que se podía se pseudocodeaba los detalles finos en papel, la máquina solo se usa para codear y si alguien quiere debuguear lo hace en papel salvo que nadie más necesite codear. Meter los problemas rápido siempre fue sólo de prioridad baja. Nuestra regla número 1 siempre fue no dejar la máquina sin uso.

Por mi parte, yo me pongo a codear lo que queda del E, intermitentemente con Tin que iba codeando partes del D (que era de implementación) entonces codeaba un rato cada uno mientras el otro revisaba su código y pseudocodeaba nuevas partes. Esto estuvo bueno porque yo estaba ansioso y desordenado y no podía codear bien mis ideas del E. Las salidas esporádicas me ayudaban a repensar que tenía que ir haciendo. Mariano termina de pseudocodear el G, y como la máquina estaba a full se pone a pensar el K que era el próximo por subs.

Resumen (a la 1:30) - (39avos - LATAM Champions)
A: No leído bien, parece para Pablo. (2 AC)
B: No leído. (4 AC)
C: AC
D: Codeando/Debugueando (Tin) (1 AC)
E: Codeando/Debugueando (Pablo) (45 AC) 
F: No leido
G: Pseudocodeado (Marian) (15 AC)
H: No leído
I: No leído
J: Dejado, Med/Hard.
K: Pensando (Marian). (7 AC)
L: AC
M: La idea está pero hay que codearlo y es una paja (Tin)


Este momento fue clave en la competencia, porque estábamos con 3 ideas y una sola computadora, Martín estaba luchando con el D y yo con el E hacía ya un tiempito. Mi programa ya estaba todo codeado pero yo estaba trabado sinceramente porque no entendía que estaba haciendo (el problema E tenía sus vueltitas en el medio de los nervios de la competencia) entonces salí y lo deje a Martín mientras volvía a repensar todo. Ordené mis ideas, y cuando Martín salió a pensar, cambié una línea y de repente todo dio. Lo mande con mucho miedo ya que había muchos WAs y no confiaba en mi overkill pero dio AC! Gol de media cancha y entró el Marian porque Martín estaba viendo porque no le daban los ejemplos. Mientras tanto yo me puse a leer el A que Marian dijo que parecía Matemático y Martín encuentra un errorcito en el D pero no entra a codear porque el Marian estaba en la compu y se pone a leer el K que era el próximo.

Resumen (a las 2:00) - (39avos - LATAM Champions)
A: Leyendo/Entendiendo (Pablo) (4 AC)
B: No leído. (9 AC)
C: AC
D: A la espera (Tin) (3 AC)
E: AC
F: No leido
G: Codeando (Marian) (26 AC)
H: No leído
I: No leído
J: Dejado, Med/Hard.
K: Pensando (Tin) (16 AC)
L: AC
M: La idea está pero hay que codearlo y es una paja (Tin)

Mientras Mariano codeaba el G, a mi se me ocurre una idea del A pero que necesitaba una mano de los pibes, por lo que me pongo a pseudocodear mi parte (en papel). Mientras analizo el código, me doy cuenta que ni siquiera necesito ayuda de los pibes, porque el problema parecía trivial. A todo esto seguíamos punteros y con 3 ideas así que veníamos bárbaro. Marian se traba con el G y entra el Tin que en 5 minutos arregla el D, manda y otro AC! Festeja Calove y entro yo a pseudocodear mi parte del A alternadamente con el Marian. Martín vuelve a pensar el fatídico K.

Resumen (a las 2:30) - (34avos - LATAM Champions)
A: Codeando (Pablo) (6 AC)
B: No leído. (15 AC)
C: AC
D: AC
E: AC
F: No leido
G: Codeando (Marian) (44 AC)
H: No leído
I: No leído
J: Dejado, Med/Hard.
K: Pensando (Tin). (28 AC)
L: AC
M: La idea está pero hay que codearlo y es una paja (Tin)

Yo termino de codear el A, lo mando y me como un WA completamente desmotivante. Mientras Mariano seguía viendo el G, me llega la impresión (Regla de Oro: Cada vez que se manda un problema se imprime y recién se ve el resultado cuando llega la impresión), releo el enunciado y descubro un detallecito, por lo que vuelvo a entrar, cambio una constante, mando y llega el AC! Alto grito metí acá. Marian también termina de codear y manda y otro AC! Miro a Latinoamérica: Pernambuco y Campina Grande estaban con 4 y después todos 3 para abajo y nosotros teníamos 6. Estábamos 14avos y podíamos llegar a pelear medalla! Estuvimos 2 minutos congelados en un estado de shock hasta que finalmente nos sentamos a analizar.
Caloventor mete el G y queda arriba

El K no salía, me lo cuentan y no era mi onda. Martín se pone a leer el B que era el otro que alguien había metido y el resto de los problemas no tenían ningún AC. El B no lo entendíamos, Marian sigue pensando el K, Martín se lee el I y lo anota como EL HARD y yo el H. Acá la máquina no estaba siendo usada. Terminamos de entender el B y se me ocurre la parte trivial y lo mando a codear a Martín. Esta creo fue una decisión erronea, tendríamos que haber codeado el M que ya lo teníamos pensado y sabíamos como salía. Creo que nos asustó que nadie lo haya metido y me parece que nos apuramos por tener la máquina ocupada en lugar de analizar mejor. Ahí le cuento el problema B al Marian, me dijo que conocía el problema pero que no sabía como se resolvía, malísima noticia. Se nos ocurren una ideas para optimizar y lo dejo porque el me dijo que ya tenía una idea.

Resumen (a las 3:00) - (18avos - LATAM Champions)
A: AC
B: Codeando (Tin), Pensando (Marian). (24 AC)
C: AC
D: AC
E: AC
F: No leido
G: AC
H: Leyendo (Pablo)
I: Dejado, HARD.
J: Dejado, Med/Hard.
K: Leyendo/Pensando (Pablo). (38 AC)
L: AC
M: La idea está pero hay que codearlo y es una paja (Tin).

Mientras los pibes estaban con el B, yo me pongo a ver un panorama general de la prueba, ya que el B y el K no nos estaban saliendo y nadie había metido nada más. Leo el H y se me ocurren unas ideas que le cuento a Tin y definimos dejarlas por ser Geométrico y re bardero. Vuelvo y me pongo a pensar el K desganado (no es el tipo de problema que yo suelo hacer). Pruebo un par de casos y se me ocurre una idea loca y extraña! Los pibes estaban laburando en el B y le cuento mi idea a Tin que no me entiende nada (producto de mi quemadez, estuvimos como 1 o 2 minutos), entonces me enojo y me pongo a codearla yo. Los pibes mientras tanto buscaban como arreglar la segunda parte del B, que tenía que salir porque lo metían toooodos (error). Llega el primer AC del F, pero ya es tarde... No tenía sentido leer ese problema.

Resumen (a las 3:30) - (22avos - LATAM Champions)
A: AC
B: Pensando como codear una parte (Tin y Marian). (28 AC)
C: AC
D: AC
E: AC
F: No leido, dejado. (1 AC)
G: AC
H: Dejado por Geometría HARD
I: Dejado, HARD.
J: Dejado, Med/Hard.
K: Codeando (Pablo). (46 AC)
L: AC
M: La idea está pero hay que codearlo y es una paja (Tin).

Faltando una hora y media, y sin muchas ideas concretas, redujimos la prueba a B,K,M, lo cuál es bueno porque no tiene sentido pensar tantos problemas al final (3 sería lo máximo en hora y media). Mi análisis de la situación es que había que meter 8 para ser Latam porque teníamos buena penalidad y 9 para la medalla, entonces estaba apurado para meter B y K.

Acá yo me pongo a codear la parte borde del K y le pido ayuda al Marian para codear la parte de la simulación trivial. Le cuento mi solución así no más y lo que él tenía que hacer que parecía una boludés pero yo no podía hacer ni un for. Marian se lo pone a hacer. Mientras tanto mandamos las primera subs del B que nos dan WA (que estábamos seguros que era error en la idea del Marian). Desgraciadamente había un error en el Dijkstra pero no se porque no nos dimos cuenta y nadie releyó el código. Yo estaba casi seguro que la idea del Marian estaba bien pero no dije nada porque estaba con el K, desgraciadamente también estaba mal. Cuestión, priorizamos meter el K.

Resumen (a las 4:00) - (28avos - LATAM Champions)
A: AC
B: WA (-2) Debugueando (Tin). (39 AC)
C: AC
D: AC
E: AC
F: No leido, dejado. (2 AC)
G: AC
H: Dejado por Geometría HARD
I: Dejado, HARD.
J: Dejado, Med/Hard. (1 AC)
K: Codeando (Marian y Pablo). (55 AC)
L: AC
M: La idea está pero hay que codearlo y es una paja (Tin). (1 AC)

El equipo en los últimos momentos
Mandamos por primera el K y WA. Marian se pone a recodear su parte mientras Martín se pone a intentar arreglar el B. Acá pasamos un tiempito debugueando ambos códigos. Yo pruebo un par de casos en el K y dan mal. Mandamos el K con la nueva parte del Marian y otro WA. Vuelvo a probar los mismos casos. Daban mal, y estábamos tan en cualquiera que ni habíamos probado los casos. Mientras tanto Martín entraba a ver cosas del B.

A las 4:30, luego de casi 2 horas sin meter ningún AC, charlamos 10 segundos y metemos una buena decisión y dejamos el B bajando nuestras espectativas (nunca repensadas) de 9 y medalla que teníamos hace 2 horas y apuntando a, al menos, meter 7. Yo encuentro un error en mi parte, puteo, la arreglo y con el nuevo código del Marian daba cualquier cosa. Pruebo con el viejo y da bien. Mando y WA!!! Marian me putea y dice que usemos su nueva parte, nos ponemos a debuguear y era una boludés, arreglamos, mandamos y AC!!!!
Otro grito de gol pero que no se grita para que nadie de latinoamérica sepa que metimos el 7mo y especule. Quedaban 16 minutos donde teníamos que meter el B para asegurar el Latam Champions. Nunca nos pusimos a ver el dijkstra del B. Nos pusimos a codear una idea fruta y mandamos 13 submissions probando cosas. Todas WA en la parte trivial del Dijkstra, ja.


Terminamos con 7 problema sobre 13, 32avos del mundo y Campeones Latinoamericanos (42avos quedo también con 7 el equipo de Pernambuco que si no metíamos el K nos hubiese ganado y Campina Grande quedó con 6).

http://myicpc.icpcnews.com/World-Finals-2016/scoreboard

Caloventor recibiendo el Latam Champions

3 comentarios:

  1. Muy bueno Caloventor!!

    Son buenas decisiones y malas decisiones, relatadas en el marco de una final. Cosas que por ahí salen de saber o no los algoritmos.

    ResponderBorrar
    Respuestas
    1. Me parece bien lo que comentás. Quería agregar que los problemas a los que se enfrentan en este tipo de competencias no son algoritmos que aparecen en libros ni se dan en una carrera: no se pueden saber con antelación. La ICPC trata sobre modificar o combinar algoritmos ya existentes y por sobre todo CREAR nuevos, algo que no es para nada fácil como se puede apreciar. Por esta razón no basta con "saber" los algoritmos conocidos, sino que es necesario entenderlos en profundidad. Es muy diferente a solo saber lo que hace o a implementar lo. Por ejemplo yo puedo buscar una receta para una torta por Internet, pero solo me va a servir para hacer esa torta y no mucho más. Un chef entiende más profundamente el tema en el sentido que sabe qué pasos puede alterar, que ingredientes puede agregar a la receta, con que otros platos queda bien y el por qué de cada acción. Con los algoritmos pasa lo mismo, en las carreras se suele hacer mucho énfasis en dar las recetas y no tanto en lo demás. Esta es una de las razones por las que considero a la ICPC como un complemento a la educación universitaria, uno haciendo esto no solo tiene una lista de recetas para problemas específicos . Uno aprende a aplicar la verdadera versatilidad detrás de lo que se enseña, y no a ser un mero libro de recetas.

      Borrar
  2. Genial! motiva muchisimo y se aprende de estas experiencias relatadas, gracias por contarlo che, saludos!

    ResponderBorrar