// Numbas version: finer_feedback_settings {"name": "Fill in table of books per child", "extensions": ["jsxgraph", "sheets"], "custom_part_types": [{"source": {"pk": 242, "author": {"name": "Christian Lawson-Perfect", "pk": 7}, "edit_page": "/part_type/242/edit"}, "name": "Spreadsheet", "short_name": "spreadsheet", "description": "
An editable spreadsheet. Ranges of cells can be disabled, and you can specify ranges of cells to be marked. A cell is marked correct if its value is equal to the value in the expected answer spreadsheet.
", "help_url": "", "input_widget": "spread-sheet", "input_options": {"correctAnswer": "settings[\"correct_answer\"]", "hint": {"static": true, "value": ""}, "initial_sheet": {"static": false, "value": "disable_cells(settings[\"initial_sheet\"], settings[\"disable_ranges\"])"}}, "can_be_gap": true, "can_be_step": true, "marking_script": "correctAnswer:\nsettings[\"correct_answer\"]\n\nmark:\nif(sum(mark_ranges)=0,\n incorrect(),\n apply(mark_ranges)\n)\n\ninterpreted_answer:\nstudentAnswer\n\nrange_cells:\nmap(parse_range(ref),ref,values(settings[\"mark_ranges\"]))\n\ntotal_cells:\nlen(flatten(range_cells))\n\nrange_weights:\nswitch(\n settings[\"marking_method\"]=\"per_cell\",\n map(len(r)/total_cells, r, range_cells),\n // otherwise, mark per range\n repeat(1/len(range_cells), len(range_cells))\n)\n\nmark_ranges:\nmap(\n let(\n range_credit,\n sum(map(\n let(\n correctCellString, correctAnswer[c],\n correctCellNumber, parsenumber(correctCellString, notation_styles),\n studentCellString, studentAnswer[c],\n studentCellNumber, parsenumber(studentCellString, notation_styles),\n award(\n 1/len(cells), \n if(isnan(correctCellNumber) and correctCellString<>\"\",\n lower(correctCellString) = lower(studentCellString),\n abs(studentCellNumber - if(isnan(correctCellNumber),0,correctCellNumber)) <= settings[\"tolerance\"]\n )\n )\n ),\n c,\n cells\n )),\n message,\n switch(\n range_credit=0,\n if(len(cells)=1, \"This entry is incorrect.\", \"All entries in this range are incorrect.\"),\n range_credit=1,\n if(len(cells)=1, \"This entry is correct.\", \"All entries in this range are correct.\"),\n //otherwise\n \"Some entries in this range are correct.\"\n ),\n assert(len(cells)=0, add_credit(range_credit*w, \"{name}: \"+message)); \n range_credit\n ),\n [cells,w,name],\n zip(range_cells, range_weights, keys(settings[\"mark_ranges\"]))\n)\n\nnotation_styles:\n[\"plain\",\"si-en\"]", "marking_notes": [{"name": "correctAnswer", "description": "A spreadsheet representing the expected answer.
", "definition": "settings[\"correct_answer\"]"}, {"name": "mark", "description": "This is the main marking note. It should award credit and provide feedback based on the student's answer.", "definition": "if(sum(mark_ranges)=0,\n incorrect(),\n apply(mark_ranges)\n)"}, {"name": "interpreted_answer", "description": "A value representing the student's answer to this part.", "definition": "studentAnswer"}, {"name": "range_cells", "description": "For each range to be marked, the addresses of the cells in that range.
", "definition": "map(parse_range(ref),ref,values(settings[\"mark_ranges\"]))"}, {"name": "total_cells", "description": "The total number of cells to be marked. Cells in overlapping ranges will be counted once for each range they're in.
", "definition": "len(flatten(range_cells))"}, {"name": "range_weights", "description": "The weight of each range, as a proportion of the available credit.
", "definition": "switch(\n settings[\"marking_method\"]=\"per_cell\",\n map(len(r)/total_cells, r, range_cells),\n // otherwise, mark per range\n repeat(1/len(range_cells), len(range_cells))\n)"}, {"name": "mark_ranges", "description": "Mark each of the ranges specified by the question author.
", "definition": "map(\n let(\n range_credit,\n sum(map(\n let(\n correctCellString, correctAnswer[c],\n correctCellNumber, parsenumber(correctCellString, notation_styles),\n studentCellString, studentAnswer[c],\n studentCellNumber, parsenumber(studentCellString, notation_styles),\n award(\n 1/len(cells), \n if(isnan(correctCellNumber) and correctCellString<>\"\",\n lower(correctCellString) = lower(studentCellString),\n abs(studentCellNumber - if(isnan(correctCellNumber),0,correctCellNumber)) <= settings[\"tolerance\"]\n )\n )\n ),\n c,\n cells\n )),\n message,\n switch(\n range_credit=0,\n if(len(cells)=1, \"This entry is incorrect.\", \"All entries in this range are incorrect.\"),\n range_credit=1,\n if(len(cells)=1, \"This entry is correct.\", \"All entries in this range are correct.\"),\n //otherwise\n \"Some entries in this range are correct.\"\n ),\n assert(len(cells)=0, add_credit(range_credit*w, \"{name}: \"+message)); \n range_credit\n ),\n [cells,w,name],\n zip(range_cells, range_weights, keys(settings[\"mark_ranges\"]))\n)"}, {"name": "notation_styles", "description": "Accepted number notation styles for a value in an individual cell.
", "definition": "[\"plain\",\"si-en\"]"}], "settings": [{"name": "initial_sheet", "label": "Initial sheet", "help_url": "", "hint": "Aspreadsheet
object giving the initial state of the sheet that the student should fill in.", "input_type": "code", "default_value": "", "evaluate": true}, {"name": "correct_answer", "label": "Correct answer", "help_url": "", "hint": "A spreadsheet
object representing a correct answer to the part.", "input_type": "code", "default_value": "", "evaluate": true}, {"name": "disable_ranges", "label": "Ranges to disable", "help_url": "", "hint": "A list of cell or range references, denoting the cells that should not be editable.", "input_type": "code", "default_value": "[]", "evaluate": true}, {"name": "mark_ranges", "label": "Ranges to mark", "help_url": "", "hint": "A dictionary of cell or range references, mapping names to ranges of cells, denoting the cells that should be compared for equality with the expected answer.", "input_type": "code", "default_value": "dict()", "evaluate": true}, {"name": "marking_method", "label": "Marking method", "help_url": "", "hint": "", "input_type": "dropdown", "default_value": "per_cell", "choices": [{"value": "per_cell", "label": "Each cell has the same weight"}, {"value": "per_range", "label": "Each range has the same weight"}]}, {"name": "tolerance", "label": "Allowed margin of error", "help_url": "", "hint": "", "input_type": "code", "default_value": "0", "evaluate": true}], "public_availability": "always", "published": true, "extensions": ["sheets"]}], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"name": "Fill in table of books per child", "tags": [], "metadata": {"description": "The student is shown a table with rows for each class in a school, and two columns of numbers: books, and children. They have to work out the column totals, and the number of books per child, and enter them in the table.
", "licence": "Creative Commons Attribution 4.0 International"}, "statement": "", "advice": "For the totals on the bottom row, add up the numbers in each column:
\n{highlighted_totals}
\nTo work out the books per child, divide Books by Children, and round down to the nearest whole number.
\nFor example, in {first_class_name}, the number of books per children is
\n\\[ \\simplify[basic]{ {num_books[0]} / {num_children[0]}} \\approx \\var{floor(num_books[0]/num_children[0])} \\]
\n{highlighted_books_per_child}
", "rulesets": {}, "extensions": ["jsxgraph", "sheets"], "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"initial_spreadsheet": {"name": "initial_spreadsheet", "group": "Ungrouped variables", "definition": "disable_cells(fill_range(\n big_spreadsheet,\n \"B2:C6\",\n zip(map(string(x),x,num_books),map(string(x),x,num_children),map(dpformat(x,2),x,books_per_child))\n), [\"A1:D1\", \"A1:A7\", \"B2:C6\", \"D7\"])", "description": "", "templateType": "anything", "can_override": false}, "big_spreadsheet": {"name": "big_spreadsheet", "group": "Ungrouped variables", "definition": "spreadsheet_from_base64_file(safe(\"books-per-child.xlsx\"), safe(\"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\"))", "description": "", "templateType": "spreadsheet", "can_override": false}, "num_books": {"name": "num_books", "group": "Ungrouped variables", "definition": "repeat(random(60..200),5)", "description": "", "templateType": "anything", "can_override": false}, "num_children": {"name": "num_children", "group": "Ungrouped variables", "definition": "repeat(random(25..30),5)", "description": "", "templateType": "anything", "can_override": false}, "books_per_child": {"name": "books_per_child", "group": "Ungrouped variables", "definition": "map(floor(books/children),[books,children],zip(num_books,num_children))", "description": "", "templateType": "anything", "can_override": false}, "completed_spreadsheet": {"name": "completed_spreadsheet", "group": "Ungrouped variables", "definition": "initial_spreadsheet\n|> fill_range(\"B7:C7\",[map(string(sum(x)),x,[num_books,num_children])]) \n|> fill_range(\"D2:D6\", books_per_child)", "description": "", "templateType": "anything", "can_override": false}, "highlighted_totals": {"name": "highlighted_totals", "group": "Ungrouped variables", "definition": "initial_spreadsheet\n|> fill_range(\"B7:C7\",[map(string(sum(x)),x,[num_books,num_children])]) \n|> update_range(\"B7:C7\",bg_color(\"lightblue\"))", "description": "For the advice section.
\nThe spreadsheet with the totals filled in and highlighted.
", "templateType": "anything", "can_override": false}, "highlighted_books_per_child": {"name": "highlighted_books_per_child", "group": "Ungrouped variables", "definition": "completed_spreadsheet\n|> update_range(\"D2:D6\", bg_color(\"lightblue\"))", "description": "For the advice section.
\nThe completed spreadsheet with the entries in the \"books per child\" column highlighted.
", "templateType": "anything", "can_override": false}, "first_class_name": {"name": "first_class_name", "group": "Ungrouped variables", "definition": "big_spreadsheet[\"A2\"]", "description": "", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["big_spreadsheet", "initial_spreadsheet", "completed_spreadsheet", "num_books", "num_children", "books_per_child", "highlighted_totals", "highlighted_books_per_child", "first_class_name"], "variable_groups": [], "functions": {}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "spreadsheet", "useCustomName": false, "customName": "", "marks": "15", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "Fill in this table. Round the \"books per child\" down to the nearest whole number.
", "settings": {"initial_sheet": "initial_spreadsheet", "correct_answer": "completed_spreadsheet", "disable_ranges": "[\"A1:D1\",\"A1:A7\",\"B2:C6\", \"D7\"]", "mark_ranges": "[\"Books per child\": \"D2:D6\", \"Total books\": \"B7\", \"Total children\": \"C7\"]", "marking_method": "per_range", "tolerance": "0"}}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "type": "question", "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "http://clppc:8000/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/7/"}]}]}], "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "http://clppc:8000/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/7/"}]}