Muchos programadores piensan que enfrentarse a un reto extremo es muy complicado, lleva muchísimo tiempo y está al alcance de muy pocos. Pero no es así. Lo más importante es proponérselo, dar el primer paso y sobre todo divertirse. El primero igual no lo ganas, pero es que lo más importante no es eso, es aprender. En esta charla te doy las claves imprescindibles para tirarte a la piscina. Merece la pena. No tienes nada que perder y todo que ganar
2. ¿Por qué participar?
● ¡Premios!
● Promoción personal
● Conocer gente, socializar
● Aprender y mejorar
● ¡Es divertido!
Concursos extremos
de programación
#ETSChallenge
3. ¡Es hora de probar su efectividad en Chimpancés!
El origen del planeta de los simios
“Un grupo de investigación secreto está desarrollando
un nuevo fármaco que aumenta significativamente la
inteligencia.”
Problema 1
#ETSChallenge
4. El origen del planeta de los simios
● Todos los interruptores están inicialmente ON
● La caja se abrirá cuando estén todos OFF
● El interruptor de la derecha se puede conmutar siempre
● Cualquier otro interruptor se puede conmutar, si y sólo si,
su interruptor de la derecha está ON y el resto OFF
● Irremediablemente queremos abrir la caja cuanto antes
...
Objetivo: Mínimo número de conmutaciones para N interruptores
#ETSChallenge
6. El origen del planeta de los simios
def minMovements= { numSwitches ->
BigInteger result
switch (numSwitches) {
case 1:
result = 1
break
case 2:
result = 2
break
default:
result = 2 * minMovements(numSwitches -2) + minMovements(numSwitches -1) +1
break
}
result
}
2(N-2) + (N-1) + 1
Complejidad:
O(2n
)
O(n)
}.memoize()
#ETSChallenge
7. ¡Es hora de probar su efectividad!
Love is in the air
Problema 2
#ETSChallenge
“Partimos del axioma (no probado) de que ligar es
cuestión de probabilidad. Aprovechemos San Valentín
para enviar masivamente flores con un dron antes de
que se termine la batería”.
8. Love is in the air
● Un mapa bidimensional indica los N objetivos amorosos
● La batería permite un número limitado de movimientos
● Buena época, la ciudad está plagada de rosas.
● Parar a por una rosa nos supone un coste despreciable
● Existe espacio aéreo reservado o infranqueable
Objetivo: Movimientos mínimos para optimizar entregas
#ETSChallenge
9. Love is in the air
X X X X X X X X X X
X T O O O O O O T X
X X X X O O X X X X
X T O O O O O O T X
X X X X O D X X X X
X T O O O O O O T X
X X X X O O X X X X
X T O O O O O O T X
X X X X T T X X X X
X X X X X X X X X X
T = Objetivo
X = Infranqueable
O = Espacio aéreo
D = Dron#ETSChallenge
10. X T O O O O O O T X
X X X X O O X X X X
X T O O O O O O T X
X X X X O D X X X X
X T O O O O O O T X
X X X X O O X X X X
X T O O O O O O T X
X X X X T T X X X X
Grafo totalmente conexo
Nodos = D y T
Coste de NodoA a NodoB = camino más corto de A a B (Dijkstra)
Love is in the air
#ETSChallenge
11. Love is in the air
El problema del
viajante
NP - COMPLETO
#ETSChallenge
12. ● Casos pequeños: Fuerza bruta
● Heurísticas o subóptimos
○ El vecino más próximo a mi posición
○ El vecino más próximo a mi y más lejano a meta
○ ...
● Encontrar subproblemas para los cuales heurísticas
mejores o algoritmos exactos son posibles
○ Combinación de heurísticas y fuerza bruta
■ Ramificación y acotación
■ Reordenamiento parcial
■ ...
Love is in the air
El problema del
viajante
NP - COMPLETO
#ETSChallenge
14. Entiende el entorno
● Entiende la evaluación de la competición
○ Número de problemas
○ Puntuación de cada problema
○ Exactitud de las soluciones
○ Importancia de la velocidad de entrega
○ Condiciones bloqueantes
● Comprende qué evalúa cada problema
○ La exactitud es lo más importante
○ Limpieza de código
○ Complejidad computacional
○ Uso de memoria
● Lee (al menos) 5 veces el enunciado
Afrontando
competiciones
❏ El envoltorio
❏ Lenguajes
❏ I / O
❏ Generalizando retos
#ETSChallenge
15. ¿Qué lenguaje escoger?
● Depende del problema concreto a resolver
● Suelen ser buenos...
○ Lenguajes de alto nivel que permiten scripting
○ Poco verbosos
○ Con excelente manejo de colecciones
○ Capacidades funcionales (pattern matching)
○ Vitaminados
● Por ejemplo:
○ python, groovy, haskell, scala,...
Afrontando
competiciones
❏ El envoltorio
❏ Lenguajes
❏ I / O
❏ Generalizando retos
#ETSChallenge
16. Entrada / salida
● El formato de entrada/salida es importante
○ Entrada por fichero
○ Entrada por línea de comando
○ Consumición de API
○ Función y test
● Ojo con entradas grandes
○ Problemas de rendimiento
○ Desbordamiento de memoria
Afrontando
competiciones
❏ El envoltorio
❏ Lenguajes
❏ I / O
❏ Generalizando retos
#ETSChallenge
17. Entrada / salida por fichero
● Input
2
5
4 4
O O O X
O X O X
O X O X
M X B X
10
4 4
O O O M
O X O X
M X O X
O X B X
● Output
NO
9
Afrontando
competiciones
❏ El envoltorio
❏ Lenguajes
❏ I / O
❏ Generalizando retos
#ETSChallenge
18. Resumiendo
● Tipos de retos
○ Transformaciones I/O
○ Manejo de colecciones
○ Relaciones de recurrencia
○ Pattern matching
○ Problemas N-P
○ Encriptación
● ¡Ojo!
○ Testing de extremos
○ Int overflow
○ Desbordamiento de memoria
○ Complejidad computacional exponencial
Afrontando
competiciones
❏ El envoltorio
❏ Lenguajes
❏ I / O
❏ Generalizando retos
#ETSChallenge