-
Notifications
You must be signed in to change notification settings - Fork 3
Добавить проверки кода решения (с примером кода проверки) #114
Description
Некоторые задачи требуют решения с использованием определённых техник (например, рекурсивной функции), но в принципе того же результата можно получить и без них. При этом тесты проверяют только результат выполнения функции, но не то, как функция работает. В итоге студент может не понять урок и применить ту технику, которую он уже знает, а не ту, которую ему нужно изучить.
Для проверки того, как функция работает, нужно исследовать код решения. Вот пример того, как это можно сделать для проверки на то, использует ли студент рекурсивную функцию, в случае Javascript. Написал с помощью chatGPT (для ускорения и чтобы голову не ломать над регулярным выражением), но проверил, работает верно.
Вот собственно обсуждаемый пример: требуется написать рекурсивную функцию, реализующую итеративный процесс.
https://ru.hexlet.io/courses/introduction_to_programming/lessons/iterative/exercise_unit
Этот подход можно улучшить и для проверки того, итеративный процесс или рекурсивный.
function extractFunctionsFromString(str) {
const regex =
/([a-zA-Z_$][0-9a-zA-Z_$]*)\s*=\s*\(([^)]*)\)\s*=>\s*{([^}]*)}/g;
const functions = [];
let match;
while ((match = regex.exec(str)) !== null) {
const functionName = match[1];
const args = match[2].split(",").map((arg) => arg.trim());
const body = match[3];
functions.push({ functionName, arguments: args, body });
}
return functions;
}
const str =
"hello const add = (a, b) => { return add(a,b); } my name is cirill const abb = (a, b) => { return a + b; }";
const extractedFunctions = extractFunctionsFromString(str);
console.log(extractedFunctions);
function isRecursiveFunction(extractedFunction) {
results = [];
for (const func of extractedFunction) {
if (func.body.includes(func.functionName)) {
results.push(true);
} else {
results.push(false);
}
}
return results;
}
console.log(isRecursiveFunction(extractedFunctions));