Hexlet / ru-proposals

Предложения по улучшению Хекслета
https://hexlet.io
10 stars 2 forks source link

Добавить проверки кода решения (с примером кода проверки) #114

Open fiftinmen opened 8 months ago

fiftinmen commented 8 months ago

Некоторые задачи требуют решения с использованием определённых техник (например, рекурсивной функции), но в принципе того же результата можно получить и без них. При этом тесты проверяют только результат выполнения функции, но не то, как функция работает. В итоге студент может не понять урок и применить ту технику, которую он уже знает, а не ту, которую ему нужно изучить.

Для проверки того, как функция работает, нужно исследовать код решения. Вот пример того, как это можно сделать для проверки на то, использует ли студент рекурсивную функцию, в случае 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));