Написать код для 2dArray
Анализатор получает логическое выражение от переменных i и j Запускает его на массивах четного и нечетного размера и проверяет совпадение. Может делать подсказки, рисуя заполненный массив.
Comments (52)
-
repo owner -
repo owner - edited description
- marked as enhancement
- changed title to Написать код для 2dArray
-
repo owner -
assigned issue to
Реалнейм заполните, Прокудин. А то Артемов у меня хватает...
-
assigned issue to
-
Я не совсем понимаю суть задания. Насколько я помню, мне нужно изменить модуль нормализации выражений вот отсюда. Но что означает "логическое выражение от переменных i и j". В описании класса написано : "Analyzing logical expression that work with 2d array "arr" and two indexes "i" and "j". The grade determine on how much cells in this array expressions yield equal result." Можно, если возможно, на примерах показать, что должно быть сделано?
-
repo owner Вам не нужна нормализация. Вам нужно тупо вычислить его для каждого элемента двумерного массива (отдельно рассмотреть случаи четного и нечетного размера) и определить, одинаковые ли элементы закрашивают (возвращают истину) оба выражения. Логическое выражение очевидно означает выражение, дающее истину или ложь. В нем могут использоваться индексы строки и столбца i и j - собственно в комменте все сказано. Если непонятно - спрашивайте при встрече.
-
Мне нужно работать с версией форка NormaliseExpr или же CppExpression?
-
И еще, чем должна отличаться реализация этих классов? В обоих просто переопределить метод accept_expression?
-
repo owner Насчет версии форка - гляньте Diff - если в NormaliseExpr затрагивалась основная архитектура вопрос - файлы типа questiontype.php, question.php, edit_cppexpression_form и т.д. - тогда лучше работать с ним, если нет - тогда не важно.
Насчет классов оценивания и подсказки - вы базовые их классы смотрели? Чем отличается grading_analyzer от hint_analyzer? Там все описано вроде.
-
Что должен делать класс array2d_hint ? Я так понимаю, он должен вернуть строку, в которой говорится в чем ошибка с помощью метода render_hint?
-
C array2d_grader я вроде разобрался, там нужно переопределить реализацию fitness - функции, не так ли?
-
repo owner У подсказки есть три режима, почитайте. В зависимости от режима возвращается подсказка. "Строка" это html - в вашем случае это будут, очевидно, таблицы с цветовым выделением ячеек.
В грейдере да, там отпределяется степень соответствия от 0 до 1 между двумя ответами, в вашем случае наверное процент совпадающих ячеек.
-
Нужно ли рассматривать вариант неквадратных матриц(четная ширина и нечетная высота и т.п.)?
-
repo owner Лучше рассмотреть и неквадратные тоже.
-
я так понимаю, что в моем случае подсказка будет SINGLE_INSTANCE_HINT и response_based. И по сути она будет возвращать таблицу с закрашенными ячейками у учителя и студента?
-
хотя наверное лучше возвращать только раскрашенные таблицы для студента с разными размерами матриц
-
repo owner Там если заметили есть 3 режима подсказки в cppexpression уже: только ответ студента, только ответ преподавателя и совмещенные ответ студента и преподавателя. response_based будут первый и третий режимы, второй нет. SINGLE_INSTANCE_HINT да, только если ошибки не на всех вариантах матриц то показывать надо вариант матрицы с ошибкой. В совмещенном варианте предусмотреть особую раскраску для различий.
-
repo owner Я бы советовал сначала сделать скриншоты подсказок и запостить сюда
-
я нашел эти режимы в классе hint_from_analyzer. Но я не нашел примеров использования. Один из этих классов - мой, на другом стоят заглушки. Чем отличаются вообще режимы, в каких случаях какая используется? Для студента и преподавателя используется, как я понял, после окончания теста и должно отображать различия между ответами. Но что делают тогда подсказки отдельно студента и отдельно преподавателя?
-
repo owner Нет примеров - никто еще не написал. Но комментарии вроде достаточно подробные. Отображается все после любого ответа - как настроено. Отдельно для студента или преподавателя очевидно рисуют таблицу как она будет выглядеть для выражения студента или преподавателя. Ну, честно говоря режим преподавателя можно не поддерживать в данном случае, потому что в условии рисунок скорее всего и так будет. А вот режим чисто студента надо, как и совмещенный.
-
в грэдере есть метод is_need_declaration. Я так понимаю, в моем случае, объявление не нужно?
-
И еще, как запустить само по себе вычисление выражения после замены переменных на числа. Я пробовал метод normalize из tree_converter, но он не упрощает их до требуемого уровня. Вычисление что, придется самому писать?
-
repo owner Объявление у вас не нужно, т.к. все используемые переменные стандартны для каждого вопроса.
Вычислять самому, без нормализатора. Это не так уж сложно.
-
В где выполнять эти вычисления? В самом 2darray или изменить класс узлов?
-
Я решил делать их внутри array2d. Также я думаю, что кроме i и j, следует добавить переменные width и height, чтобы была возможность закрашивать правые и нижние границы массива(ну и взаимодействовать с ними). Потому что без них вообще бессмысленно запускать выражения на разных вариантах массивов, достаточно будет одного.
-
repo owner Там есть архитектура, каждый обработчик дерева может задать свои классы узлов для конкретного синтаксического дерева. Ее стоит использовать. С width и height согласен, это лучше чем N и M - сложнее перепутать.
-
Ну я нашел в tree_converter массив конвертации из ast в текущее дерево.
И что, мне тогда нужно создать классы вычислимых узлов и изменить этот массив для работы с этими узлами?
-
repo owner У меня прямо сейчас нет времени смотреть код, но там должна былабыть фабрика узлов. Вы создаете узлы под поддерживаемые вами операции/операнды и вычисляете с их помощью.
-
Ну все, что я нашел - это как раз класс tree_converter, который создает синтаксическое дерево по ast(по вышеуказанной таблице). Это единственная фабрика, что я нашел .
Вот собственно метод, создающий новые узлы:
Мб мне его тогда сделать protected и переопределить в потомке? Чтоб работать уже с своей конвертационной матрицей, не затрагивая существующую в tree_converter
-
Я тут наткнулся на странное поведение при коммите. Почему-то все изменения слились в одну строку. С чем это может быть связано?
-
repo owner Проверьте настройки переводов строк на компьютере и в системе контроля версий.
-
Ну я наверное тогда сделаю 2 типа подсказок : для ответа студента(просто заполненные таблицы разных размеров), для совмещенного ответа студента и преподавателя(будут значения студента, если ячейка совпадает с ответом учителя, то выделяется зеленым, иначе - красным)
Еще вопрос, где искать ответ студента и ответ учителя? В случае студента я так понял, что это параметр response
А где искать ответ преподавателя? Я так понял, он хранится в поле question этого класса. Но где найти сам класс question, на который поле ссылается?
-
repo owner Студента правильно поняли. Чтобы найти ответ учителя, наиболее соответствующий ответу студента если их несколько, надо запросить объект вопроса - там обычно функция типа best_fit_answer или типа того. В поле question будет объект класса типа qtype_cppexpression_question или типа того.
-
Ну я попробовал добавить анализатор к вопросу. Я так понял что я тут первопроходец, ибо в классе qtype_cppexpression обнаружились совсем уж глупые ошибки и заглушки при работе с grader'ами и hint'ами
Ну я раскомментировал. При добавлении записи все вроде как нормально сохраняется, но при попытке открыть вопрос вылетает ошибка
Причина оказалась в следующем : вся дополнительная информация о вопросе хранится в таблице
однако при добавлении hint_analyzer'ов он пытается вытянуть из нее поля с mod'ами и penalty
Так вот. Мне просто добавить эти поля в бд?(я вроде нашел update.php файл, который обновляет базу, но не совсем понял, как его использовать). И будет ли надбавка за это или это по идее и так входит в мою работу?
-
Хотя стоп, в этом update файле вроде как даже фигурируют эти поля. Как мне тогда обновить базу?
-
Ну я разобрался вроде как это делается, вылетать перестало. Настроил корректную работу grader'a. Однако с подсказками проблема : я нашел метод, который их отрисовывает, однако $behaviour создается не того типа и подсказка не выводится (стр 159.).
Нашел метод генерации behaviour'a, что там нужно поменять? Или эти изменения должны быть не в коде?
-
repo owner Если у вас в базе полей нет, надо смотреть какая версия у вас установилась и сличить с той, что есть в апдейте. Апдейт запускается когда версия в version.php больше той, что в базе - и сам update.php содержит развилки по номеру версии. Сможете понять что случилось и при необходимости запустить апдейт, временно отредактировав себе версию в БД на необходимую чтобы все отработало?
-
Да, я это сделал, добавил поля в базу
-
А что по поводу вопроса про подсказки?
-
Ну у меня не получается вывести подсказку. Я настроил $behaviour как adaptivehintsnopenalties, в методе он идет в блок else на стр.168, однако не идет по циклу генерации подсказки из-за отсутствия какого-то параметра в question_attempt. Где он вообще задается, где его искать?
-
ну крч я закомментил ту проверку в цикле и подсказки заработали(пусть пока так). Еще вопрос, куда подключить css-файл. Его интеграция должна происходить в html-коде подсказки или же есть какой-то один большой style-файл?
-
repo owner Какую проверку в каком цикле? Если на render_hint то это не совсем в тему, потому что у вас переменная не устаналивается.
По подсказке у вас должна сначала появиться кнопка подсказки (если подсказка reponse-based - то только после попытки ответа студента), дальше после нажатия кнопки должна появляться сама подсказка - там выставляется нужная переменная. (лучше используйте просто adaptivehints). Если что-то не так - вероятно у вас проблемы с $hintkey, например $question->available_specific_hints не возвращает нужный хинткей потому что вы не дописали туда, см. строку 169 где она вызывается.
-
не, проблема в том, что не срабатывает условие на стр 173 и я не знаю, как на это повлиять
-
repo owner Так я ж вам про него и пишу. Распечатайте все behaviour_var с последнего шага и сравните с результатом available_specific_hints . В одном из двух мест нет нужного хинткея - ну или в обоих.
available_specific_hints должна дать список всех возможных хинткеев для данного ответа; has_behaviour_var проверяет, была ли нажата кнопка соответствующей подсказки в behaviour. Проверьте, чтобы вопрос не выдавал поведению, что он сам будет рисовать кнопки, если кнопок не видите. Вы вообще кнопки запроса подсказки видели, нажимали?
-
ну только вроде одна кнопка была, которая "Check answer"
-
repo owner Ну так вы вообще с available_specific_hints разберитесь, чтобы она хинткеи для ваших хинтов выводила если анализатор включен.
-
она их возвращает. в формате "{analyzer}_{mode}"
-
я не совсем понял, а где добавить кнопку для соответствующей подсказки? А то у меня только "Check" выводится
-
repo owner В adaptive-поведениях кнопки добавляет само поведение, по результатам available_specific_hints - если только вопрос не запросил их отрисовку себе. Полюбуйтесь на рендерер поведения, он их рендерит вроде.
Только ваши подсказки основаны на ответе студента, так что прежде чем увидеть кнопку вам надо ввести какой-нибудь неправильный ответ и нажать Check, а то чего рисовать то на подсказке? Ну и в настройках вопроса подсказки должны быть разрешены. Если все в порядке - смотрите, дает ли available_specific_hints хинткеи бехайвору.
-
Вот что я нашел. Необходимые для отрисовки поля(_render_hint) добавляются если установлена "$hint".btn . Только вот где она задается?
-
Нашел еще вот тут метод какой-то, в котором как раз фигурирует "$hint".btn, однако он не вызывается и непонятно откуда вообще может. Имеет ли он отношение к этой проблеме?
-
repo owner В поведении они задаются. Давайте на консультации...
-
repo owner - changed status to resolved
- Log in to comment
А чего анонимно то?