Coding Challenge en Graz: Y el ganador es..
En las Jornadas Linux de Graz, grommunio organizó un aclamado desafío de codificación. De los 23 participantes, 9 pudieron presentar resultados satisfactorios. El ganador del gran premio, elegido por sorteo, ya ha recogido su premio en la oficina de grommunio.

Fabian Ortner, de grommunio, entrega una flamante Sony PlayStation 5, valorada en casi 700 euros, al afortunado ganador, Andreas.
La verdad es que parece bastante sencillo, ¿no?
“Para esta tarea, necesitas escribir código C/C++ en el archivo \src\main.cpp para resolver el Desafío de Codificación al final de este archivo Léame. Se utiliza MinGW64 con gcc/g++ 15.2, que se configura automáticamente en un directorio local y se puede utilizar con los siguientes comandos ”
Lo que puede sonar incomprensible para muchas personas sin conocimientos técnicos no parece difícil para los programadores, al menos a primera vista. En principio, las cuatro tareas que grommunio había incluido eran ciertamente resolubles, por lo que 23 expertos en Linux aceptaron el reto un sábado de abril en Graz.
Programación bajo presión de tiempo
Muchos participantes tuvieron problemas con el límite de tiempo en el que tenían que encontrar la solución correcta utilizando código escrito por ellos mismos. La estimación inicial de 20 minutos resultó demasiado optimista; incluso en los 40 minutos finales asignados, sólo 9 participantes fueron capaces de encontrar soluciones correctas.
Como resultado, las dos máquinas Windows especialmente preparadas en Graz estuvieron ocupadas casi continuamente el sábado, con más de siete horas asignadas al reto en sí.
Configuración del desafío de codificación
los empleados de grommunio habían creado nuevas cuentas de usuario en los ordenadores, configurado VSCode como editor y automatizado varios comandos mediante scripts cmd de Windows para acelerar el proceso de compilación y envío.
coding Challenge - código](/img/posts/26-05-15_Coding-Challenge_code.webp)
Un participante completando con éxito el reto con las herramientas proporcionadas por grommunio.
“Creamos un pequeño punto final HTTP que, combinado con un script de shell en los ordenadores del reto, nos permitía generar entradas personalizadas para cada participante en función de su dirección de correo electrónico y, a continuación, responder con comentarios sobre sus intentos de resolver el problema ”, explica Fabian Ortner, de grommunio (en la foto de arriba). “A continuación, un archivo Léame proporcionaba una descripción más detallada de lo que había que hacer para la tarea de programación, y así se creó un proceso automatizado bastante sencillo para facilitar al máximo la participación ”
Pero lo de “lo más sencillo posible” no duró mucho. Para el reto, los participantes tenían que arreglar un servidor de correo que funcionaba mal escribiendo un pequeño script de conversión. En el LÉEME, la primera de las cuatro tareas a resolver comienza así:
“Parece que cada línea contiene un múltiplo entero de 8 caracteres, así que vamos a intentar interpretarlos como bytes individuales. Por ejemplo:
*010001000101000101001010 0x44 0x51 0x4A 010001000101000001001100 => 0x44 0x50 0x4C 010000100101000101001100 0x42 0x51 0x4C *
Sabemos que el antiguo servidor de correo utilizaba un método de cifrado muy sencillo después de exportar el correo electrónico:
- Toma cada línea de texto, es decir, cada byte
- Para cada línea, realiza una encriptación XOR con la clave “grommunio“, carácter por carácter
- Si una línea es más larga que la clave, simplemente aplica la clave de nuevo, empezando por el primer carácter. ”
Siguieron más requisitos y tareas que realmente hicieron girar sus cabezas. Sólo unos pocos participantes fueron capaces de dar con las soluciones correctas.
Pero incluso los que no lo consiguieron tuvieron algo que esperar: al final, un sorteo al azar entre todos los participantes determinó quién recibiría la PlayStation prometida. El ganador, Andreas, fue invitado a recogerla en la planta 30 de la Torre DC de Viena, en la sede de grommunio.
¿La solución? No se publicará aquí, pero el archivo README con el enunciado completo del problema está disponible debajo de este post. Sin embargo, sin el servidor construido por grommunio para los Graz Linux Days, hará falta un poco de imaginación..
Aprende más sobre grommunio en las Jornadas Linux de Graz en este artículo.
Instrucciones para el desafío de codificación
Este desafío requiere que escriba algo de código C/C++ dentro de .\src\main.cpp para resolver el desafío al final de este readme. Utiliza MinGW64 con gcc/g++ 15.2 que se configura automáticamente en un directorio local y se puede utilizar con los siguientes comandos.
Hay cuatro comandos importantes para el script incluido:
1. Para registrar su dirección de correo electrónico e iniciar el temporizador de 20 minutos:
.\glt.cmd start
2. Para construir su código:
.\glt.cmd build
3. Para compilar y ejecutar el código e imprimir su salida en el terminal:
.\glt.cmd build_and_run
4. Para construir, ejecutar y enviar su solución:
.\glt.cmd submit
El comando utilizado para construir su solución no tiene optimizaciones activadas por defecto:
g++.exe -static -O0 -g -std=c++17 src\main.cpp -o build/app.exe
Desafío
Para iniciar el reto, primero pon tu dirección de E-Mail en el archivo user.txt y luego usa el comando start para obtener tu entrada. Sólo la usaremos para ponernos en contacto contigo en caso de que ganes el sorteo. Sólo tienes que cambiar la variable result en tu código y luego ejecutar el comando submit para comprobar si es correcto.
WOW. ¿Qué le pasó a ese correo electrónico durante la migración? De alguna manera, uno de sus correos electrónicos se corrompió durante la configuración de su nuevo servidor de correo. Parece que sólo consiste en símbolos binarios divididos en unas pocas líneas (su entrada). Parece haber un múltiplo entero de 8 símbolos por línea, así que vamos a intentar interpretarlos como bytes individuales. Por ejemplo:
010001000101000101001010 0x44 0x51 0x4A 010001000101000001001100 => 0x44 0x50 0x4C 010000100101000101001100 0x42 0x51 0x4C
Sabemos que el antiguo servidor de correo utilizaba una encriptación muy simple después de exportar el Email:
- Tomar cada línea de texto, es decir, cada byte
- XOR cada línea con la clave grommunio carácter por carácter
- Si una línea es más larga que la clave, simplemente reutiliza la clave empezando por el primer carácter.
0x44 ^ g = 0x23 0x51 ^ r = 0x23 0x4A ^ o = 0x25 0x44 ^ g = 0x23 0x50 ^ r = 0x22 0x4C ^ o = 0x23 0x42 ^ g = 0x25 0x51 ^ r = 0x23 0x4C ^ o = 0x23
Esto ya parece más prometedor, pero todavía hay muchos caracteres desordenados..
En tiempos anteriores, el antiguo servidor de correo ya tenía problemas con las compensaciones en los valores de caracteres individuales, con la compensación en función de dos cosas:
- Una suma de comprobación horizontal de su dirección de E-Mail
- el índice del carácter en una línea y el número de línea en el que se encuentra
En ese momento, el servidor calculaba una suma de comprobación horizontal, simplemente sumando todos los valores de bytes de su dirección de correo electrónico.
max.mustermann@grommunio.com => (m=109) + (a=97) + (x=120) + … = 2888
Luego, para cada carácter, se calculó su desplazamiento positivo tomando la suma de comprobación módulo su posición en la línea. Para corregir este error, debemos restar los valores de desplazamiento de cada uno de los bytes. Además, estos valores se desplazan un carácter a la izquierda después de cada línea.
0x23 - (2888 % 1) = ’#’ 0x23 - (2888 % 2) = ’#’ 0x25 - (2888 % 3) = ’#’ 0x23 - (2888 % 2) = ’#’ 0x22 - (2888 % 3) = ’ ’ 0x25 - (2888 % 1) = ’#’ 0x23 - (2888 % 3) = ’#’ 0x23 - (2888 % 1) = ’#’ 0x25 - (2888 % 2) = ’#’
Esto parece un mensaje correcto Pero para asegurarnos de que tenemos un algoritmo correcto, tenemos que calcular el producto elemento-sabio de los valores de desplazamiento por los valores de carácter de cada carácter clave utilizado y sumarlos para cada carácter # del mensaje. (\ny\r` deben descartarse)
(g=103)\*0 + (r=114)\*0 + (o=111)\*2
- (g=103)*0 + (o=111)*0
- (g=103)*2 + (r=114)*0 + (o=111)*0 = 428
Tienes que escribir esta suma de productos elemento-sabio en la variable de resultado para terminar el Desafío de codificación