Se realiza la 1era Competencia Peruana de Informática Online en omegaUp

1ra Competencia Peruana de Informática Online
1ra Competencia Peruana de Informática Online

El pasado domingo 28 de mayo de 2017 se realizó la 1era Competencia Peruana de Informática Online (CPIO). Organizada por la Federación Olímpica Peruana de Informática (FOPI), la CPIO es la primera competencia en su tipo que convoca a alumnos pre-universitarios de todo el Perú para conformar la delegación peruana rumbo a la Competencia Iberoamericana de Informática y Computación (CIIC) 2017.

Fundada en diciembre de 2016 por Aldo Culquicondor, Edson Ticona, Jonathan Quispe, L. Rodolfo Nájera, Raúl Gallegos, Rodolfo Mercado y Yesica Aquino, la FOPI busca fomentar la informática competitiva pre-universitaria, apoyando a los niños y jóvenes peruanos a desarrollarse en este ámbito, preparando una delegación que represente al Perú y consolide logros internacionales.

La CPIO es una competencia multi-nivel de programación para jóvenes peruanos, con habilidades de resolución de problemas mediante el análisis, la lógica, el ingenio y la implementación de soluciones en un computador. El concurso realizado en omegaUp contó con la participación de competidores de las principales ciudades peruanas: Arequipa, Callao, Chepen, Cusco, Ica, Lima, Piura, Pucallpa, Puno y Tacna.

Al ser la primera competencia de programación competitiva en el Perú, se espera que CPIO marque el inicio del desarrollo de la informática en los jóvenes peruanos y como consecuencia un mejor desarrollo tecnológico en aquel país sudamericano, mencionó Aldo P. Culquicondor Ruiz, presidente de la FOPI.

Luego de la competencia, quedaron seleccionados ocho competidores para representar al Perú en la CIIC el próximo 10 de junio: Joaquin Rodrigo Palma Ugarte y Stheven Julmar Quispe Llamocca de Arequipa, Anthony Dante Yataco Torres y Nicolas Ticona Valdivia de Lima, Carlos Daniel Ramos Arellano de Piura, Johan Frank Cachicatari Ticona y Marcela Veronica Apaza Vilca de Puno y Roberto Carlos Huamán Rivera de Tacna.

Con la realización de esta competencia, la organización sin fines de lucro omegaUp da un paso importante para cumplir su objetivo de aumentar el número de ingenieros de software talentosos en todos los confines de América Latina.

Anunciando omegaUp Mentores

La misión de omegaUp es incrementar el número de ingenieros de software talentosos en América Latina, por lo que nos complace anunciar públicamente el programa omegaUp Mentores. El objetivo de este proyecto es ayudar a que nuestros usuarios más activos potencialicen sus habilidades, conectándolos con gente de experiencia que puedan servirles de guía para el desarrollo de su carrera profesional.

Para ello, omegaUp ofrecerá a los coders del mes la posibilidad de recibir mentoría personalizada de ingenieros de software voluntarios con experiencia internacional, habiendo laborado en las principales empresas de tecnología del mundo, tales como Microsoft, Facebook, Amazon, Google, entre otras. Además, el usuario galardonado se hará acreedor a un diploma y un premio que podrá ser de utilidad en su desarrollo técnico o académico.

Los ganadores interactúan con sus mentores mediante videollamadas y correos electrónicos. En el mes de Enero, el usuario Jorge Salazar Cruz, estudiante del CBTis 60 en Guanajuato, México, tuvo la oportunidad de hablar con Rafael Díaz, ingeniero de software en Microsoft.

Jorge Salazar (CBTIs 60) & Rafael Díaz (Microsoft)
Jorge Salazar (CBTIs 60) & Rafael Díaz (Microsoft)

Te invitamos a continuar resolviendo problemas en omegaUp para que obtengas más puntos en la plataforma y logres mejorar dia a dia. ¡Tú puedes ser el próximo Coder del mes!

Puedes encontrar más información de cómo se calcula el coder del mes en omegaUp aquí: https://blog.omegaup.com/2014/06/el-nuevo-ranking-de-omegaup/ . Para dudas y mayor información sobre este programa, puedes contactarnos en mentores@omegaup.com

Anunciando omegaUp Escuelas

Con el objetivo de continuar mejorando las habilidades de programación de los estudiantes, nos emociona anunciar el lanzamiento de un nuevo proyecto: omegaUp Escuelas.  Nuestro objetivo es llevar omegaUp a los salones de clases, creando una plataforma educativa, intuitiva y fácil de utilizar que se adapte a las necesidades de los profesores y estudiantes. La plataforma es una herramienta de aprendizaje que permite a los profesores enseñar a sus alumnos pensamiento algorítmico mediante la solución de problemas. Con ello, el estudiante desarrollará habilidades que le ayudarán en su crecimiento profesional.

paginaPrincipal

 

En omegaUp Escuelas, el profesor puede crear sus propios cursos con tareas y exámenes utilizando problemas propios o problemas públicos que ya existen en la plataforma. En el primer caso, el profesor puede hacer uso de los recursos que tenemos disponibles en omegaUp para publicar sus problemas. Esto le permitirá adaptar la plataforma a su curso y a las necesidades de sus estudiantes. Si el profesor opta por la segunda opción, éste contará con una clasificación de problemas por tema y por nivel. Así, él puede seleccionar con mayor facilidad los problemas que apoyen el proceso de aprendizaje de sus alumnos.editarCurso

 

Además, ahora los profesores pueden registrar a sus estudiantes en un curso y seguir su avance en las tareas y exámenes asignados. A fin de facilitar la tarea administrativa del profesor, este puede descargar la lista de estudiantes y su avance a una hoja de cálculo, que le permite realizar un análisis más detallado de su curso.

progresoEstudiantes

Con esta nueva iniciativa, los estudiantes cuentan con una plataforma más organizada donde pueden tener fácil acceso a sus tareas y exámenes además de revisar su avance general en tiempo real.

omegaUp Escuelas aún está en desarrollo, pero la versión beta ya está disponible. Actualmente, se están llevando a cabo pruebas piloto en dos escuelas: ITSUR y CBTis 217. Gracias a Luis Germán Gutiérrez Torres y sus estudiantes por ayudarnos en este proceso.

Cada día el número de organizaciones y escuelas que están probando omegaUp Escuelas está creciendo. La OMI está utilizando la plataforma para crear cursos de entrenamiento. En cuanto a escuelas, tenemos un total de 16 cursos creados. Gracias a todos ellos por darnos la oportunidad de apoyarlos en este proceso de enseñanza-aprendizaje.

Te invitamos a que visites omegaUp Escuelas y comiences a utilizarla. Si tienes alguna duda de cómo utilizarla, cómo incorporar la plataforma a tus clases, o si tienes algún comentario, escríbenos a escuelas@omegaup.org.

Hackathon omegaUp febrero 2017 – Resultados

En omegaUp organizamos nuestro primer Hackathon del año abierto al público, del 23 al 25 de Febrero pasados. Esta vez incluimos un divertido Bug Bash, donde invitamos a nuestros voluntarios a encontrar bugs dentro de omegaUp y reportarlos en github.

Agradecemos la participación de todos los voluntarios que estuvieron involucrados. Los resultados que tuvimos fueron muy positivos: 50 bugs nuevos fueron descubiertos en el Bug Bash y se completaron 17 pull requests, muchos de ellos arreglando bugs que se encontraron en el mismo evento.

rcrx y joemmanuel hackathoneando.
Rafael Díaz (rcxr) y Joe (joemmanuel) hackathoneando.

omegaUp ofreció como premio una tarjeta de regalo de Amazon a quién encontrara más bugs y otra más a quien reportara el bug más interesante. Felicitamos a pacopedraza por llevarse el premio. El ranking de más bugs reportados quedó así:

  1. rcxr* (15)
  2. erosethan** (13)
  3. alanboy* (12)
  4. pacopedraza (6)
  5. cruzjorgesalazar (1)

*No compite por premio por ser directivo de omegaUp for schools.
** Ganador del bug más interesante.

Y el ganador al bug más interesante por votación fue “Create course with no credentials does nothing” abierto por erosethan.

bestbug-hackathon20171

El Hackathon y el Bug Bash se concentró en el nuevo proyecto que estamos trabajando internamente para facilitar el uso de omegaUp.com en el salón de clases: omegaUp para escuelas. Los profesores que usan la plataforma podrán crear Cursos dentro de omegaUp.com con tareas y exámenes para facilitar la organización de sus clases. Estas nuevas funcionalidades estarán disponibles para el público en general más tarde este año.

Agradecemos a todos su participación para ayudar a omegaUp a cumplir su misión de incrementar el número de ingenieros de software talentosos en América Latina. Si te gustaría participar en futuros eventos, contáctanos en hello@omegaup.com.

 

OmegaUp Inc

Durante más de 5 años omegaUp ha sido un proyecto de medio tiempo para nosotros. Escribir nuevas funcionalidades es difícil ya que todos tenemos otras responsabilidades de tiempo completo. Así que hace 7 meses comenzamos a considerar la opción de formalizar nuestro proyecto y convertirnos en una organización establecida legamente, que nos permitiera recibir ingresos y contratar a desarrolladores que se dedicaran de tiempo completo a diseñar y mantener la plataforma.

Esta fue la primera reunión que tuvimos al respecto, donde analizamos las ventajas y desventajas de incorporarnos. A lo largo de los meses siguientes trabajamos revisando requerimientos legales, escribiendo nuestros by-laws y en general, estableciendo las bases de lo que sería OmegaUp como una entidad legal. Decidimos que una organización sin fines de lucro en Estados Unidos era lo más apropiado, tanto por la naturaleza de lo que hacemos, así como por nuestra ubicación física.

Después de mucho trabajo, el 7 de octubre del 2016 recibimos la confirmación por parte del IRS de que nuestra organización es exenta del impuesto federal bajo el IRC sección 501(c)(3). Esto significa que OmegaUp es reconocida como una caridad publica a nivel estatal y federal y por ende todos sus donantes pueden deducir de sus impuestos las contribuciones que hagan a OmegaUp. También nos califica para recibir legados, transferencias o regalos.

Como parte del proceso de incorporación, se formó un comité directivo cuya responsabilidad será la de mantener la salud, preservación y progreso de esta organización. Cada uno de los miembros del comité directivo representara los intereses de los donantes y de la gente beneficiada con este proyecto.

 Más información sobre la organizacion puede encontrarse en http://omegaup.org

 

Concursos recomendados

Respondiendo a los comentarios que hemos recibido sobre la organización de la lista de concursos en la Arena, hemos implementado el concepto de Concursos Recomendados:

Concursos recomendados

A partir de ahora tendremos una lista separada para los Concursos Recomendados actuales y pasados. Para pedir que tu concurso sea marcado como recomendado escribe un email a omegaup-soporte@googlegroups.com.

Los únicos requerimientos son:

  • Que el concurso sea formalmente establecido (sea parte de una olimpiada, concurso de ACM u algún otro concurso de programación).
  • Que el creador del concurso se comprometa a mantenerlo en buen estado respondiendo las clarificaciones que pueda.
  • Idealmente los Concursos Recomendados deben tener problemas nuevos aunque no es estrictamente necesario.
  • El tamaño del concurso no importa.
  • Concursos privados que cumplan estos requerimientos y que se planean hacer públicos posteriormente también cuentan.

Esperamos sus comentarios.

Invasion Zombie

Hola!, este es mi primer post en Omegaup y voy a describir mi solución para el problema Invasion zombie.

Hace un año encontré este problema, me pareció interesante y logre resolverlo, aunque algo tricky. Hace unos días me tope con este problema nuevamente y lo resolví por segunda ocasión, pero con una solución más simple, al menos eso creo.

Primer solución

La idea principal tanto en la primera como en la segunda solución es diseñar una función $latex f(d)$ que nos retorne el número de colonias infectadas después de $latex d$ días, nos interesa el mínimo valor de $latex d$ tal que el número de colonias infectadas sea mayor o igual a $latex C$. Una propiedad importante es la siguiente, $latex f(d)$ nunca decrece, es decir $latex f(d) <= f(d+1)$. Esta propiedad nos permite utilizar búsqueda binaria para encontrar las respuesta en $latex O(\lg_{2}(n))$.

Diseñar una función que determine el número de colonias infectadas, dependiendo del background de cada uno, es la parte interesante, y es donde difieren las dos versiones, bueno, un poco.

Este es el código de la primer versión, no voy a entrar en detalles porque ni yo me acuerdo bien que trucos aplique, pero la idea es parecida a la de la de la segunda versión, lo que cambia es la estrategia.

[gist https://gist.github.com/rendon/4298449a291244690253 ]

Segunda versión

Bueno, empecemos, trascurridos $latex d$ días, ¿cuántas colonias han sido infectadas?

Simulemos la invasión y veamos si podemos encontrar un patrón.

zombies-pattern

No es complicado llegar a la siguiente fórmula:

$latex f(d) = d^{2} + (d+1)^{2}$

Si el espacio de la ciudad fuese ilimitado nuestra función de verificación sería algo parecido a:

[gist https://gist.github.com/rendon/1308e65b73b82d452bba ]

Sin embargo, el espacio de la ciudad es limitado y habrá casos como los siguientes:

zombies-sc1

zombies-sc2

Entonces nuestro objetivo es encontrar el área delimitada por la ciudad (un cuadrado de N * N unidades), lo cual se pone un poco tricky. La siguiente imagen nos ayudará a entender el código de la solución sin entrar en tantas explicaciones.

zombies-solution

Es decir, el área total menos el área de los triángulos superior, inferior, izquierdo y derecho. Obsérvese que los triángulos pueden traslaparse y por lo tango estaríamos restando esas áreas 2 veces, por ello tenemos que calcular las áreas de traslape (nw, ne, se y sw en la imagen) y regresar lo a la suma total.

Lo que sigue es la implementación:

[gist https://gist.github.com/rendon/b65689354d202e562fe7 ]

Espero que les sea útil, dudas, comentarios o correcciones son bienvenidas.

Solución a “Splatoon”

Problema: Splatoon.

Este problema pide llevar a un inkling desde el inicio de una calle hasta el final siguiendo sus reglas de movimiento.

Ignoremos por un momento el hecho de que los inklings pueden pintar el piso y con ello alterar la calle en donde se realiza la carrera. Si los inklings no tuvieran esta habilidad, se puede hacer un algoritmo de fuerza bruta intentando todas las operaciones posibles, es decir, hacer una búsqueda en amplitud para encontrar el camino más corto, en donde el estado está representado únicamente por la posición en donde se encuentre el inkling.

Recuerda que en las búsquedas es importante marcar visitados para que la complejidad del algoritmo no se vuelva exponencial.

Para cada posición, se tienen dos posibles operaciones, saltar, o caminar, ambas toman 1 segundo y la distancia a la que se llega depende directamente del color sobre el que se está parado. El movimiento de saltar es muy fácil pues solo hay una casilla donde se puede caer, pero el movimiento de avanzar difiere cada vez pues depende directamente del color de las siguientes casillas.

Es posible hacer un ciclo para ver hasta donde puedes llegar avanzando desde la casilla en donde estás, y agregar a la búsqueda el lugar más lejano a donde puedas llegar. Sin embargo, si únicamente registramos la última casilla a donde se puede llegar, casos como el siguiente se nos escaparán:

En la solución superior, primero se avanza todo lo que se puede en la pintura naranja hasta llegar a la casilla azul, de ahi ya sea saltando o avanzando únicamente se puede llegar a la casilla blanca, y de ahí, no importa lo que hagas, te tomará dos segundos llegar al final.

En cambio, en la solución inferior, se avanza solo 3 casillas en la pintura naranja, lo cual es 1 casilla menos del máximo, de ahí se hace un salto el cual nos deja de nuevo en pintura naranja, desde donde podemos llegar caminando hasta el final en un total de tan solo 3 segundos, 1 segundo menos que la solución anterior.

Por lo tanto, no es suficiente visitar la distancia máxima, también hace falta visitar la distancia máxima – 1. Si intentamos hacer cosas similares con otro color de pintura, o más deteniéndonos todavía más atrás del máximo, no hay realmente ninguna ventaja, por lo que el caso presentado anteriormente es el único caso especial.

Una búsqueda en amplitud bien hecha que considere este caso sacará 30 puntos, una que no considere este caso sacará únicamente 5 puntos. Da perfectamente en tiempo y memoria porque a lo más tendremos un total de 1000 estados.
Sin embargo, la parte interesante de este problema es que los inklings son capaces de alterar el estado de la calle usando la pintura que traen en su tanque para poder recorrer más rápido la calle, utilizando hasta D disparos de tinta.

En este caso, necesitamos agregar una segunda dimensión al estado de nuestra búsqueda, ahora no sólamente es suficiente con guardar el lugar en donde estamos, sino que es necesario guardar también cuanta tinta queda en el tanque. En este caso, agregamos una operación más, la cual es pintar, la cual cuesta 0 segundos, nos avanza 0 casillas y nos quita una unidad D de pintura.

Si hacemos esto, nuestro espacio de búsqueda crece del N que era en la solución de 30 puntos, a N x D, lo cual es 1000 x 1000 y aún da en tiempo y memoria.

No obstante, la operación de pintar altera el mapa, por lo que si no guardamos también en el estado que las casillas siguientes ahora son de otro color, pintar no servirá de nada. Podríamos agregar una dimensión más a la búsqueda para considerar este caso, pero esto solo le agregaría complejidad innecesaria a la búsqueda.

La clave está en que pintar toma 0 segundos, por lo que podemos convertir la operación de pintar en una operación compuesta, que sea pintar y avanzar.

Pintar y avanzar toma 1 segundo, y nos permite avanzar 4 casillas hacia adelante siempre, por lo que hacer una operación de pintar y avanzar nos lleva del estado (i, d) al estado (i + 4, d – 1) con un costo de 1 segundo.

El detalle con esta solución, es que estamos ignorando de nuevo el caso especial explicado en la solución de 30 puntos, por lo que si se nos olvida que es posible ahorrarnos un segundo en ciertas ocasiones, sacaremos entre 35 y 90 puntos dependiendo de la implementación.

Para sacar los 100 puntos, es necesario agregar una operación más, la cual es pintar, avanzar y saltar, la cual nos lleva del estado (i, d),  al estado (i + 6, d – 1) con un costo de 2 segundos. Y como esta operación toma 2 segundos en vez de tan solo 1, no es suficiente con utilizar una cola común y corriente para hacer la búsqueda en amplitud, sino que es necesario utilizar una estructura de datos más avanzada, como una cola de prioridad o un montículo que nos ayude a ordenar los estados y elegir siempre con el tiempo más pequeño.