// Numbas version: exam_results_page_options {"name": "Product fact sheet", "extensions": ["sheets"], "custom_part_types": [{"source": {"pk": 4, "author": {"name": "Christian Lawson-Perfect", "pk": 1}, "edit_page": "/beta/part_type/4/edit"}, "name": "Spreadsheet", "short_name": "spreadsheet", "description": "

An editable 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": "", "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": "", "definition": "map(parse_range(ref),ref,values(settings[\"mark_ranges\"]))"}, {"name": "total_cells", "description": "

The total number of cells to be marked.

", "definition": "len(flatten(range_cells))"}, {"name": "range_weights", "description": "", "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": "", "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": "", "definition": "[\"plain\",\"si-en\"]"}], "settings": [{"name": "initial_sheet", "label": "Initial sheet", "help_url": "", "hint": "A spreadsheet 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 mapping names to cell or range references, 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": "restricted", "published": false, "extensions": ["sheets"]}], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"name": "Product fact sheet", "tags": [], "metadata": {"description": "", "licence": "None specified"}, "statement": "

You're considering buying a new {product_name}. The manufacturer's website contains the following information:

\n
\n

The new {product_name} does everything you need it do. Drawing only {electricity_use}W, it uses much less electricity than most towns. And invention fluid use is lower than ever, at a mere {fluid_use}ml per hour.

\n

Measuring {dimensions[0]}×{dimensions[1]}×{dimensions[2]}cm, where can't you put it?

\n

Priced affordably at {currency(price,\"£\",\"p\")}, get one today!

\n
\n

You also found some reviews online:

\n

{reviews_table}

\n

One review noted that each {product_name} incurs {currency(externalised_costs,\"£\",\"p\")} in externalised costs.

", "advice": "", "rulesets": {}, "extensions": ["sheets"], "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"raw_spreadsheet": {"name": "raw_spreadsheet", "group": "Spreadsheet", "definition": "spreadsheet_from_base64_file(safe(\"product-fact-sheet.xlsx\"), safe(\"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\"))", "description": "", "templateType": "spreadsheet", "can_override": false}, "filled_spreadsheet": {"name": "filled_spreadsheet", "group": "Completed spreadsheet", "definition": "fill_ranges(raw_spreadsheet,\n [\n [\"B2\",[[product_name]]],\n [\"D2\", [[price]]],\n [\"F3:F6\", [[electricity_use],[fluid_use],[externalised_costs]]],\n [\"A5:C5\", [dimensions]],\n [\"B9:D9\", [review_counts]]\n ]\n)", "description": "", "templateType": "anything", "can_override": false}, "product_names": {"name": "product_names", "group": "Data", "definition": "[ \"Whizzo 3\", \"The New Gloop\", \"Vwlr\", \"Crumpetron\", \"Autocomb Pro\" ]", "description": "", "templateType": "list of strings", "can_override": false}, "product_name": {"name": "product_name", "group": "Data", "definition": "random(product_names)", "description": "", "templateType": "anything", "can_override": false}, "dimensions": {"name": "dimensions", "group": "Data", "definition": "repeat(random(10..100#5),3)", "description": "", "templateType": "anything", "can_override": false}, "electricity_use": {"name": "electricity_use", "group": "Data", "definition": "random(10..200#5)", "description": "", "templateType": "anything", "can_override": false}, "fluid_use": {"name": "fluid_use", "group": "Data", "definition": "random(300..900#10)", "description": "", "templateType": "anything", "can_override": false}, "externalised_costs": {"name": "externalised_costs", "group": "Data", "definition": "random(1000..9000#100)", "description": "", "templateType": "anything", "can_override": false}, "price": {"name": "price", "group": "Data", "definition": "random(59..409#10)", "description": "", "templateType": "anything", "can_override": false}, "individual_reviews": {"name": "individual_reviews", "group": "Data", "definition": "repeat(random(scores),5)", "description": "", "templateType": "anything", "can_override": false}, "all_reviewers": {"name": "all_reviewers", "group": "Data", "definition": "[ \"Invention Review\", \"Product Quarterly\", \"Whence Gizmos\", \"Doodads Today\", \"That Thingamajig\", \"Contraption Action\" ]", "description": "", "templateType": "list of strings", "can_override": false}, "reviewers": {"name": "reviewers", "group": "Data", "definition": "shuffle(all_reviewers)", "description": "", "templateType": "anything", "can_override": false}, "reviews_table": {"name": "reviews_table", "group": "Data", "definition": "table(zip(reviewers,individual_reviews),[\"Reviewer\",\"Score\"])", "description": "", "templateType": "anything", "can_override": false}, "review_counts": {"name": "review_counts", "group": "Data", "definition": "map(len(filter(x=score,x,individual_reviews)),score,scores)", "description": "", "templateType": "anything", "can_override": false}, "scores": {"name": "scores", "group": "Data", "definition": "[ \"Bad\", \"Neutral\", \"Good\" ]", "description": "", "templateType": "list of strings", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": [], "variable_groups": [{"name": "Spreadsheet", "variables": ["raw_spreadsheet"]}, {"name": "Data", "variables": ["product_names", "product_name", "dimensions", "electricity_use", "fluid_use", "externalised_costs", "price", "scores", "individual_reviews", "all_reviewers", "reviewers", "reviews_table", "review_counts"]}, {"name": "Completed spreadsheet", "variables": ["filled_spreadsheet"]}], "functions": {}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "spreadsheet", "useCustomName": false, "customName": "", "marks": 1, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

Before making a purchase, you always fill in a product fact sheet. Fill in the product fact sheet for the {product_name}, using the information above.

", "settings": {"initial_sheet": "raw_spreadsheet", "correct_answer": "filled_spreadsheet", "disable_ranges": "[\"A1:F1\", \"A2\",\"C2\",\"E2:F2\",\"A3:C3\",\"A4:C4\",\"E3:E5\",\"A7:D8\",\"A8:A9\"]", "mark_ranges": "[\n \"Product name\": \"B2\",\n \"Price\": \"D2\",\n \"Running costs\": \"F3:F5\",\n \"Dimensions\": \"A5:C5\",\n \"Reviews\": \"B9:D9\"\n]", "marking_method": "per_cell", "tolerance": "0"}}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/beta/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "http://clppc:8000/accounts/profile/1/"}]}]}], "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/beta/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "http://clppc:8000/accounts/profile/1/"}]}