// Numbas version: finer_feedback_settings {"name": "Calculate areas of rooms in a house", "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": [["question-resources/house-outline_nHd5Iw5.svg", "/srv/numbas/media/question-resources/house-outline_nHd5Iw5.svg"]], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"name": "Calculate areas of rooms in a house", "tags": [], "metadata": {"description": "The student is shown a diagram with measurements of rooms in a house. They have to enter the measurements in a spreadsheet, then the area of each room, and finally the total area of the house.
", "licence": "Creative Commons Attribution 4.0 International"}, "statement": "A surveyor has measured the rooms in a house and produced the following drawing (not to scale):
\n\nMeasurements are given in metres.
", "advice": "First write in the dimensions given on the drawing:
\n{update_range(dimensions_spreadsheet, \"B2:C6\", highlight_style)}
\nNext, calculate the area of each room, by multiplying the width by the height. Round to the nearest cm2, or 0.0001 m2.
\n{update_range(areas_spreadsheet, \"D2:D6\", highlight_style)}
\nThen, add up the areas to find the total area:
\n{update_range(filled_spreadsheet, \"D7\", highlight_style)}
", "rulesets": {}, "extensions": ["jsxgraph", "sheets"], "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"dimensions_spreadsheet": {"name": "dimensions_spreadsheet", "group": "Spreadsheet", "definition": "fill_range(spreadsheet, \"B2:C6\", dimensions)", "description": "The spreadsheet with the dimensions filled in but not the areas.
", "templateType": "anything", "can_override": false}, "spreadsheet": {"name": "spreadsheet", "group": "Spreadsheet", "definition": "disable_cells(raw_spreadsheet, [\"A1:D1\", \"A1:A7\", \"A7:C7\"])", "description": "", "templateType": "anything", "can_override": false}, "dimensions": {"name": "dimensions", "group": "Measurements", "definition": "[\n [x1+x2,y1],\n [x3,y1+y2+y3],\n [x1,y2],\n [x2,y2],\n [x1+x2,y3]\n]", "description": "", "templateType": "anything", "can_override": false}, "filled_spreadsheet": {"name": "filled_spreadsheet", "group": "Spreadsheet", "definition": "fill_range(areas_spreadsheet, \"D7\", [precround(total_area,4)])\n", "description": "The completed spreadsheet, with the total area cell filled in.
", "templateType": "anything", "can_override": false}, "areas": {"name": "areas", "group": "Ungrouped variables", "definition": "map(x*y,[x,y],dimensions)", "description": "The area of each room.
", "templateType": "anything", "can_override": false}, "names": {"name": "names", "group": "Ungrouped variables", "definition": "map(x[0],x,spreadsheet[\"A2:A6\"])", "description": "Names of the rooms.
", "templateType": "anything", "can_override": false}, "dims": {"name": "dims", "group": "Ungrouped variables", "definition": "map(\"{dpformat(w,2)} \u00d7 {dpformat(h,2)}\",[w,h],dimensions)", "description": "Strings describing the rooms' dimensions, to insert in the image.
", "templateType": "anything", "can_override": false}, "total_area": {"name": "total_area", "group": "Ungrouped variables", "definition": "sum(areas)", "description": "The total area of the house.
", "templateType": "anything", "can_override": false}, "areas_spreadsheet": {"name": "areas_spreadsheet", "group": "Spreadsheet", "definition": "fill_range(dimensions_spreadsheet, \"D2:D6\", map(precround(x,4),x,areas))", "description": "The spreadsheet with dimensions and areas filled in.
", "templateType": "anything", "can_override": false}, "highlight_style": {"name": "highlight_style", "group": "Ungrouped variables", "definition": "[\"style\": [\"fill\": [\"fgColor\": [\"rgb\": \"ccccff\"]]]]", "description": "Style which fills in cells with a bright colour to highlight them.
", "templateType": "anything", "can_override": false}, "x1,x2,x3": {"name": "x1,x2,x3", "group": "Ungrouped variables", "definition": "repeat(random(1..2#0.01), 3)", "description": "The three widths - the width of hallway 1, hallway 2, and the dining room.
", "templateType": "anything", "can_override": false}, "y1,y2,y3": {"name": "y1,y2,y3", "group": "Ungrouped variables", "definition": "repeat(random(1..2#0.01), 3)", "description": "The three vertical measurements: kitchen, hallway, and living room.
", "templateType": "anything", "can_override": false}, "raw_spreadsheet": {"name": "raw_spreadsheet", "group": "Spreadsheet", "definition": "spreadsheet_from_base64_file(safe(\"room-areas.xlsx\"), safe(\"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\"))", "description": "", "templateType": "spreadsheet", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["x1,x2,x3", "y1,y2,y3", "names", "dims", "areas", "total_area", "highlight_style"], "variable_groups": [{"name": "Spreadsheet", "variables": ["raw_spreadsheet", "dimensions_spreadsheet", "spreadsheet", "dimensions_spreadsheet", "areas_spreadsheet", "filled_spreadsheet"]}, {"name": "Measurements", "variables": ["dimensions"]}], "functions": {}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "spreadsheet", "useCustomName": false, "customName": "", "marks": "30", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "Fill in this survey form. Give lengths in metres to the nearest centimetre, and areas in square metres to the nearest cm2.
", "settings": {"initial_sheet": "spreadsheet", "correct_answer": "filled_spreadsheet", "disable_ranges": "[\"A1:D1\", \"A1:A6\",\"A7:C7\"]", "mark_ranges": "[\"Dimensions\": \"B2:C6\", \"Areas\": \"D2:D6\", \"Total area\": \"D7\"]", "marking_method": "per_range", "tolerance": "0.01"}}], "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/"}]}