Pular para o conteúdo
Blog

Desafio de codificação em Graz: E o vencedor é..

· por grommunio
Desafio de codificação em Graz: E o vencedor é..

No Graz Linux Days, a grommunio organizou um desafio de codificação altamente aclamado. Dos 23 participantes, 9 conseguiram apresentar resultados bem-sucedidos. O vencedor do grande prêmio, selecionado por sorteio, já retirou seu prêmio no escritório da grommunio.

Desafio de codificação - vencedor
Fabian Ortner, da grommunio, apresenta um Sony PlayStation 5 novinho em folha, no valor de quase 700 euros, ao sortudo vencedor Andreas.

Na verdade, parece bem simples, não é?

“Para esta tarefa, você precisa escrever código C/C++ no arquivo \src\main.cpp para resolver o Coding Challenge no final deste arquivo Leiame. É usado o MinGW64 com gcc/g++ 15.2, que é automaticamente configurado em um diretório local e pode ser usado com os seguintes comandos. ”

O que pode parecer incompreensível para muitas pessoas não técnicas não parece difícil para os programadores, pelo menos à primeira vista. Em princípio, as quatro tarefas que grommunio incluiu eram certamente solucionáveis e, portanto, 23 especialistas em Linux aceitaram o desafio em um sábado de abril em Graz.

Programação sob pressão de tempo

Muitos participantes tiveram dificuldades com o limite de tempo dentro do qual deveriam encontrar a solução correta usando o código que eles mesmos haviam escrito. A estimativa inicial de 20 minutos se mostrou otimista demais; mesmo nos 40 minutos finais alocados, apenas 9 participantes conseguiram encontrar soluções corretas.

Como resultado, as duas máquinas Windows especialmente preparadas em Graz foram ocupadas quase que continuamente no sábado, com mais de sete horas alocadas para o desafio em si.

A configuração do Coding Challenge

os funcionários da grommunio criaram novas contas de usuário nos computadores, configuraram o VSCode como editor e automatizaram vários comandos por meio de scripts cmd do Windows para acelerar o processo de compilação e envio.

Desafio de codificação - código
Um participante que concluiu com êxito o desafio com as ferramentas fornecidas pela grommunio.

“Configuramos um pequeno endpoint HTTP que, combinado com um script de shell nos computadores do desafio, nos permitiu gerar entradas personalizadas para cada participante com base em seu endereço de e-mail e, em seguida, responder com feedback sobre suas tentativas de resolver o problema ”, explica Fabian Ortner da grommunio (foto acima). “Um arquivo Leiame forneceu uma descrição mais detalhada do que precisava ser feito para a tarefa de programação e, assim, foi criado um processo bastante simples e automatizado para facilitar ao máximo a participação. ”

Mas a parte do “o mais simples possível” não durou muito tempo. Para o desafio, os participantes teriam que consertar um servidor de e-mail com mau funcionamento escrevendo um pequeno script de conversão. No README, a primeira das quatro tarefas a serem resolvidas começa com:

“Parece que cada linha contém um múltiplo inteiro de 8 caracteres, portanto, vamos tentar interpretá-los como bytes individuais. Por exemplo:

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

Sabemos que o antigo servidor de e-mail usava um método de criptografia muito simples depois de exportar o e-mail:

  • Pegue cada linha de texto, ou seja, cada byte
  • *Para cada linha, execute uma criptografia XOR com a chave `grommunio`, caractere por caractere
  • Se uma linha for maior do que a chave, simplesmente aplique a chave novamente, começando pelo primeiro caractere. ”

Seguiram-se mais requisitos e tarefas que realmente fizeram suas cabeças girarem. Apenas alguns participantes conseguiram encontrar as soluções corretas.

Mas mesmo aqueles que não tiveram sucesso tinham algo pelo que esperar: no final, um sorteio aleatório entre todos os participantes determinou quem receberia o PlayStation prometido. O vencedor, Andreas, foi convidado a buscá-lo no 30º andar da DC Tower em Viena, na sede da grommunio.

A solução? Ela não será publicada aqui, mas o arquivo README com a declaração completa do problema está disponível abaixo desta publicação. No entanto, sem o servidor criado por grommunio para o Graz Linux Days, será necessário um pouco de imaginação..

Saiba mais sobre o grommunio no Graz Linux Days neste artigo.


Instruções do desafio de codificação

Este desafio requer que você escreva algum código C/C++ dentro de .\src\main.cpp para solucionar o desafio no final deste leia-me. Ele usa o MinGW64 com o gcc/g++ 15.2, que é configurado automaticamente em um diretório local e pode ser usado com os seguintes comandos.

quatro comandos importantes para o script incluído:

1. Para registrar seu endereço de e-mail e iniciar o cronômetro de 20 minutos:

.\glt.cmd start

2. Para apenas criar seu código:

.\glt.cmd build

3. Para compilar e executar seu código e imprimir sua saída no terminal:

.\glt.cmd build_and_run

4. Para compilar, executar e enviar sua solução:

.\glt.cmd submit

O comando usado para criar sua solução não tem otimizações ativadas por padrão:

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

Challenge

Para iniciar o desafio, primeiro coloque seu endereço de e-mail no arquivo user.txt e, em seguida, use o comando start para obter sua entrada. Só o usaremos para entrar em contato com você caso ganhe o sorteio. Você só precisa alterar a variável result em seu código e, em seguida, executar o comando submit para verificar se está correto.

UAU. O que aconteceu com aquele e-mail durante a migração? De alguma forma, um de seus e-mails foi corrompido durante a configuração de seu novo servidor de e-mail. Ele parece consistir apenas de símbolos binários divididos em algumas linhas (sua entrada). Parece haver um múltiplo inteiro de 8 símbolos por linha, portanto, vamos tentar interpretá-los como bytes individuais. Por exemplo:

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

Sabemos que o servidor de correio antigo usava uma criptografia muito simples depois de exportar o e-mail:

  • Pegar cada linha de texto, ou seja, cada byte
  • Faça o XOR de cada linha com a chave de caracteres grommunio
  • Se uma linha for maior que a chave, basta reutilizar a chave a partir do primeiro caractere.
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

Isso já parece mais promissor, mas ainda há muitos caracteres confusos..

Antigamente, o antigo servidor de e-mail já tinha problemas com deslocamentos em valores de caracteres individuais, com o deslocamento dependendo de duas coisas:

  • Uma soma de verificação horizontal do seu endereço de e-mail
  • o índice do caractere em uma linha e o número da linha em que ele se encontra

Na época, o servidor calculava uma soma de verificação horizontal, simplesmente somando todos os valores de bytes do seu endereço de e-mail.

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

Em seguida, para cada caractere, seu deslocamento positivo foi calculado considerando o checksum módulo de sua posição na linha. Para corrigir esse erro, precisamos subtrair os valores de deslocamento de cada um dos bytes. Além disso, esses deslocamentos são então deslocados para a esquerda em um caractere após cada linha.

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

Agora, essa parece ser uma mensagem correta! Mas, para garantir que temos um algoritmo correto, precisamos calcular o produto do elemento-sábio dos valores de deslocamento vezes os valores de caractere de cada caractere-chave usado e somá-los para cada caractere #\ na mensagem. (\ne\r` devem ser descartados)

    (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

Você precisa escrever essa soma de produtos de elementos com seno na variável de resultado para concluir o desafio de codificação!

Boa sorte!