Coding Challenge in Graz: Und der Gewinner ist…

15. Mai 2026 | Blog

Coding Challenge in Graz: Und der Gewinner ist…

Auf den Grazer Linuxtagen hat grommunio eine vielbeachtete Coding Challenge veranstaltet. Von den 23 Teilnehmern konnten 9 erfolgreiche Ergebnisse präsentieren, Den Hauptgewinn konnte der durchs Los bestimmte Gewinner jetzt im grommunio-Büro abholen.

grommunio - Coding Challenge Gewinner
Fabian Ortner von grommunio übergibt die nagelneue Sony Playstation 5 im Wert von knapp 700 Euro an den glücklichen Gewinner Andreas.

Die Aufgabenstellung klingt doch ganz einfach, nicht wahr?

„Für diese Aufgabe ist in der Datei \src\main.cpp C/C++-Code zu schreiben, um die Coding Challenge am Ende dieser Readme-Datei zu lösen. Es wird MinGW64 mit gcc/g++ 15.2 verwendet, das automatisch in einem lokalen Verzeichnis eingerichtet wird und mit den folgenden Befehlen genutzt werden kann.“

Was für Normalsterbliche unverständlich klingen mag, scheint für Programmierer auf den ersten Blick nicht schwer, auch die folgenden vier Aufgaben die grommunio eingebaut hat, waren wohl prinzipiell durchaus lösbar, so dass sich 23 Linux-Profis an einem Aprilsamstag in Graz an die Challenge machten.

Unter Zeitdruck programmieren

Dabei hatte so mancher Teilnehmer mit dem Zeitlimit zu kämpfen, innerhalb dessen die passende Lösung mit selbst geschriebenen Code zu finden war. Die anfangs angenommenen 20 Minuten erwiesen sich als viel zu optimistisch, auch innerhalb der letztendlich 40 vorgegebenen Minuten konnten nur 9 von 23 Teilnehmern korrekte Lösungen finden.

Damit waren die beiden eigens präparierten Windows-Maschinen am Samstag in Graz fast durchgehend belegt, mehr als sieben Stunden waren für die Challenge selbst verbucht.

Das Coding Challenge Setup

Auf den Rechnern hatten grommunio-Mitarbeiter neue User angelegt, VSCode als Editor und diverse Kommandos via Windows cmd skripts automatisiert, um das kompilieren und submitten zu beschleunigen.

grommunio - Coding Challenge Code
Ein Teilnehmer beim erfolgreichen Abschluss der Challenge, hier mit den vorgegebenen Hilfsprogrammen.

„Wir haben einen kleinen HTTP-Endpoint vorbereitet, der es in Kombination mit einem Shell-Skript auf den Challenge-Rechnern ermöglicht hat, individualisierten Input für jeden Teilnehmer anhand seiner E-Mail Adresse zu generieren und dann entsprechend mit Feedback auf Lösungsversuche zu antworten.“ erklärt Fabian Ortner von grommunio (im Bild oben). „In einem Readme gab es dann noch eine genauere Beschreibung, was bei der Programmieraufgabe zu tun war und so war ein recht simpler, automatisierter Prozess geschaffen, um die Teilnahme möglichst einfach zu gestalten.“

Das „so einfach wie möglich“ endete aber schnell. Für die Challenge mussten die Teilnehmer die Fehlfunktion eines Mailservers durch ein kleines Konvertierungsskript fixen. Im Readme beginnt der erste Teil von vier zu lösenden Aufgaben mit:

„Es scheint pro Zeile ein ganzzahliges Vielfaches von 8 Zeichen zu geben, also versuchen wir, diese als einzelne Bytes zu interpretieren. Zum Beispiel:

010001000101000101001010 		0x44 0x51 0x4A
010001000101000001001100 => 0x44 0x50 0x4C
010000100101000101001100 0x42 0x51 0x4C

Wir wissen, dass der alte Mailserver nach dem Export der E-Mail eine sehr einfache Verschlüsselung verwendet hat:

  • Nimm jede Textzeile, d. h. jedes Byte
  • Führe für jede Zeile eine XOR-Verschlüsselung mit dem Schlüssel `grommunio` Zeichen für Zeichen durch
  • Wenn eine Zeile länger als der Schlüssel ist, wende den Schlüssel einfach erneut an, beginnend mit dem ersten Zeichen.“

Damit nicht genug, es folgen weitere Anforderungen und Aufgaben, die die Köpfe zum Rauchen brachten, sodass sich nur 9 Teilnehmer mit richtigen Lösungen durchsetzen konnten.

Doch auch die nicht erfolgreichen konnten hoffen, weil unter allen Teilnehmern am Ende das Los darüber entschied, wer die versprochene Playstation bekommen sollte – abzuholen im 30. Stock der Donautowers in Wien.

Die Lösung? Wird hier nicht veröffentlicht, aber das Readme mit der kompletten Aufgabenstellung gibt es hier unter diesem Post. Ohne den für die Grazer Linuxtage gebauten Server von grommunio braucht es allerdings ein wenig Phantasie…

Erfahren Sie mehr über grommunio bei den Grazer Linuxtagen in diesem Artikel.


Coding Challenge Instructions

This challenge requires you to write some C/C++ code inside .\src\main.cpp to solve the challenge at the end of this readme. It uses MinGW64 with gcc/g++ 15.2 which is set up automatically in a local directory and can be used with the following commands.

There are four important commands for the included script:

1. To Register your E-Mail address and start the 20min timer:

.\glt.cmd start

2. To just build your code:

.\glt.cmd build

3. To build and run your code and print it’s output to the terminal:

.\glt.cmd build_and_run

4. To build, run and submit your solution:

.\glt.cmd submit

The command used to build your solution has no optimizations enabled by default:

g++.exe -static -O0 -g -std=c++17 src\main.cpp -o build/app.exe

Challenge

To start the challenge, first put your E-Mail address in the user.txt file and then use the start command to get your input. We only use it, to contact you in case you win the drawing. You only need to change the result variable in your code and then run the submit command to check whether it is correct.

WOW. What happened to that E-Mail during migration? Somehow one of your E-Mails got corrupted during the setup of your new mail server. It seems to only consist of binary symbols split into a few lines (your input). There seems to be an integer multiple of 8 symbols per line, so let’s try interpreting them as individual bytes. For example:

010001000101000101001010      0x44 0x51 0x4A
010001000101000001001100 => 0x44 0x50 0x4C
010000100101000101001100 0x42 0x51 0x4C

We know that the old mail server used a really simple encryption after exporting the Email:

  • Take each line of text, i.e. each byte
  • XOR each line with the key grommunio character-wise
  • If a line is longer than the key, simply reuse the key starting from the first character.
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

That looks more promising already, but still there are many messed up characters…

In earlier times the old mailserver already had problems with offsets on individual character values, with the offset depending on two things:

  • horizontal checksum of your E-Mail address
  • the index of the character in a line and the line number it is in

At the time, the server calculated a horizontal checksum, by simply adding all byte values of your E-Mail address together.

[email protected] => (m=109) + (a=97) + (x=120) + ... = 2888

Then, for each character, it’s positive offset was calculated by taking the checksum modulo it’s position in the line. To correct this error we therefore have to subtract the offset values from each of the bytes. Additionally these offsets are then shifted left by one character after each line.

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) = '#

Now this looks like a correct message! But to ensure we have a correct algorithm, we need to calculate the element-wise product of the offset values times the character-values of each used key-character and sum them up for each #-character in the message. (\n and \r should be discarded)

    (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

You need to write this sum of element-wise products to the result variable to finish the Coding Challenge!

Good Luck!

Archiv