Эта программа принимает в качестве входных данных пару [ответы ученика, правильные ответы] и использует пробелы для обозначения пропущенного ответа.
Эта программа использует несколько причудливых внутренних форматов ввода для отслеживания происходящего, поэтому мы будем делать это шаг за шагом.
Z
Это транспонирует входные данные, поэтому мы получим список из 25 элементов, по одному на каждый вопрос; каждый элемент имеет форму [ответ ученика, правильный ответ]. Мы укажем элемент этой формы заглавной буквой; Aдля вопроса 1, Bдля вопроса 2 и так далее. Таким образом, ответы в настоящее время хранятся как
ABCDEFGHIJKLMNOPQRSTUVWXY
m0
Это операция "большего палиндрома"; мы добавляем обратное значение текущего значения к самому значению, получая это:
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ṁ135
Оператор ṁ(mold) делает несколько вещей, но в этом контексте он эффективно берет первые 135 элементов бесконечного списка, созданного путем многократного добавления текущего значения к себе. Это дает нам следующее (который я разбил на группы по 50 элементов для удобства; это всего лишь список из 135 пар внутри):
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
µ;
µустанавливает текущее значение как новое значение по умолчанию для пропущенных операндов. Затем мы сразу видим встроенный объект, в котором отсутствует операнд; ;добавляется, но мы не указали, что добавить. В результате текущее значение добавляется к последнему значению µ(которое также является текущим значением), давая нам следующее текущее значение из 270 элементов:
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
PQRSTUVWXYYXWVUTSRQP
t€⁶
Помните, что все заглавные буквы выше представляют пары [ответ учащегося, правильный ответ]. t€⁶Операция действует на каждой ( €пары), и удаляет ( t) пространств ( ⁶) с обеих сторон пары (т.е. любое пространство , которое появляется в паре). Таким образом, у нас все еще есть тот же запутанный список из 270 вопросов со многими повторениями, но они имеют форму [правильный ответ] (студент не ответил) или [ответ студента, правильный ответ] (студент ответил).
E€’
E€’Операция также действует на каждом ( €элементе), и, в связи с использованием E, заменяет элемент с 1 , если все элементы равны (т.е. ученик не ответил или получил право вопроса), или 0 , если не все элементы равны (то есть студент ответил, но неправильно понял вопрос). Использование ’здесь меняет нумерацию, что означает, что теперь мы используем -1 или 0 соответственно. Я буду использовать строчные буквы для этого нового вида элемента, который использует -1 для ответа, который был бы оштрафован, если бы он был на отвечающем штрафу вопросе, или 0 для пропущенного или правильного ответа:
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqp
;E€
Мы видели как E€и ;раньше; мы добавляем что-то к текущему значению и используем формат 1, если все элементы равны, или 0, если некоторые отличаются (нет, на ’этот раз!). Здесь пропущен операнд, поэтому мы используем значение как последнее µ(т.е. вывод шага 3). Вернувшись к шагу 3, мы не удалили пробелы из элементов, поэтому у нас будет 1 для правильного ответа или 0 для неправильного или пропущенного ответа (поскольку пробел не будет соответствовать правильному ответу). С этого момента я буду использовать заглавные буквы для этого 1 = правильный, 0 = неправильный / отсутствующий формат и продолжу использовать строчные буквы для 0 = правильный / отсутствующий, -1 = неправильный. Результирующее значение имеет 405 элементов и выглядит следующим образом:
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
pqrstuvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
TSRQP
ṫ⁹
Здесь происходит удивительное совпадение, о котором я упоминал ранее. Прежде чем говорить об этом фрагменте кода, я хочу подвести итоги того, к чему мы пришли.
Каждая заглавная буква представляет +1 для правильного ответа; первые 15 вопросов (до Aконца O) появляются 5 раз каждый в строке, а последние 10 вопросов (до Pконца Y) появляются 6 раз каждый. Это немного не волшебно; Я разработал его таким образом, когда я выбрал число 135 ранее в программе (это 5 × 15 + 6 × 10), и единственная удача здесь в том, что 5 оказывается нечетным числом (так что это последние 10 вопросы, которые заканчиваются тем, что появляются дополнительные времена, а не первые 10). 15 букв, непосредственно предшествующих этому, содержат pдо t(-1 штрафные вопросы) один раз и uдо y(-2 штрафных вопроса) дважды. Это также не так много совпадений; потому что мы использовалиm0ранее дополнительные копии вопросов располагались по порядку PQRSTUVWXYYXWVUTSRQP, а более поздние вопросы, естественно, будут располагаться ближе к середине этой строки (таким образом, если взять последние 15 «дополнительных» вопросов, будет меньше повторений тем, которые расположены ближе к краям; и конечно, не удивительно, что «лишние» вопросы приходят последними).
Поскольку каждая строчная буква вычитает 1 из оценки за неправильный, не пропущенный ответ, а каждая заглавная буква добавляет 1 к оценке для правильного ответа, нам просто нужно взять последние 135 + 15 = 150 элементов, чтобы получить каждый вид элемента правильное количество раз. Команда Jelly для получения подстроки в конце списка есть ṫ; тем не менее, он не указывает количество элементов, которые вы хотите, а скорее индекс первого элемента, который вы хотите. У нас есть 405 элементов на данный момент, и мы хотим 150, поэтому нам нужно начать с индекса (405 - 150 + 1) или 256. При удивительном совпадении 256 оказывается числом существующих октетов, и поэтому имеет короткое представление в желе (⁹). Я мало что мог сделать, чтобы это произошло; шаг 4 добавил еще 135 элементов в начало списка, чтобы попасть в круглое число, но тот факт, что мне нужно было добавить 135 элементов (значение, которое было легко доступно в тот момент в программе), было действительно удобным, в основном любое другое число совершенно бесполезно в этой ситуации.
Вот как теперь выглядит внутреннее значение:
uvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
S
Наконец, теперь у нас есть список изменений в оценке из вопросов, все, что нам нужно сделать, это суммировать их S, и мы сделали.