Este programa toma un par de [respuestas del estudiante, respuestas correctas] como entrada y usa espacios para indicar una respuesta que falta.
Este programa utiliza algunos formatos de entrada internos extraños para realizar un seguimiento de lo que está sucediendo, por lo que lo haremos paso a paso.
Z
Esto transpone la entrada, por lo que terminaremos con una lista de 25 elementos, uno para cada pregunta; cada elemento tiene la forma [respuesta del alumno, respuesta correcta]. Indicaremos un elemento de este formulario con una letra mayúscula; Apara la pregunta 1, Bpara la pregunta 2, y así sucesivamente. Entonces las respuestas se almacenan actualmente como
ABCDEFGHIJKLMNOPQRSTUVWXY
m0
Esta es una operación de "mayor palíndromo"; agregamos el reverso del valor actual al valor en sí mismo, produciendo esto:
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ṁ135
El ṁoperador (molde) hace una serie de cosas, pero en este contexto, toma efectivamente los primeros 135 elementos de la lista infinita producidos al agregar el valor actual a sí mismo repetidamente. Eso nos da lo siguiente (que he dividido en grupos de 50 elementos por conveniencia; esto es solo una lista de 135 pares internamente):
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
µ;
µestablece el valor actual como el nuevo valor predeterminado para los operandos faltantes. Entonces vemos de inmediato una construcción que le falta un operando; ;agrega, pero no hemos especificado con qué agregar. Como resultado, el valor actual se agrega al valor del último µ(que también es el valor actual), dándonos el siguiente valor actual de 270 elementos:
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQP
t€⁶
Recuerde que todas las letras mayúsculas arriba representan pares de [respuesta del estudiante, respuesta correcta]. La t€⁶operación opera en cada ( €) par y elimina ( t) espacios ( ⁶) de cualquier lado del par (es decir, cualquier espacio que aparezca en el par). Así que todavía tenemos la misma lista enrevesada de 270 preguntas con muchas repeticiones, pero son de la forma [respuesta correcta] (el estudiante no respondió) o [respuesta del estudiante, respuesta correcta] (el estudiante sí respondió).
E€’
La E€’operación también opera en cada €elemento ( ) y, debido al uso de E, reemplaza el elemento con 1 si todos los elementos son iguales (es decir, el estudiante no respondió o respondió correctamente), o 0 si no todos los elementos son iguales (es decir, el alumno respondió pero se equivocó). El uso de ’aquí cambia la numeración, lo que significa que ahora usamos -1 o 0 respectivamente. Usaré letras minúsculas para este nuevo tipo de elemento, que usa -1 para una respuesta que sería penalizada si se tratara de una pregunta elegible para penalización, o 0 para una respuesta faltante o correcta:
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqp
;E€
Hemos visto ambos E€y ;antes; estamos agregando algo al valor actual, y estamos usando un formato de 1 si todos los elementos son iguales, o 0 si algunos son diferentes (¡no ’esta vez!). Aquí falta un operando, por lo que usamos el valor del último µ(es decir, la salida del paso 3). En el paso 3, no habíamos eliminado espacios de los elementos, por lo que tendremos 1 para una respuesta correcta o 0 para una respuesta incorrecta o faltante (porque un espacio no coincidirá con la respuesta correcta). De ahora en adelante, usaré letras mayúsculas para este formato 1 = correcto, 0 = incorrecto / faltante, y continuaré usando letras minúsculas para 0 = correcto / faltante, -1 = incorrecto. El valor resultante tiene 405 elementos, y se ve así:
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQP
ṫ⁹
Aquí viene la sorprendente coincidencia que mencioné anteriormente. Antes de hablar sobre este fragmento de código, quiero hacer un balance de dónde tenemos que llegar.
Cada letra mayúscula representa +1 para una respuesta correcta; las primeras 15 preguntas ( Ahasta O) aparecen 5 veces cada una en la cadena, y las últimas 10 preguntas ( Phasta Y) aparecen 6 veces cada una. Esa parte no es realmente mágica; Lo diseñé de esa manera cuando elegí el número 135 anteriormente en el programa (que es 5 × 15 + 6 × 10), y el único golpe de suerte aquí es que 5 es un número impar (así que son los últimos 10 preguntas que terminan apareciendo los tiempos extra, en lugar de los primeros 10). Las 15 letras inmediatamente anteriores a este contienen pa través de t(las -1 preguntas de penalización) una vez, y ua través de y(preguntas el -2 de penalización) dos veces. Eso tampoco es una gran coincidencia; porque usamosm0anteriormente, las copias adicionales de las preguntas están en el orden PQRSTUVWXYYXWVUTSRQP, y las preguntas posteriores ocurrirán naturalmente cerca del medio de esa cadena (por lo tanto, tomar las últimas 15 preguntas "adicionales" dará menos repeticiones a las que están cerca de los bordes; y por supuesto, no es una sorpresa que las preguntas "adicionales" sean las últimas).
Debido a que cada letra minúscula resta 1 del puntaje para obtener una respuesta incorrecta y no falta, y cada letra mayúscula agrega 1 al puntaje para obtener una respuesta correcta, por lo tanto, simplemente necesitamos tomar los últimos 135 + 15 = 150 elementos para obtener cada tipo de elemento el número correcto de veces. El comando de Jelly para obtener una subcadena al final de una lista es ṫ; sin embargo, no especifica la cantidad de elementos que desea, sino el índice del primer elemento que desea. Tenemos 405 elementos en este punto, y queremos 150, por lo que necesitamos comenzar en el índice (405 - 150 + 1), o 256. En una sorprendente coincidencia, 256 es el número de octetos distintos que existen, y por lo tanto tiene una breve representación en Jelly (⁹) Había muy poco que pudiera hacer para que esto sucediera; el paso 4 agregó otros 135 elementos al comienzo de la lista para alcanzar el número redondo, pero el hecho de que fueran 135 elementos que tuve que agregar (un valor que estaba fácilmente disponible en ese punto del programa) fue realmente conveniente, básicamente, cualquier otro número es completamente inútil en esta situación.
Así es como se ve el valor interno ahora:
uvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
S
Finalmente, ahora tenemos una lista de modificaciones al puntaje de las preguntas, todo lo que tenemos que hacer es sumarlas usando S, y hemos terminado.