Add new quiz generator
This commit is contained in:
parent
309d3e18a0
commit
f1879cb843
1 changed files with 77 additions and 9 deletions
|
@ -3,8 +3,16 @@
|
||||||
<h1>MillironX's Anatomy Quiz Generator</h1>
|
<h1>MillironX's Anatomy Quiz Generator</h1>
|
||||||
<h2>Quiz material weighting</h2>
|
<h2>Quiz material weighting</h2>
|
||||||
<div id="weights"></div>
|
<div id="weights"></div>
|
||||||
|
<hr />
|
||||||
|
<div>
|
||||||
|
<label for="num-questions">Number of questions </label>
|
||||||
|
<input id="num-questions" type="number" value="15" />
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
<button onClick="generate_quiz">Generate!</button>
|
||||||
|
<hr />
|
||||||
|
<h2>Quiz</h2>
|
||||||
<ul id="quiz-terms"></ul>
|
<ul id="quiz-terms"></ul>
|
||||||
<code id="quiz"></code>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const BoldTerms = {
|
const BoldTerms = {
|
||||||
|
@ -143,6 +151,73 @@
|
||||||
weights_spinner_div.append(form_div);
|
weights_spinner_div.append(form_div);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shamelessly stolen from
|
||||||
|
// https://github.com/trekhleb/javascript-algorithms/blob/master/src/algorithms/statistics/weighted-random/weightedRandom.js
|
||||||
|
function weighted_random(items, weights) {
|
||||||
|
const cumulativeWeights = [];
|
||||||
|
for (let i = 0; i < weights.length; i += 1) {
|
||||||
|
cumulativeWeights[i] = weights[i] + (cumulativeWeights[i - 1] || 0);
|
||||||
|
}
|
||||||
|
const maxCumulativeWeight =
|
||||||
|
cumulativeWeights[cumulativeWeights.length - 1];
|
||||||
|
const randomNumber = maxCumulativeWeight * Math.random();
|
||||||
|
|
||||||
|
for (let itemIndex = 0; itemIndex < items.length; itemIndex += 1) {
|
||||||
|
if (cumulativeWeights[itemIndex] >= randomNumber) {
|
||||||
|
return items[itemIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shamelessly stolen from
|
||||||
|
// https://stackoverflow.com/a/15106541
|
||||||
|
function random_child(object) {
|
||||||
|
const keys = Object.keys(object);
|
||||||
|
const i = Math.floor(Math.random() * keys.length);
|
||||||
|
return {
|
||||||
|
key: keys[i],
|
||||||
|
object: object[keys[i]],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const terms_list = document.getElementById("quiz-terms");
|
||||||
|
|
||||||
|
function generate_quiz() {
|
||||||
|
let weights = [];
|
||||||
|
let types = [];
|
||||||
|
|
||||||
|
for (structure_type in BoldTerms) {
|
||||||
|
weights.push(
|
||||||
|
parseInt(document.getElementById(`${structure_type}-weight`).value)
|
||||||
|
);
|
||||||
|
types.push(structure_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
const num_questions = document.getElementById("num-questions").value;
|
||||||
|
for (let i = 0; i <= num_questions; i += 1) {
|
||||||
|
// Pick the random category
|
||||||
|
const structure_type = weighted_random(types, weights);
|
||||||
|
|
||||||
|
// Pick a random structure from that category
|
||||||
|
const rand_structure = random_child(BoldTerms[structure_type]);
|
||||||
|
|
||||||
|
// Get the list of questions for that structure
|
||||||
|
const questions = structure_question(
|
||||||
|
rand_structure.key,
|
||||||
|
rand_structure.object
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get a random question from that list
|
||||||
|
const rand_question =
|
||||||
|
questions[Math.floor(Math.random() * questions.length)];
|
||||||
|
|
||||||
|
// Add that structure to the list
|
||||||
|
let term_item = document.createElement("li");
|
||||||
|
term_item.innerHTML = rand_question;
|
||||||
|
terms_list.appendChild(term_item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const terms = [
|
const terms = [
|
||||||
"scapula: glenoid cavity",
|
"scapula: glenoid cavity",
|
||||||
"scapula: neck",
|
"scapula: neck",
|
||||||
|
@ -481,13 +556,6 @@
|
||||||
"Iliopsoas"
|
"Iliopsoas"
|
||||||
];
|
];
|
||||||
|
|
||||||
const terms_list = document.getElementById("quiz-terms");
|
generate_quiz();
|
||||||
|
|
||||||
for (let i = 0; i < 10; i++) {
|
|
||||||
let rand_term = terms[Math.floor(Math.random()*terms.length)];
|
|
||||||
let term_item = document.createElement("li");
|
|
||||||
term_item.innerHTML = rand_term;
|
|
||||||
terms_list.appendChild(term_item);
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
Loading…
Reference in a new issue