Questo programma accetta come input una coppia di [risposte dello studente, risposte corrette] e utilizza gli spazi per indicare una risposta mancante.
Questo programma utilizza alcuni bizzarri formati di input interni per tenere traccia di ciò che sta accadendo, quindi faremo un passo alla volta.
Z
Questo traspone l'input, quindi finiremo con un elenco di 25 elementi, uno per ogni domanda; ogni elemento ha la forma [risposta dello studente, risposta corretta]. Indicheremo un elemento di questo modulo con una lettera maiuscola; Aper la domanda 1, Bper la domanda 2 e così via. Quindi le risposte sono attualmente archiviate come
ABCDEFGHIJKLMNOPQRSTUVWXY
m0
Questa è un'operazione "maggiore palindromo"; aggiungiamo il contrario del valore corrente al valore stesso, producendo questo:
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ṁ135
L' ṁoperatore (stampo) fa una serie di cose, ma in questo contesto prende effettivamente i primi 135 elementi della lista infinita prodotta aggiungendo ripetutamente il valore corrente a se stesso. Questo ci dà quanto segue (che ho suddiviso in gruppi di 50 elementi per comodità; questo è solo un elenco di 135 coppie internamente):
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
µ;
µimposta il valore corrente come nuovo predefinito per operandi mancanti. Vediamo quindi immediatamente un builtin in cui manca un operando; ;aggiunge, ma non abbiamo specificato cosa aggiungere. Di conseguenza, il valore corrente viene aggiunto al valore a partire dall'ultimo µ(che è anche il valore corrente), dandoci il seguente valore corrente di 270 elementi:
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQP
t€⁶
Ricorda che tutte le lettere maiuscole sopra rappresentano coppie di [risposta dello studente, risposta corretta]. L' t€⁶operazione opera su ciascuna €coppia ( ) ed elimina ( t) spazi ( ⁶) da entrambi i lati della coppia (ovvero qualsiasi spazio che appare nella coppia). Quindi abbiamo ancora lo stesso elenco contorto di 270 domande con molte ripetizioni, ma sono nella forma [risposta corretta] (lo studente non ha risposto) o [risposta dello studente, risposta corretta] (lo studente ha risposto).
E€’
L' E€’operazione opera anche su ciascun €elemento ( ) e, a causa dell'uso di E, sostituisce l'elemento con 1 se tutti gli elementi sono uguali (ovvero lo studente non ha risposto o ha risposto correttamente alla domanda), o 0 se non tutti i gli elementi sono uguali (cioè lo studente ha risposto ma ha sbagliato la domanda). L'uso di ’qui cambia la numerazione, il che significa che ora utilizziamo rispettivamente -1 o 0. Userò lettere minuscole per questo nuovo tipo di elemento, che usa -1 per una risposta che sarebbe penalizzata se fosse su una domanda ammissibile a penalità, o 0 per una risposta mancante o corretta:
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqp
;E€
Abbiamo visto entrambi E€e ;prima; stiamo aggiungendo qualcosa al valore corrente e stiamo usando un formato 1 se tutti gli elementi sono uguali o 0 se alcuni sono diversi (no ’questa volta!). C'è un operando mancante qui, quindi usiamo il valore come l'ultimo µ(ovvero l'output del passaggio 3). Nel passaggio 3, non avevamo eliminato gli spazi dagli elementi, quindi avremo 1 per una risposta corretta o 0 per una risposta errata o mancante (perché uno spazio non corrisponde alla risposta corretta). Da ora in poi, userò lettere maiuscole per questo 1 = corretto, 0 = formato errato / mancante e continuerò a usare lettere minuscole per 0 = corretto / mancante, -1 = errato. Il valore risultante ha 405 elementi e si presenta così:
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQP
ṫ⁹
Ecco la sorprendente coincidenza di cui ho parlato prima. Prima di parlare di questo pezzetto di codice, voglio fare un bilancio di dove dobbiamo arrivare.
Ogni lettera maiuscola rappresenta +1 per una risposta corretta; le prime 15 domande ( Aattraverso O) appaiono 5 volte ciascuna nella stringa e le ultime 10 domande ( Pattraverso Y) appaiono 6 volte ciascuna. Quel po 'non è davvero magico; L'ho progettato in quel modo quando ho scelto il numero 135 in precedenza nel programma (che è 5 × 15 + 6 × 10), e l'unico colpo di fortuna qui è che 5 sembra essere un numero dispari (quindi è l'ultimo 10 domande che finiscono per apparire i tempi supplementari, piuttosto che i primi 10). Le 15 lettere immediatamente precedenti il presente contengono pattraverso t(i -1 domande penalità) una volta, e uattraverso y(domande -2 di penalità) due volte. Anche questa non è una coincidenza; perché abbiamo usatom0prima, le copie extra delle domande sono nell'ordine PQRSTUVWXYYXWVUTSRQPe le domande successive si presentano naturalmente vicino al centro di quella stringa (quindi prendere le ultime 15 domande "extra" darà meno ripetizioni a quelle vicino ai bordi; e ovviamente, non è una sorpresa che le domande "extra" arrivino per ultime).
Poiché ogni lettera minuscola sottrae 1 dal punteggio per una risposta errata e non mancante e ogni lettera maiuscola aggiunge 1 al punteggio per una risposta corretta, pertanto è necessario semplicemente prendere gli ultimi 135 + 15 = 150 elementi per ottenere ogni tipo di elemento il numero corretto di volte. Il comando di Jelly per ottenere una sottostringa alla fine di un elenco è ṫ; tuttavia, non specifica il numero di elementi desiderati, ma piuttosto l'indice del primo elemento desiderato. A questo punto abbiamo 405 elementi e ne vogliamo 150, quindi dobbiamo iniziare dall'indice (405 - 150 + 1) o 256. In una sorprendente coincidenza, 256 sembra essere il numero di ottetti distinti che esistono, e quindi ha una breve rappresentazione in Jelly (⁹). C'era ben poco che potessi fare per farlo accadere; il passaggio 4 ha aggiunto altri 135 elementi all'inizio dell'elenco per raggiungere il numero rotondo, ma il fatto che fossero 135 elementi che dovevo aggiungere (un valore che era prontamente disponibile in quel punto del programma) era davvero conveniente, con praticamente qualsiasi altro numero completamente inutile in questa situazione.
Ecco come appare il valore interno ora:
uvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
S
Infine, ora abbiamo un elenco di modifiche al punteggio ottenuto dalle domande, tutto ciò che dobbiamo fare è sommarle usando S, e il gioco è fatto.