// Numbas version: finer_feedback_settings
{"question_groups": [{"name": "Pattern-matching", "pickQuestions": 1, "pickingStrategy": "all-ordered", "questions": [{"name": "Demo of \"pattern to match\" restriction", "extensions": [], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "http://localhost:8000/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/7/"}, {"name": "Chris Graham", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/369/"}], "tags": [], "metadata": {"description": "This question contains many examples of mathematical expression parts which require the student to enter their in a certain form, which is marked by applying a \"pattern to match\" restriction.
", "licence": "Creative Commons Attribution 4.0 International"}, "statement": "
In this question, each part has a pattern restriction, checking the student has given their answer in the required form.
", "advice": "", "rulesets": {}, "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"theta": {"name": "theta", "group": "Part c - modulus argument form", "definition": "arctan(si/sr)/pi+if(sr<0,si,0)", "description": "", "templateType": "anything", "can_override": false}, "jn": {"name": "jn", "group": "Part j - don't use decimals", "definition": "random(1..jd-1)", "description": "", "templateType": "anything", "can_override": false}, "kc": {"name": "kc", "group": "Part k - rationalise denominator", "definition": "random(1 .. 5#1)", "description": "", "templateType": "randrange", "can_override": false}, "d2": {"name": "d2", "group": "Part h - common denominator", "definition": "random(2..9 except d1)", "description": "", "templateType": "anything", "can_override": false}, "ka": {"name": "ka", "group": "Part k - rationalise denominator", "definition": "random(1 .. 9#1)", "description": "", "templateType": "randrange", "can_override": false}, "cB": {"name": "cB", "group": "Part g - polynomial", "definition": "random(1,2,3)", "description": "", "templateType": "anything", "can_override": false}, "n2": {"name": "n2", "group": "Part h - common denominator", "definition": "random(-1,1)*random(1..9 except map(n*d2,n,0..ceil(9/d1)))", "description": "", "templateType": "anything", "can_override": false}, "sr": {"name": "sr", "group": "Part c - modulus argument form", "definition": "random(-1,1)", "description": "", "templateType": "anything", "can_override": false}, "kn": {"name": "kn", "group": "Part k - rationalise denominator", "definition": "random(2,3,5,6,7,8)", "description": "", "templateType": "anything", "can_override": false}, "d1": {"name": "d1", "group": "Part h - common denominator", "definition": "random(2..9)", "description": "", "templateType": "anything", "can_override": false}, "si": {"name": "si", "group": "Part c - modulus argument form", "definition": "random(-1,1)", "description": "", "templateType": "anything", "can_override": false}, "modulus": {"name": "modulus", "group": "Part c - modulus argument form", "definition": "random(1 .. 10#1)", "description": "", "templateType": "randrange", "can_override": false}, "jd": {"name": "jd", "group": "Part j - don't use decimals", "definition": "2^random(0..3)*5^random(0,1)", "description": "", "templateType": "anything", "can_override": false}, "a": {"name": "a", "group": "Part b - expand brackets", "definition": "random(-5 .. 5#1)", "description": "", "templateType": "randrange", "can_override": false}, "bits": {"name": "bits", "group": "Ungrouped variables", "definition": "repeat(random(-3..3),3)", "description": "", "templateType": "anything", "can_override": false}, "lb": {"name": "lb", "group": "Part l - partial fractions", "definition": "random(-5..5 except [0,la])", "description": "", "templateType": "anything", "can_override": false}, "b": {"name": "b", "group": "Part b - expand brackets", "definition": "random(-5..5 except -a)", "description": "", "templateType": "anything", "can_override": false}, "cA": {"name": "cA", "group": "Part g - polynomial", "definition": "random(1,2,3)", "description": "", "templateType": "anything", "can_override": false}, "la": {"name": "la", "group": "Part l - partial fractions", "definition": "random(-5..5 except 0)", "description": "", "templateType": "anything", "can_override": false}, "n1": {"name": "n1", "group": "Part h - common denominator", "definition": "random(1..9 except map(n*d1,n,0..ceil(9/d1)))", "description": "", "templateType": "anything", "can_override": false}, "n": {"name": "n", "group": "Part a - write as sum of two integers", "definition": "random(4 .. 10#1)", "description": "", "templateType": "randrange", "can_override": false}, "p": {"name": "p", "group": "Part f - index notation", "definition": "random(0 .. 10#1)", "description": "", "templateType": "randrange", "can_override": false}, "coeffs": {"name": "coeffs", "group": "Ungrouped variables", "definition": "[\n bits[0]*bits[1]*bits[2],\n bits[0]*bits[1] + bits[0]*bits[2] + bits[2]*bits[1],\n bits[0] + bits[1] + bits[2],\n 1\n]", "description": "", "templateType": "anything", "can_override": false}, "kb": {"name": "kb", "group": "Part k - rationalise denominator", "definition": "random(ceil(sqrt(kc^2*kn))..15)", "description": "", "templateType": "anything", "can_override": false}, "z1": {"name": "z1", "group": "Part d - cartesian form", "definition": "random(-10..10 except 0) + random(-10..10 except 0)*i", "description": "", "templateType": "anything", "can_override": false}, "z2": {"name": "z2", "group": "Part d - cartesian form", "definition": "random(-10..10 except 0) + random(-2..2 except 0)*i", "description": "", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["bits", "coeffs"], "variable_groups": [{"name": "Part a - write as sum of two integers", "variables": ["n"]}, {"name": "Part b - expand brackets", "variables": ["a", "b"]}, {"name": "Part c - modulus argument form", "variables": ["modulus", "sr", "si", "theta"]}, {"name": "Part d - cartesian form", "variables": ["z1", "z2"]}, {"name": "Part f - index notation", "variables": ["p"]}, {"name": "Part g - polynomial", "variables": ["cA", "cB"]}, {"name": "Part h - common denominator", "variables": ["n1", "d1", "n2", "d2"]}, {"name": "Part j - don't use decimals", "variables": ["jn", "jd"]}, {"name": "Part k - rationalise denominator", "variables": ["ka", "kb", "kc", "kn"]}, {"name": "Part l - partial fractions", "variables": ["la", "lb"]}], "functions": {}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": false, "customName": "", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "$\\simplify{{jn}x = {jd}y}$
\nFind $y$. Don't use decimals. You'll get a penalty if you use a decimal in your answer.
\n$y = $ [[0]]
", "gaps": [{"type": "jme", "useCustomName": false, "customName": "", "marks": 1, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "answer": "{jn}/{jd}x", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "`! m_anywhere(decimal:$n)", "partialCredit": 0, "message": "You must use fractions or integers, not decimals.", "nameToCompare": ""}, "valuegenerators": [{"name": "x", "value": ""}]}], "sortAnswers": false}, {"type": "jme", "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": "Write $\\var{2^p}$ in the form $2^n$.
", "answer": "2^{p}", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "2^$n", "partialCredit": 0, "message": "Your answer must be in the form $2^n$, where $n \\in \\mathbb{R}$.", "nameToCompare": ""}, "valuegenerators": []}, {"type": "jme", "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": "Put $\\simplify[]{ {n1}/{d1} + {n2}/{d2}}$ over a common denominator.
", "answer": "{n1*d2}/{d1*d2} + {n2*d1}/{d1*d2}", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "(`+-($n/$n;=d))`* + $z", "partialCredit": 0, "message": "All your fractions must be over the same denominator.", "nameToCompare": ""}, "valuegenerators": []}, {"type": "jme", "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": "Expand $\\simplify{(x+{a})(x+{b})}$
", "answer": "x^2+{a+b}x+{a*b}", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": true, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "`! m_anywhere(?*(? + ?`+))", "partialCredit": 0, "message": "You must expand all brackets.", "nameToCompare": ""}, "valuegenerators": [{"name": "x", "value": ""}]}, {"type": "jme", "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": "Expand $\\simplify[basic]{ (x+{bits[0]})*(x+{bits[1]})*(x+{bits[2]})}$ and collect all terms.
", "answer": "{coeffs[0]}+{coeffs[1]}*x+{coeffs[2]}*x^2+{coeffs[3]}*x^3", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "`!(`+- (?`?*(x^?`?);=base) + `+- (?`?*(x^?`?);=base) + ?`*)\n`&\n`! m_anywhere(?*(? + ?`+))", "partialCredit": 0, "message": "You have not expanded and collected all terms.", "nameToCompare": ""}, "valuegenerators": [{"name": "x", "value": ""}]}, {"type": "jme", "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": "Write $\\var{n}$ as the sum of two positive integers.
", "answer": "{floor(n/2)}+{ceil(n/2)}", "answerSimplification": "basic", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "positive:$n + positive:$n", "partialCredit": 0, "message": "You must write your answer as the sum of two positive numbers.", "nameToCompare": ""}, "valuegenerators": []}, {"type": "jme", "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": "Factorise $\\simplify{x^2+{a+b}x+{a*b}}$
", "answer": "(x+{a})(x+{b})", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "m_nogather(\n ?;factors * ?`+;factors // at least two factors\n `where all(map( \n // where none of the factors are numerically equivalent to 1\n not numerical_compare(x,expression(\"1\")),\n x,factors)))", "partialCredit": 0, "message": "Your expression is not factorised.", "nameToCompare": ""}, "valuegenerators": [{"name": "x", "value": ""}]}, {"type": "jme", "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": "Complete the square: $\\simplify{x^2+{a+b}x+{a*b}}$.
", "answer": "(x+{a+b}/2)^2+{4*a*b-((a+b))^2}/4", "answerSimplification": "all", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "(?+?)^2+?`?", "partialCredit": 0, "message": "Your answer should be in the form $(x+a)^2+b$.", "nameToCompare": ""}, "valuegenerators": [{"name": "x", "value": ""}]}, {"type": "jme", "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": "Write $\\simplify{{sr*modulus}/sqrt(2) + {si*modulus}/sqrt(2) i}$ in modulus-argument form, $re^{\\theta i}$.
", "answer": "{modulus}*e^({theta} * pi*i)", "answerSimplification": "basic,fractionnumbers", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "($n`? `: 1)*e^(((`*/ `+- $n)`*;x)*i)", "partialCredit": 0, "message": "Your answer is not in the form $re^{i\\theta}$, with $r \\geq 0$.", "nameToCompare": ""}, "valuegenerators": []}, {"type": "jme", "useCustomName": false, "customName": "", "marks": 1, "scripts": {}, "customMarkingAlgorithm": "q: type(studentExpr)", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "$z_1 = \\var{z1}$
\n$z_2 = \\var{z2}$
\nWrite $z_1+z_2$ in the form $a+bi$
", "answer": "{z1+z2}", "answerSimplification": "basic", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "((`+-integer:$n)`? `: 0);re + (`+-(i*real:$n`?)`? `: 0);im", "partialCredit": 0, "message": "Your answer must be in the form $a+ib$.", "nameToCompare": ""}, "valuegenerators": []}, {"type": "jme", "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": "Write the Maclaurin expansion of $\\simplify{sin({cA}x) + cos({cB}x)}$ up to the $x^4$ term.
", "answer": "1+{cA}x - {cb^2}/2x^2-{ca^3}/6x^3+{cb^4}/24x^4", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "(`+- $n`* / $n`* * ($v);=base^?`? `| $n/$n`?)`* + $z", "partialCredit": 0, "message": "Your answer must be a polynomial of the form $a_nx^n + \\ldots + a_1x + x_0$.", "nameToCompare": ""}, "valuegenerators": [{"name": "x", "value": ""}]}, {"type": "jme", "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": "Rationalise the denominator: $\\simplify{{ka}/({kb}+{kc}sqrt({kn}))}$
", "answer": "({ka*kb}-{ka*kc}*sqrt({kn}))/({kb^2-kc^2*kn})", "answerSimplification": "!basic", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "m_strictinverse(`+-?/(`!m_anywhere(sqrt(?) `| ?^(`! `+-integer:$n))))", "partialCredit": 0, "message": "Your answer must not have a square root on the bottom.", "nameToCompare": ""}, "valuegenerators": []}, {"type": "jme", "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": "Write the partial fraction decomposition of $\\simplify{{la-lb}/((x+{la})(x+{lb}))}$.
", "answer": "1/(x+{lb})-1/(x+{la})", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "m_nogather(m_gather(`+- (?;tops/?;bottoms));fractions`*+$z) `where len(fractions)>1 and all(map(not numerical_compare(x,expression(\"1\")),x,bottoms)) and all(map(not numerical_compare(x,expression(\"0\")),x,tops))", "partialCredit": 0, "message": "Your answer must be the sum of two or more fractions, with no denominators equivalent to 1 and no numerators equivalent to 0.", "nameToCompare": ""}, "valuegenerators": [{"name": "x", "value": ""}]}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "type": "question"}, {"name": "Mark only a captured subexpression of student's answer", "extensions": ["eukleides", "quantities", "random_person"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "http://localhost:8000/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/7/"}], "tags": [], "parts": [{"type": "jme", "checkingAccuracy": 0.001, "customName": "", "scripts": {}, "checkVariableNames": false, "variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "vsetRange": [0, 1], "failureRate": 1, "variableReplacements": [], "answer": "y=x^2", "checkingType": "absdiff", "showPreview": true, "extendBaseMarkingAlgorithm": true, "showCorrectAnswer": true, "unitTests": [], "prompt": "Rearrange $x=\\sqrt{y}$ to obtain a formula for $y$.
", "showFeedbackIcon": true, "useCustomName": false, "marks": 1, "mustmatchpattern": {"partialCredit": 0, "pattern": "y=?;rhs", "nameToCompare": "rhs", "message": "Your answer must be an equation of the form $y = \\ldots$."}, "valuegenerators": [{"name": "x", "value": ""}, {"name": "y", "value": ""}], "vsetRangePoints": 5}, {"type": "jme", "checkingAccuracy": 0.001, "customName": "", "scripts": {}, "checkVariableNames": false, "variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "vsetRange": [0, 1], "failureRate": 1, "variableReplacements": [], "answer": "f(x)=x^2", "checkingType": "absdiff", "showPreview": true, "extendBaseMarkingAlgorithm": true, "showCorrectAnswer": true, "unitTests": [], "prompt": "Here's the definition of a function which negates $x$:
\n\\[ f(x) = -x \\]
\nWrite the definition of a function which squares $x$.
", "showFeedbackIcon": true, "useCustomName": false, "marks": 1, "mustmatchpattern": {"partialCredit": 0, "pattern": "m_func(?,[x]) = ?;def", "nameToCompare": "def", "message": "Your answer must be in the form $f(x) = \\ldots$"}, "valuegenerators": [{"name": "x", "value": ""}], "vsetRangePoints": 5}, {"type": "jme", "checkingAccuracy": 0.001, "customName": "", "scripts": {}, "checkVariableNames": false, "variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "vsetRange": [0, 1], "failureRate": 1, "variableReplacements": [], "answer": "x>4", "checkingType": "absdiff", "showPreview": true, "extendBaseMarkingAlgorithm": true, "showCorrectAnswer": true, "unitTests": [], "prompt": "Rearrange $2x+4>8+x$ to obtain an inequality for $x$.
", "showFeedbackIcon": true, "useCustomName": false, "marks": 1, "mustmatchpattern": {"partialCredit": 0, "pattern": "x>?;r", "nameToCompare": "r", "message": "Your answer must be of the form $x>\\ldots$."}, "valuegenerators": [{"name": "x", "value": ""}], "vsetRangePoints": 5}], "advice": "", "functions": {}, "variable_groups": [], "statement": "", "ungrouped_variables": ["ex", "m", "q"], "metadata": {"licence": "Creative Commons Attribution 4.0 International", "description": "This question contains several mathematical expression parts which only compare part of the student's answer with the corresponding part of the expected answer, because the expression can't be evaluated as a whole.In this question, the correct answers can't be evaluated by substituting numbers for each of the variables.
\nNumbas can now infer the types of variables in the answers to mathematical expression parts, so questions like this can be marked.
", "ungrouped_variables": [], "parts": [{"showPreview": true, "failureRate": 1, "showFeedbackIcon": true, "checkingType": "absdiff", "marks": 1, "answer": "k det(A)", "type": "jme", "variableReplacementStrategy": "originalfirst", "customName": "", "prompt": "In this part, $A$ must be a matrix.
\nThe correct answer is $k \\det(A)$
", "extendBaseMarkingAlgorithm": true, "variableReplacements": [], "useCustomName": false, "valuegenerators": [{"name": "a", "value": ""}, {"name": "k", "value": ""}], "unitTests": [], "vsetRangePoints": 5, "scripts": {}, "showCorrectAnswer": true, "checkingAccuracy": 0.001, "vsetRange": [0, 1], "customMarkingAlgorithm": "", "checkVariableNames": false}, {"showPreview": true, "failureRate": 1, "showFeedbackIcon": true, "checkingType": "absdiff", "marks": 1, "answer": "a and b", "type": "jme", "variableReplacementStrategy": "originalfirst", "customName": "", "prompt": "$a$ and $b$ are booleans.
\nThe correct answer is $a \\wedge b$, entered as a and b
.
$a$ must be a vector
\nThe correct answer is $\\begin{pmatrix}1\\\\2\\\\3\\end{pmatrix} \\cdot a$, entered as dot(vector(1,2,3),a)
.
In this question, the correct answers can't be evaluated by substituting numbers for each of the variables.
Numbas\n can now infer the types of variables in the answers to mathematical \nexpression parts, so questions like this can be marked.
"}, "type": "exam"}, {"name": "Mark equations", "extensions": ["eukleides", "quantities", "random_person"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "http://localhost:8000/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/7/"}, {"name": "Chris Graham", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/369/"}], "tags": [], "metadata": {"description": "All the answers in this question are equations. In order to mark each\n equation, Numbas needs to pick some values that satisfy the equation \nand some that don't, and check that the student's answer agrees with the\n expected answer.
Any equation with the same solution set as the expected answer will be marked correct.
", "licence": "Creative Commons Attribution 4.0 International"}, "statement": "All the answers in this question are equations. In order to mark each equation, Numbas needs to pick some values that satisfy the equation and some that don't, and check that the student's answer agrees with the expected answer.
\nAny equation with the same solution set as the expected answer will be marked correct.
", "advice": "", "rulesets": {}, "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"factor": {"name": "factor", "group": "Ungrouped variables", "definition": "random(2 .. 8#1)", "description": "", "templateType": "randrange", "can_override": false}, "a": {"name": "a", "group": "Ungrouped variables", "definition": "1", "description": "", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["a", "factor"], "variable_groups": [], "functions": {}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "jme", "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": "$s = \\simplify[]{{factor}p}$
\nAlso try $s-\\var{factor}p=0$ and $p=s/\\var{factor}$.
", "answer": "s={factor}p", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": "10", "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "valuegenerators": [{"name": "p", "value": ""}, {"name": "s", "value": "random(random(vRange),factor*p)"}]}, {"type": "jme", "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": "$s = \\simplify[]{{factor}p}$
\nBut this time there's a pattern-match restriction that your answer must be of the form $s = \\ldots$.
", "answer": "s={factor}p", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": "10", "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "mustmatchpattern": {"pattern": "s=?", "partialCredit": 0, "message": "Your answer must be in the form $s = f(p)$.", "nameToCompare": ""}, "valuegenerators": [{"name": "p", "value": ""}, {"name": "s", "value": "random(random(vRange),factor*p)"}]}, {"type": "jme", "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": "$x^2+y^2=1$
\nAlso try $1-x^2-y^2=0$ and $y=\\sqrt{1-x^2}$.
", "answer": "x^2+y^2=1", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": "10", "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "valuegenerators": [{"name": "x", "value": ""}, {"name": "y", "value": "random(random(vRange),sqrt(1-x^2))"}]}, {"type": "jme", "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": "$x^2 + y^2 + z^2=1$
", "answer": "x^2+y^2+z^2=1", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": "10", "vsetRange": [0, "0.5"], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "valuegenerators": [{"name": "x", "value": ""}, {"name": "y", "value": ""}, {"name": "z", "value": "random(random(vRange),sqrt(1-x^2-y^2))"}]}, {"type": "jme", "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": "$x^2+y^2>1$
\nBecause this is an inequality, we need to randomly pick values either side of the critical curve, and some exactly on it.
", "answer": "x^2+y^2>1", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": "10", "vsetRange": ["-1", 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "valuegenerators": [{"name": "x", "value": ""}, {"name": "y", "value": "sqrt(1-x^2)+random(0,random(-0.001..0.001#0))"}]}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "type": "question"}]}, {"name": "High-precision numbers", "pickQuestions": 1, "pickingStrategy": "all-ordered", "questions": [{"name": "Approximate sqrt(n) to a lot of decimal places", "extensions": ["eukleides", "quantities", "random_person"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "http://localhost:8000/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/7/"}], "tags": [], "metadata": {"description": "The student is asked to enter an approximation to $\\sqrt{n}$, where $n$ is not a square number, to 20 decimal places.
This question is a demonstration of the high precision arithmetic in Numbas v4.
The square root of n.
", "templateType": "anything"}, "n": {"name": "n", "group": "Ungrouped variables", "definition": "dec(random(2..10 except [4,9]))", "description": "The number to take the square root of
", "templateType": "anything"}, "dp": {"name": "dp", "group": "Ungrouped variables", "definition": "20", "description": "The number of decimal places the student must compute.
", "templateType": "anything"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["n", "root", "dp"], "variable_groups": [], "functions": {}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "numberentry", "useCustomName": false, "customName": "", "marks": 1, "showCorrectAnswer": true, "showFeedbackIcon": true, "scripts": {}, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "adaptiveMarkingPenalty": 0, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "prompt": "Approximate $\\sqrt{\\var{n}}$ to {dp} decimal places.
", "minValue": "root", "maxValue": "root", "correctAnswerFraction": false, "allowFractions": false, "mustBeReduced": false, "mustBeReducedPC": 0, "precisionType": "dp", "precision": "dp", "precisionPartialCredit": 0, "precisionMessage": "You have not given your answer to the correct precision.", "strictPrecision": true, "showPrecisionHint": true, "notationStyles": ["plain", "en", "si-en"], "correctAnswerStyle": "plain"}], "type": "question"}, {"name": "Avogadro's number", "extensions": ["quantities"], "custom_part_types": [{"marking_script": "mark:\napply(student_quantity);\napply(has_units);\napply(compatible);\ntry(\n correctif(close_enough),\n x,\n apply(student_quantity)\n);\napply(same_units)\n\ninterpreted_answer:\nstudent_quantity\n\nallowed_notation_styles:\n[\"plain\",\"en\"]\n\nmatch_student_number:\nmatchnumber(studentAnswer,allowed_notation_styles)\n\nstudent_number:\nmatch_student_number[1]\n\nstudent_units:\ntry(\n quantity(studentAnswer[len(match_student_number[0])..len(studentAnswer)]),\n message,\n warn(\"Your answer is not a valid quantity.\");\n fail(\"Your answer is not a valid quantity.\")\n)\n\nstudent_quantity:\napply(student_units);\ntry(\n student_number * student_units,\n message,\n warn(\"Your answer is not a valid quantity.\");\n fail(\"Your answer is not a valid quantity.\")\n)\n\ncorrect_quantity:\nsettings[\"correctAnswer\"]\n\ncompatible:\nif(student_quantity<>false and compatible(student_quantity,correct_quantity),\n true\n,\n incorrect(\"Your answer does not have the correct dimensions.\");\n end();\n false\n)\n\ncorrect_units:\nunits(correct_quantity)\n\nsame_units:\nassert(units(student_quantity)=units(correct_quantity),\n let(\n message,if(settings[\"hint\"]=\"show units\",\"You did not give your answer in \"+units_string(correct_units)+\".\", \"Your answer is not in the expected units.\"),\n switch(\n settings[\"different_units_action\"]=\"prevent\",\n warn(message);\n fail(message)\n ,\n settings[\"different_units_action\"]=\"incorrect\",\n incorrect(message); \n warn(message);\n end()\n ,\n settings[\"different_units_action\"]=\"warn\",\n warn(message);\n multiply_credit(settings[\"different_units_penalty\"],message)\n ,\n settings[\"different_units_penalty\"]<1,\n multiply_credit(settings[\"different_units_penalty\"],message)\n ,\n false\n )\n );\n false\n)\n\nhas_units:\nassert(not unitless(student_quantity),\n assert(settings[\"allow_unitless\"],\n warn(\"You must include the units in your answer.\");\n fail(\"You did not include units in your answer.\")\n )\n)\n\nclose_enough:\nif(compatible,\n student_quantity>=correct_quantity - wiggle \n and \n student_quantity<=correct_quantity + wiggle \n,\n false\n)\n\nwiggle:\nunits(correct_quantity)*eval(settings[\"wiggle\"])", "description": "The student enters a quantity with units. Their answer is marked correct if they give both the right amount and the right units.
", "short_name": "quantity", "marking_notes": [{"description": "This is the main marking note. It should award credit and provide feedback based on the student's answer.", "definition": "apply(student_quantity);\napply(has_units);\napply(compatible);\ntry(\n correctif(close_enough),\n x,\n apply(student_quantity)\n);\napply(same_units)", "name": "mark"}, {"description": "A value representing the student's answer to this part.", "definition": "student_quantity", "name": "interpreted_answer"}, {"description": "", "definition": "[\"plain\",\"en\"]", "name": "allowed_notation_styles"}, {"description": "", "definition": "matchnumber(studentAnswer,allowed_notation_styles)", "name": "match_student_number"}, {"description": "", "definition": "match_student_number[1]", "name": "student_number"}, {"description": "", "definition": "try(\n quantity(studentAnswer[len(match_student_number[0])..len(studentAnswer)]),\n message,\n warn(\"Your answer is not a valid quantity.\");\n fail(\"Your answer is not a valid quantity.\")\n)", "name": "student_units"}, {"description": "The student's answer, interpreted as a quantity.
\nMarking fails if the student does not enter a valid quantity.
", "definition": "apply(student_units);\ntry(\n student_number * student_units,\n message,\n warn(\"Your answer is not a valid quantity.\");\n fail(\"Your answer is not a valid quantity.\")\n)", "name": "student_quantity"}, {"description": "", "definition": "settings[\"correctAnswer\"]", "name": "correct_quantity"}, {"description": "Are the units of the student's quantity compatible with the units of the expected quantity?
", "definition": "if(student_quantity<>false and compatible(student_quantity,correct_quantity),\n true\n,\n incorrect(\"Your answer does not have the correct dimensions.\");\n end();\n false\n)", "name": "compatible"}, {"description": "", "definition": "units(correct_quantity)", "name": "correct_units"}, {"description": "Are the student's quantity and the expected quantity in exactly the same units?
", "definition": "assert(units(student_quantity)=units(correct_quantity),\n let(\n message,if(settings[\"hint\"]=\"show units\",\"You did not give your answer in \"+units_string(correct_units)+\".\", \"Your answer is not in the expected units.\"),\n switch(\n settings[\"different_units_action\"]=\"prevent\",\n warn(message);\n fail(message)\n ,\n settings[\"different_units_action\"]=\"incorrect\",\n incorrect(message); \n warn(message);\n end()\n ,\n settings[\"different_units_action\"]=\"warn\",\n warn(message);\n multiply_credit(settings[\"different_units_penalty\"],message)\n ,\n settings[\"different_units_penalty\"]<1,\n multiply_credit(settings[\"different_units_penalty\"],message)\n ,\n false\n )\n );\n false\n)", "name": "same_units"}, {"description": "", "definition": "assert(not unitless(student_quantity),\n assert(settings[\"allow_unitless\"],\n warn(\"You must include the units in your answer.\");\n fail(\"You did not include units in your answer.\")\n )\n)", "name": "has_units"}, {"description": "", "definition": "if(compatible,\n student_quantity>=correct_quantity - wiggle \n and \n student_quantity<=correct_quantity + wiggle \n,\n false\n)", "name": "close_enough"}, {"description": "", "definition": "units(correct_quantity)*eval(settings[\"wiggle\"])", "name": "wiggle"}], "public_availability": "restricted", "extensions": ["quantities"], "source": {"author": {"name": "Christian Lawson-Perfect", "pk": 1}, "edit_page": "/part_type/27/edit", "pk": 27}, "published": false, "input_options": {"hint": {"static": false, "value": "switch(\n settings[\"hint\"]=\"remind units\",\n \"Include units in your answer.\",\n settings[\"hint\"]=\"show units\",\n \"Give your answer in \"+units_string(settings[\"correctAnswer\"])\n ,\n \"\"\n)"}, "allowEmpty": {"static": true, "value": false}, "correctAnswer": "string(settings[\"correctAnswer\"])"}, "can_be_step": true, "can_be_gap": true, "help_url": "", "settings": [{"hint": "The expected quantity.", "label": "Correct answer", "evaluate": true, "input_type": "code", "help_url": "", "default_value": "", "name": "correctAnswer"}, {"hint": "", "label": "Input hint", "default_value": "remind units", "input_type": "dropdown", "help_url": "", "choices": [{"label": "None", "value": "none"}, {"label": "Remind to include units", "value": "remind units"}, {"label": "Show required units", "value": "show units"}], "name": "hint"}, {"hint": "If not ticked, the student is prevented from submitting an answer without specifying units.", "label": "Allow unitless answer?", "input_type": "checkbox", "help_url": "", "default_value": true, "name": "allow_unitless"}, {"hint": "If the student's answer is given in different units to the expected answer:Moles of carbon
", "templateType": "anything", "definition": "qty(random(0.25..2#0.25 except 1),\"mol\")", "name": "moles"}, "avogadro": {"group": "Ungrouped variables", "description": "", "templateType": "anything", "definition": "qty(dec(\"6.02214076e+23\"),\"1/mol\")", "name": "avogadro"}, "grams": {"group": "Ungrouped variables", "description": "Number of grams of carbon
", "templateType": "anything", "definition": "c_mass*moles", "name": "grams"}, "c_mass": {"group": "Ungrouped variables", "description": "Atomic mass of Carbon
", "templateType": "anything", "definition": "qty(12,\"g/mol\")", "name": "c_mass"}, "molecules": {"group": "Ungrouped variables", "description": "Number of molecules of carbon
", "templateType": "anything", "definition": "avogadro*moles", "name": "molecules"}}, "variable_groups": [], "functions": {}, "parts": [{"customName": "", "correctAnswerFraction": false, "precisionMessage": "You have not given your answer to the correct precision.", "precisionType": "sigfig", "useCustomName": false, "customMarkingAlgorithm": "q: settings[\"maxvalue\"]", "showPrecisionHint": true, "correctAnswerStyle": "scientific", "showCorrectAnswer": true, "notationStyles": ["plain", "en", "si-en", "scientific"], "maxValue": "scalar(avogadro)", "precision": "3", "type": "numberentry", "minValue": "scalar(avogadro)", "extendBaseMarkingAlgorithm": true, "mustBeReducedPC": 0, "precisionPartialCredit": 0, "scripts": {}, "prompt": "How many molecules are there in one mole of substance?
\nGive your answer in scientific notation in the form NeP
.
The atomic mass of carbon is 12. What is the mass of {moles} of carbon, in grams?
", "variableReplacementStrategy": "originalfirst", "useCustomName": false, "customMarkingAlgorithm": "", "unitTests": [], "settings": {"hint": "remind units", "allow_unitless": true, "wiggle": "10^-12", "correctAnswer": "grams", "different_units_action": "convert", "different_units_penalty": "100"}, "marks": 1, "extendBaseMarkingAlgorithm": true, "showCorrectAnswer": true, "type": "quantity", "variableReplacements": []}, {"customName": "", "correctAnswerFraction": false, "precisionMessage": "You have not given your answer to the correct precision.", "precisionType": "sigfig", "useCustomName": false, "customMarkingAlgorithm": "", "showPrecisionHint": true, "correctAnswerStyle": "plain", "showCorrectAnswer": true, "notationStyles": ["plain", "en", "si-en", "scientific"], "maxValue": "scalar(molecules)", "precision": "3", "type": "numberentry", "minValue": "scalar(molecules)", "extendBaseMarkingAlgorithm": true, "mustBeReducedPC": 0, "precisionPartialCredit": 0, "scripts": {}, "prompt": "How many molecules are there in {moles} of carbon?
\nGive your answer in scientific notation in the form NeP
.
The student is asked to give the Avogadro constant in scientific form, calculate the mass of a number of moles of carbon, in grams, and then calculate the number of molecules in that mass.
This is a demonstration of the high-precision decimal arithmetic in Numbas v4.0.
Some questions demonstrating new features in Numbas v4.0: pattern-matching, inference of variable types in mathematical expression parts, and marking equations.
", "licence": "Creative Commons Attribution 4.0 International"}, "percentPass": 0, "navigation": {"showresultspage": "oncompletion", "onleave": {"message": "", "action": "none"}, "reverse": true, "startpassword": "sesame", "showfrontpage": true, "preventleave": true, "browse": true, "allowregen": true}, "feedback": {"intro": "This exam demonstrates the new features in Numbas v4.0.
\nThe password to begin this exam is SESAME. (That's a new feature!)
", "advicethreshold": 0, "showanswerstate": true, "showactualmark": true, "allowrevealanswer": true, "feedbackmessages": [], "showtotalmark": true, "enterreviewmodeimmediately": true, "showexpectedanswerswhen": "inreview", "showpartfeedbackmessageswhen": "always", "showactualmarkwhen": "always", "showtotalmarkwhen": "always", "showanswerstatewhen": "always", "showadvicewhen": "never"}, "type": "exam", "contributors": [{"name": "Christian Lawson-Perfect", "profile_url": "http://localhost:8000/accounts/profile/1/"}, {"name": "Christian Lawson-Perfect", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/7/"}], "extensions": ["eukleides", "quantities", "random_person"], "custom_part_types": [{"source": {"pk": 7, "author": {"name": "Christian Lawson-Perfect", "pk": 7}, "edit_page": "/part_type/7/edit"}, "name": "Quantity with units", "short_name": "quantity", "description": "The student enters a quantity with units.
", "help_url": "https://github.com/numbas/numbas-extension-quantities", "input_widget": "string", "input_options": {"correctAnswer": "plain_string(settings[\"correctAnswer\"])", "hint": {"static": false, "value": "switch(\n settings[\"hint\"]=\"remind units\",\n \"Include units in your answer.\",\n settings[\"hint\"]=\"show units\",\n \"Give your answer in \"+units_string(settings[\"correctAnswer\"])\n ,\n \"\"\n)"}, "allowEmpty": {"static": true, "value": false}}, "can_be_gap": true, "can_be_step": true, "marking_script": "mark:\napply(valid_number);\napply(student_quantity);\napply(has_units);\napply(compatible);\ntry(\n correctif(close_enough),\n x,\n apply(student_quantity)\n);\napply(same_units)\n\ninterpreted_answer:\nstudent_quantity\n\nallowed_notation_styles:\n[\"plain\",\"en\"]\n\nmatch_student_number:\nmatchnumber(studentAnswer,allowed_notation_styles)\n\nstudent_number:\nmatch_student_number[1]\n\nraw_student_units:\ntry(\n quantity(studentAnswer[len(match_student_number[0])..len(studentAnswer)]),\n message,\n warn(\"Your answer is not a valid quantity.\");\n fail(\"Your answer is not a valid quantity.\")\n)\n\nstudent_units:\nif(compatible(raw_student_units,correct_units) or settings[\"incompatible_units_action\"]<>\"convert\",\n raw_student_units,\n correct_units\n)\n\nstudent_quantity:\napply(student_units);\ntry(\n student_number * student_units,\n message,\n warn(\"Your answer is not a valid quantity.\");\n fail(\"Your answer is not a valid quantity.\")\n)\n\ncorrect_quantity:\nsettings[\"correctAnswer\"]\n\ncompatible:\nif(compatible(raw_student_units,correct_quantity),\n true\n,\n let(message,\"Your answer does not have the correct dimensions.\",\n if(settings[\"incompatible_units_action\"]=\"prevent\",\n warn(message);\n fail(message)\n ,\n if(settings[\"incompatible_units_action\"]=\"convert\",\n incorrect(\"Your answer does not have the correct dimensions. It will be marked as if the correct dimensions were used, and then a penalty will be applied.\")\n ,\n incorrect(\"Your answer does not have the correct dimensions.\");\n end()\n )\n );\n false\n )\n)\n\ncorrect_units:\nunits(correct_quantity)\n\nsame_units:\nassert(raw_student_units=correct_units,\n let(\n message,if(settings[\"hint\"]=\"show units\",\"You did not give your answer in \"+units_string(correct_units)+\".\", \"Your answer is not in the expected units.\"),\n switch(\n settings[\"different_units_action\"]=\"prevent\",\n warn(message);\n fail(message)\n ,\n settings[\"different_units_action\"]=\"incorrect\",\n incorrect(message); \n warn(message);\n end()\n ,\n settings[\"different_units_action\"]=\"warn\",\n warn(message);\n multiply_credit(1-settings[\"different_units_penalty\"],message)\n ,\n settings[\"different_units_penalty\"]<1,\n multiply_credit(1-settings[\"different_units_penalty\"],message)\n ,\n false\n )\n );\n false\n)\n\nhas_units:\nassert(not unitless(student_quantity),\n assert(settings[\"allow_unitless\"],\n warn(\"You must include the units in your answer.\");\n fail(\"You did not include units in your answer.\")\n )\n)\n\ncan_compare:\ncompatible or settings[\"incompatible_units_action\"]=\"convert\"\n\nclose_enough:\nif(can_compare,\n student_quantity>=correct_quantity - wiggle \n and \n student_quantity<=correct_quantity + wiggle \n,\n false\n)\n\nwiggle:\nunits(correct_quantity)*abs(eval(settings[\"wiggle\"]))\n\nvalid_number:\nif(isNaN(student_number),\n warn(translate(\"part.numberentry.answer invalid\"));\n fail(translate(\"part.numberentry.answer invalid\"))\n,\n true\n )", "marking_notes": [{"name": "mark", "description": "This is the main marking note. It should award credit and provide feedback based on the student's answer.", "definition": "apply(valid_number);\napply(student_quantity);\napply(has_units);\napply(compatible);\ntry(\n correctif(close_enough),\n x,\n apply(student_quantity)\n);\napply(same_units)"}, {"name": "interpreted_answer", "description": "A value representing the student's answer to this part.", "definition": "student_quantity"}, {"name": "allowed_notation_styles", "description": "", "definition": "[\"plain\",\"en\"]"}, {"name": "match_student_number", "description": "", "definition": "matchnumber(studentAnswer,allowed_notation_styles)"}, {"name": "student_number", "description": "The scalar part of the student's quantity
", "definition": "match_student_number[1]"}, {"name": "raw_student_units", "description": "The units of the student's quantity, before converting.
", "definition": "try(\n quantity(studentAnswer[len(match_student_number[0])..len(studentAnswer)]),\n message,\n warn(\"Your answer is not a valid quantity.\");\n fail(\"Your answer is not a valid quantity.\")\n)"}, {"name": "student_units", "description": "The units of the student's quantity.
\nIf the student used units incompatible with the units in the expected answer, and the \"what to do if incompatible units used\" option is set to \"mark as if correct units used\", the student's units are ignored and the expected units are used instead.
", "definition": "if(compatible(raw_student_units,correct_units) or settings[\"incompatible_units_action\"]<>\"convert\",\n raw_student_units,\n correct_units\n)"}, {"name": "student_quantity", "description": "The student's answer, interpreted as a quantity.
\nMarking fails if the student does not enter a valid quantity.
", "definition": "apply(student_units);\ntry(\n student_number * student_units,\n message,\n warn(\"Your answer is not a valid quantity.\");\n fail(\"Your answer is not a valid quantity.\")\n)"}, {"name": "correct_quantity", "description": "", "definition": "settings[\"correctAnswer\"]"}, {"name": "compatible", "description": "Are the units of the student's quantity compatible with the units of the expected quantity?
", "definition": "if(compatible(raw_student_units,correct_quantity),\n true\n,\n let(message,\"Your answer does not have the correct dimensions.\",\n if(settings[\"incompatible_units_action\"]=\"prevent\",\n warn(message);\n fail(message)\n ,\n if(settings[\"incompatible_units_action\"]=\"convert\",\n incorrect(\"Your answer does not have the correct dimensions. It will be marked as if the correct dimensions were used, and then a penalty will be applied.\")\n ,\n incorrect(\"Your answer does not have the correct dimensions.\");\n end()\n )\n );\n false\n )\n)"}, {"name": "correct_units", "description": "", "definition": "units(correct_quantity)"}, {"name": "same_units", "description": "/Are the student's quantity and the expected quantity in exactly the same units?
", "definition": "assert(raw_student_units=correct_units,\n let(\n message,if(settings[\"hint\"]=\"show units\",\"You did not give your answer in \"+units_string(correct_units)+\".\", \"Your answer is not in the expected units.\"),\n switch(\n settings[\"different_units_action\"]=\"prevent\",\n warn(message);\n fail(message)\n ,\n settings[\"different_units_action\"]=\"incorrect\",\n incorrect(message); \n warn(message);\n end()\n ,\n settings[\"different_units_action\"]=\"warn\",\n warn(message);\n multiply_credit(1-settings[\"different_units_penalty\"],message)\n ,\n settings[\"different_units_penalty\"]<1,\n multiply_credit(1-settings[\"different_units_penalty\"],message)\n ,\n false\n )\n );\n false\n)"}, {"name": "has_units", "description": "", "definition": "assert(not unitless(student_quantity),\n assert(settings[\"allow_unitless\"],\n warn(\"You must include the units in your answer.\");\n fail(\"You did not include units in your answer.\")\n )\n)"}, {"name": "can_compare", "description": "Can the student's answer be compared with the correct answer? True if compatible units used, or \"mark as if correct units used\" selected.
", "definition": "compatible or settings[\"incompatible_units_action\"]=\"convert\""}, {"name": "close_enough", "description": "Is the student's quantity within the allowed tolerance of the expected answer?
", "definition": "if(can_compare,\n student_quantity>=correct_quantity - wiggle \n and \n student_quantity<=correct_quantity + wiggle \n,\n false\n)"}, {"name": "wiggle", "description": "", "definition": "units(correct_quantity)*abs(eval(settings[\"wiggle\"]))"}, {"name": "valid_number", "description": "Is the scalar part of the student's answer a valid number?
", "definition": "if(isNaN(student_number),\n warn(translate(\"part.numberentry.answer invalid\"));\n fail(translate(\"part.numberentry.answer invalid\"))\n,\n true\n )\n"}], "settings": [{"name": "correctAnswer", "label": "Correct answer", "help_url": "", "hint": "The expected quantity.", "input_type": "code", "default_value": "", "evaluate": true}, {"name": "hint", "label": "Input hint", "help_url": "", "hint": "", "input_type": "dropdown", "default_value": "remind units", "choices": [{"value": "none", "label": "None"}, {"value": "remind units", "label": "Remind to include units"}, {"value": "show units", "label": "Show required units"}]}, {"name": "allow_unitless", "label": "Allow unitless answer?", "help_url": "", "hint": "If not ticked, the student is prevented from submitting an answer without specifying units.", "input_type": "checkbox", "default_value": true}, {"name": "incompatible_units_action", "label": "What to do if incompatible units used", "help_url": "", "hint": "If the student's answer is given in units incompatible with the correct answer's units: