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.
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.
“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.
Há 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!