Este programa usa um par de [respostas dos alunos, respostas corretas] como entrada e usa espaços para indicar uma resposta ausente.
Este programa usa alguns formatos de entrada internos bizarros para acompanhar o que está acontecendo, por isso daremos um passo de cada vez.
Z
Isso transpõe a entrada; portanto, terminaremos com uma lista de 25 elementos, um para cada pergunta; cada elemento tem a forma [resposta do aluno, resposta correta]. Indicaremos um elemento deste formulário com uma letra maiúscula; Apara a pergunta 1, Bpara a pergunta 2 e assim por diante. Portanto, as respostas estão atualmente sendo armazenadas como
ABCDEFGHIJKLMNOPQRSTUVWXY
m0
Esta é uma operação "maior palíndromo"; anexamos o reverso do valor atual ao próprio valor, produzindo o seguinte:
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ṁ135
O ṁoperador (molde) faz várias coisas, mas, nesse contexto, efetivamente pega os primeiros 135 elementos da lista infinita produzidos, acrescentando o valor atual a si mesmo repetidamente. Isso nos dá o seguinte (que dividimos em grupos de 50 elementos por conveniência; esta é apenas uma lista de 135 pares internamente):
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
µ;
µdefine o valor atual como o novo padrão para os operandos ausentes. Em seguida, vemos imediatamente um componente que está faltando um operando; ;acrescenta, mas não especificamos com o que anexar. Como resultado, o valor atual é anexado ao valor do último µ(que também é o valor atual), fornecendo o seguinte valor atual de 270 elementos:
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQP
t€⁶
Lembre-se de que todas as letras maiúsculas acima representam pares de [resposta do aluno, resposta correta]. A t€⁶operação opera em cada ( €) par e exclui ( t) espaços ( ⁶) de ambos os lados do par (ou seja, qualquer espaço que apareça no par). Portanto, ainda temos a mesma lista complicada de 270 perguntas com muitas repetições, mas elas têm a forma [resposta correta] (o aluno não respondeu) ou [resposta do aluno, resposta correta] (o aluno respondeu).
E€’
A E€’operação também opera em cada €elemento ( ) e, devido ao uso de E, substitui o elemento por 1 se todos os elementos forem iguais (ou seja, o aluno não respondeu ou acertou a pergunta) ou 0, se não todos. os elementos são iguais (ou seja, o aluno respondeu, mas errou a pergunta). O uso de ’aqui altera a numeração, o que significa que agora usamos -1 ou 0, respectivamente. Usarei letras minúsculas para esse novo tipo de elemento, que usa -1 para uma resposta que seria penalizada se estivesse em uma pergunta elegível à penalidade ou 0 para uma resposta correta ou ausente:
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqp
;E€
Já vimos tanto E€e ;antes; estamos acrescentando algo ao valor atual e usando o formato 1 se todos os elementos forem iguais ou 0 se alguns forem diferentes (não ’desta vez!). Há um operando ausente aqui, então usamos o valor do último µ(ou seja, a saída da etapa 3). Na etapa 3, não havíamos excluído espaços dos elementos, portanto, teremos 1 para uma resposta correta ou 0 para uma resposta incorreta ou ausente (porque um espaço não corresponde à resposta correta). A partir de agora, usarei letras maiúsculas para este formato 1 = correto, 0 = incorreto / ausente e continuarei a usar letras minúsculas para 0 = correto / ausente, -1 = incorreto. O valor resultante possui 405 elementos e se parece com isso:
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQP
ṫ⁹
Aí vem a incrível coincidência que mencionei anteriormente. Antes de falar sobre esse trecho do código, quero fazer um balanço de onde devemos chegar.
Cada letra maiúscula representa +1 para uma resposta correta; as 15 primeiras perguntas ( Aa O) aparecem 5 vezes cada na string e as últimas 10 perguntas ( Pa Y) aparecem 6 vezes cada. Essa parte não é realmente mágica; Eu o projetei dessa maneira quando escolhi o número 135 no início do programa (que é 5 × 15 + 6 × 10), e o único golpe de sorte aqui é que 5 passa a ser um número ímpar (então são os últimos 10 perguntas que acabam aparecendo nos horários extras, em vez dos 10 primeiros). As 15 letras imediatamente anteriores a isso contêm patravés t(as questões de penalidade -1) uma vez e uatravés y(as questões de penalidade -2) duas vezes. Isso também não é muita coincidência; porque nós usamosm0anteriormente, as cópias extras das perguntas estão na ordem PQRSTUVWXYYXWVUTSRQPe as perguntas posteriores ocorrerão naturalmente perto do meio dessa sequência (portanto, fazer as últimas 15 perguntas "extras" fornecerá menos repetições para as próximas às bordas; e é claro que não é surpresa que as perguntas "extras" venham por último).
Como cada letra minúscula subtrai 1 da pontuação para uma resposta incorreta e ausente, e cada letra maiúscula adiciona 1 à pontuação para uma resposta correta, portanto, precisamos simplesmente usar os últimos 135 + 15 = 150 elementos para obter cada tipo de elemento o número correto de vezes. O comando de Jelly para obter uma substring no final de uma lista é ṫ; no entanto, não especifica o número de elementos que você deseja, mas o índice do primeiro elemento que você deseja. Temos 405 elementos neste momento e queremos 150, portanto, precisamos começar no índice (405 - 150 + 1) ou 256. Em uma incrível coincidência, 256 passa a ser o número de octetos distintos que existem e, portanto, tem uma breve representação em Jelly (⁹) Havia muito pouco que eu pudesse fazer para que isso acontecesse; a etapa 4 adicionou outros 135 elementos ao início da lista para atingir o número da rodada, mas o fato de serem 135 elementos que eu tinha que adicionar (um valor que estava prontamente disponível naquele ponto do programa) era realmente conveniente, com basicamente qualquer outro número sendo completamente inútil nessa situação.
Aqui está como o valor interno parece agora:
uvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
S
Por fim, agora temos uma lista de modificações na pontuação das perguntas, tudo o que precisamos fazer é somar e usar S.