Coding Challenge à Graz : Et le gagnant est..
Lors des Journées Linux de Graz, grommunio a organisé un défi de codage très apprécié. Sur les 23 participants, 9 ont réussi à présenter des résultats probants. Le grand gagnant, tiré au sort, est venu chercher son prix au bureau de grommunio.

Fabian Ortner de grommunio présente une toute nouvelle PlayStation 5 de Sony, d’une valeur de près de 700 euros, à l’heureux gagnant Andreas.
Cela semble assez simple, n’est-ce pas ?
“Pour cette tâche, vous devez écrire du code C/C++ dans le fichier \src\main.cpp pour résoudre le défi de codage à la fin de ce fichier Readme. MinGW64 est utilisé avec gcc/g++ 15.2, qui est automatiquement installé dans un répertoire local et peut être utilisé à l’aide des commandes suivantes. ”
Ce qui peut sembler incompréhensible pour de nombreuses personnes non spécialisées ne semble pas difficile pour les programmeurs - du moins à première vue. En principe, les quatre tâches proposées par grommunio étaient certainement réalisables, et 23 experts de Linux ont donc relevé le défi un samedi d’avril à Graz.
La programmation sous la pression du temps
De nombreux participants ont eu du mal à respecter le temps imparti pour trouver la bonne solution à l’aide d’un code qu’ils avaient eux-mêmes écrit. L’estimation initiale de 20 minutes s’est avérée beaucoup trop optimiste ; même dans les 40 dernières minutes allouées, seuls 9 participants ont été en mesure de trouver des solutions correctes.
En conséquence, les deux machines Windows spécialement préparées à Graz ont été occupées presque continuellement le samedi, avec plus de sept heures allouées au défi lui-même.
L’installation du Coding Challenge
les employés de grommunio avaient créé de nouveaux comptes d’utilisateur sur les ordinateurs, configuré VSCode comme éditeur et automatisé diverses commandes via des scripts Windows cmd afin d’accélérer le processus de compilation et de soumission.
coding Challenge - code](/img/posts/26-05-15_Coding-Challenge_code.webp)
Un participant réussit à relever le défi avec les outils fournis par grommunio.
“Nous avons mis en place un petit point d’accès HTTP qui, associé à un script shell sur les ordinateurs du défi, nous a permis de générer des entrées personnalisées pour chaque participant sur la base de son adresse électronique, puis de répondre par un retour d’information sur ses tentatives de résolution du problème ”, explique Fabian Ortner de grommunio (photo ci-dessus). “Un fichier Readme a ensuite fourni une description plus détaillée de ce qu’il fallait faire pour la tâche de programmation, et un processus automatisé assez simple a donc été créé pour rendre la participation aussi facile que possible ”
Mais la partie “aussi simple que possible” n’a pas duré longtemps. Pour le défi, les participants devaient réparer un serveur de messagerie défaillant en écrivant un petit script de conversion. Dans le README, la première des quatre tâches à résoudre commence par :
“Il semble que chaque ligne contienne un multiple entier de 8 caractères, alors essayons de les interpréter comme des octets individuels. Par exemple:
*010001000101000101001010 0x44 0x51 0x4A 010001000101000001001100 => 0x44 0x50 0x4C 010000100101000101001100 0x42 0x51 0x4C *
Nous savons que l’ancien serveur de messagerie utilisait une méthode de cryptage très simple après l’exportation du courrier électronique:
- Prendre chaque ligne de texte, c’est-à-dire chaque octet
- *Pour chaque ligne, effectuer un chiffrement XOR avec la clé `grommunio`, caractère par caractère
- Si une ligne est plus longue que la clé, appliquez simplement la clé à nouveau, en commençant par le premier caractère. ”
D’autres exigences et tâches ont suivi, qui ont vraiment fait tourner la tête des participants. Seuls quelques participants ont réussi à trouver les bonnes solutions.
Mais même ceux qui n’ont pas réussi avaient de quoi se réjouir : à la fin, un tirage au sort parmi tous les participants a permis de déterminer qui recevrait la PlayStation promise. Le gagnant, Andreas, a été invité à venir la chercher au 30e étage de la DC Tower à Vienne, au siège de grommunio.
La solution ? Elle ne sera pas publiée ici, mais le fichier README contenant l’énoncé complet du problème est disponible sous ce billet. Sans le serveur construit par grommunio pour les [Graz Linux Days] (https://www.linuxtage.at/en/), il faudra cependant faire preuve d’un peu d’imagination..
Pour en savoir plus sur grommunio aux Journées Linux de Graz, consultez cet [article] (/blog/graz-linux-days-2026-with-grommunio-talks/).
Instructions pour le défi de codage
Ce défi vous demande d’écrire du code C/C++ dans .\src\main.cpp pour résoudre le défi à la fin de ce readme. Il utilise MinGW64 avec gcc/g++ 15.2 qui est installé automatiquement dans un répertoire local et peut être utilisé avec les commandes suivantes.
Il y a quatre commandes importantes pour le script inclus :
1. Pour enregistrer votre adresse e-mail et démarrer la minuterie de 20 minutes :
.\glt.cmd start
2. Pour construire votre code :
.\glt.cmd build
3. Pour compiler et exécuter votre code et imprimer sa sortie dans le terminal :
.\glt.cmd build_and_run
4. Pour compiler, exécuter et soumettre votre solution :
.\glt.cmd submit
La commande utilisée pour construire votre solution n’a pas d’optimisations activées par défaut :
g++.exe -static -O0 -g -std=c++17 src\main.cpp -o build/app.exe
Défi
Pour commencer le challenge, d’abord mettez votre adresse E-Mail dans le fichier user.txt et ensuite utilisez la commande start pour obtenir votre contribution. Nous ne l’utilisons que pour vous contacter au cas où vous gagneriez le tirage au sort. Vous n’avez qu’à changer la variable result dans votre code et ensuite exécuter la commande submit pour vérifier si tout est correct.
WOW. Qu’est-il arrivé à ce message pendant la migration ? L’un de vos courriels a été corrompu lors de l’installation de votre nouveau serveur de messagerie. Il semble n’être constitué que de symboles binaires répartis sur quelques lignes (votre entrée). Il semble y avoir un multiple entier de 8 symboles par ligne, alors essayons de les interpréter comme des octets individuels. Essayons donc de les interpréter comme des octets individuels :
010001000101000101001010 0x44 0x51 0x4A 010001000101000001001100 => 0x44 0x50 0x4C 010000100101000101001100 0x42 0x51 0x4C
Nous savons que l’ancien serveur de messagerie utilisait un cryptage très simple après l’exportation de l’e-mail :
- Prendre chaque ligne de texte, c’est-à-dire chaque octet
- XOR chaque ligne avec la clé grommunio caractère par caractère
- Si une ligne est plus longue que la clé, il suffit de réutiliser la clé à partir du premier caractère.
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
Cela semble déjà plus prometteur, mais il y a encore beaucoup de caractères en désordre..
Auparavant, l’ancien serveur de messagerie avait déjà des problèmes avec les décalages sur les valeurs de caractères individuels, le décalage dépendant de deux choses :
- Une somme de contrôle horizontale de votre adresse électronique
- l’index du caractère dans une ligne et le numéro de ligne dans lequel il se trouve
À l’époque, le serveur calculait une somme de contrôle horizontale en additionnant simplement toutes les valeurs d’octets de votre adresse électronique.
max.mustermann@grommunio.com => (m=109) + (a=97) + (x=120) + … = 2888
Ensuite, pour chaque caractère, son déplacement positif a été calculé en prenant le checksum modulo sa position dans la ligne. Pour corriger cette erreur, nous devons donc soustraire les valeurs de décalage de chacun des octets. De plus, ces décalages sont ensuite décalés d’un caractère vers la gauche après chaque ligne.
0x23 - (2888 % 1) = ’#’ 0x23 - (2888 % 2) = ’#’ 0x25 - (2888 % 3) = ’#’ 0x23 - (2888 % 2) = ’#’ 0x25 - (2888 % 3) = ’#’ 0x23 - (2888 % 2) = ’#’ 0x22 - (2888 % 3) = ’ ’ 0x25 - (2888 % 1) = ’#’ 0x23 - (2888 % 3) = ’#’ 0x23 - (2888 % 1) = ’#’ 0x25 - (2888 % 2) = ’#’
Cela ressemble à un message correct ! Mais pour nous assurer que l’algorithme est correct, nous devons calculer le produit élément par élément des valeurs de décalage multipliées par les valeurs de chaque caractère-clé utilisé et les additionner pour chaque caractère # du message. (\n et \r` doivent être rejetés)
(g=103)\N0 + (r=114)\N0 + (o=111)\N2
- (g=103)\N0 + (o=111)\N0
- (g=103)\N- 2 + (r=114)\N- 0 + (o=111)\N- 0 = 428
Vous devez écrire cette somme de produits élémentaires dans la variable résultat pour terminer le défi de codage !