Skip to content

Commit fdf2dcf

Browse files
author
aryan
committed
Advance question calculator - which can store value of one formula as it's label and can be put to use in another formula
1 parent d4f56f8 commit fdf2dcf

5 files changed

Lines changed: 63 additions & 25 deletions

File tree

content/exercises/graded-assignments/statistics-1/week-4-questions.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ Therefore, Population standard deviation of sales of OnePlus = $\sqrt{\sigma_x^2
5353

5454
---
5555

56+
{{< qna/question >}}
57+
{{< qna/input name="a" value="2" >}}
58+
{{< qna/input name="b" value="3" >}}
59+
{{< qna/formula label="sum" value="a + b" >}}
60+
{{< qna/formula label="average" value="sum / 2" >}}
61+
{{< qna/result >}}
62+
{{< /qna/question >}}
63+
5664
#### 2. What is the sample standard deviation of sales of BBK Electronics? (Enter the answer correct to 2 decimal accuracy)
5765

5866
**Solution:**

layouts/shortcodes/qna/formula.html

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{{ $wrapper := .Parent.Get "wrapperId" }}
2-
<div>
2+
{{/* <div>
33
<label class="calc-label" for="formula-{{ $wrapper }}">{{ .Get "label" | default "Formula:" }} =</label>
44
<input class="calc-formula" type="text" id="formula-{{ $wrapper }}" data-calc-formula value="{{ .Get "value" | default "a + b" }}">
5-
</div>
5+
</div> */}}
66

77
{{/* <div>
88
<label class="calc-label" for="formula-{{ $wrapper }}">Formula:</label>
@@ -18,4 +18,14 @@
1818
<p class="calc-formula" id="formula-{{ $wrapper }}" data-calc-formula>
1919
{{ .Get "value" | default "a + b" }}
2020
</p>
21-
</div> */}}
21+
</div> */}}
22+
23+
{{ $label := .Get "label" | default (printf "formula_%s" $wrapper) }}
24+
<div>
25+
<label class="calc-label" for="formula-{{ $wrapper }}">
26+
{{ $label }}
27+
</label>
28+
<p class="calc-formula" id="formula-{{ $wrapper }}" data-calc-formula="{{ .Get "value" | default "a + b" }}" data-calc-label="{{ $label }}">
29+
{{ .Get "value" | default "a + b" }}<span class="calc-formula-result"></span>
30+
</p>
31+
</div>

layouts/shortcodes/qna/input.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,10 @@
1010

1111
{{/* <label class="calc-label" for="input-{{ $wrapper }}-{{ .Get "name" }}">{{ .Get "name" | title }}:</label> */}}
1212
{{/* <input class="calc-input" type="number" id="input-{{ $wrapper }}-{{ .Get "name" }}" data-calc-var="{{ .Get "name" }}" value="{{ .Get "value" | default "0" }}"> */}}
13+
{{/* <input class="calc-input" type="number" id="input-{{ $wrapper }}-{{ .Get "name" }}" data-calc-var="{{ .Get "name" }}" value="{{ .Get "value" | default "0" }}"> */}}
14+
15+
16+
<div>
17+
<label class="calc-label" for="input-{{ $wrapper }}-{{ .Get "name" }}">{{ .Get "name" | title }}:</label>
1318
<input class="calc-input" type="number" id="input-{{ $wrapper }}-{{ .Get "name" }}" data-calc-var="{{ .Get "name" }}" value="{{ .Get "value" | default "0" }}">
19+
</div>

layouts/shortcodes/qna/question.html

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,49 @@
88
<div class="calc-fields">
99
{{ .Inner | .Page.RenderString (dict "wrapperId" $wrapperId) }}
1010
</div>
11-
<button class="calc-btn" onclick="calc_('{{$wrapperId}}')">Calculate</button>
12-
<div class="calc-answer" id="answer-{{ $wrapperId }}">Result: </div>
11+
<button class="calc-btn" onclick="calc_('{{ $wrapperId }}')">Calculate</button>
1312
</div>
14-
1513
<script>
1614
function calc_(Id) {
17-
// Use the wrapper ID to find the correct elements
18-
var wrapper = document.getElementById(Id);
19-
{{/* var wrapper = document.getElementById('{{ $wrapperId }}'); */}}
15+
var wrapper = document.getElementById(Id);
2016
var inputs = wrapper.querySelectorAll('input[data-calc-var]');
2117
var vars = {};
2218
inputs.forEach(function(input) {
2319
var name = input.getAttribute('data-calc-var');
2420
vars[name] = parseFloat(input.value) || 0;
2521
});
26-
var formulaInput = wrapper.querySelector('input[data-calc-formula]');
27-
var answerDiv = wrapper.querySelector('.calc-answer');
28-
if (!formulaInput || !answerDiv) {
29-
answerDiv.textContent = "Result: Error (missing formula or answer)";
30-
return;
31-
}
32-
var formula = formulaInput.value;
33-
Object.keys(vars).forEach(function(name) {
34-
var re = new RegExp('\\b' + name + '\\b', 'g');
35-
formula = formula.replace(re, vars[name]);
22+
23+
// Evaluate formulas in order, storing results by label
24+
var formulas = wrapper.querySelectorAll('[data-calc-formula]');
25+
formulas.forEach(function(formulaEl) {
26+
var label = formulaEl.getAttribute('data-calc-label');
27+
var formula = formulaEl.getAttribute('data-calc-formula');
28+
// Replace all variable names in the formula with their values
29+
Object.keys(vars).forEach(function(name) {
30+
var re = new RegExp('\\b' + name + '\\b', 'g');
31+
formula = formula.replace(re, vars[name]);
32+
});
33+
// Replace previous formula results by label
34+
Object.keys(vars).forEach(function(name) {
35+
var re = new RegExp('\\b' + name + '\\b', 'g');
36+
formula = formula.replace(re, vars[name]);
37+
});
38+
try {
39+
var result = eval(formula);
40+
vars[label] = result;
41+
// Show result in the formula label if a result span exists
42+
var resultSpan = formulaEl.parentElement.querySelector('.calc-formula-result');
43+
if(resultSpan) resultSpan.textContent = " = " + result;
44+
} catch (e) {
45+
if(resultSpan) resultSpan.textContent = " = Error";
46+
}
3647
});
37-
try {
38-
var result = eval(formula);
39-
answerDiv.textContent = "Result: " + result;
40-
} catch (e) {
41-
answerDiv.textContent = "Result: Error";
48+
49+
// Show the last formula's result in the answer box
50+
var lastLabel = formulas.length ? formulas[formulas.length-1].getAttribute('data-calc-label') : null;
51+
var answerDiv = wrapper.querySelector('.calc-answer');
52+
if (answerDiv && lastLabel && vars[lastLabel] !== undefined) {
53+
answerDiv.textContent = "Result: " + vars[lastLabel];
4254
}
4355
}
4456
</script>

layouts/shortcodes/qna/result.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
{{ $wrapper := .Parent.Get "wrapperId" }}
2-
<!-- The answer box is now handled in calc-wrapper for better styling and placement -->
2+
<!-- The answer box is now handled in calc-wrapper for better styling and placement -->
3+
4+
<div class="calc-answer" id="answer-{{ $wrapper }}">Result: </div>

0 commit comments

Comments
 (0)