From 28da3c85093fb2c25237bff99d37dae995c49b2e Mon Sep 17 00:00:00 2001 From: pepinno Date: Wed, 17 Feb 2021 11:30:01 +0100 Subject: [PATCH] Ukazka prijimaciho testu - z webu IT --- .../prijimaci_rizeni/bakalarske/test.md | 4 + sass/main.scss | 4 +- static/bc_test/app.js | 286 +++++++++++++++ static/bc_test/data.json | 333 ++++++++++++++++++ static/bc_test/images/algoritmus.svg | 27 ++ static/bc_test/images/obvod.svg | 25 ++ static/bc_test/images/vzor.svg | 21 ++ static/bc_test/images/zamek.svg | 47 +++ templates/bc_test.html | 32 ++ 9 files changed, 777 insertions(+), 2 deletions(-) create mode 100644 content/uchazeci/prijimaci_rizeni/bakalarske/test.md create mode 100644 static/bc_test/app.js create mode 100644 static/bc_test/data.json create mode 100644 static/bc_test/images/algoritmus.svg create mode 100644 static/bc_test/images/obvod.svg create mode 100644 static/bc_test/images/vzor.svg create mode 100644 static/bc_test/images/zamek.svg create mode 100644 templates/bc_test.html diff --git a/content/uchazeci/prijimaci_rizeni/bakalarske/test.md b/content/uchazeci/prijimaci_rizeni/bakalarske/test.md new file mode 100644 index 0000000..93c29fd --- /dev/null +++ b/content/uchazeci/prijimaci_rizeni/bakalarske/test.md @@ -0,0 +1,4 @@ ++++ +title = "Ukázka přijímacího testu" +template = "bc_test.html" ++++ diff --git a/sass/main.scss b/sass/main.scss index 3c04163..fbbda5c 100644 --- a/sass/main.scss +++ b/sass/main.scss @@ -124,7 +124,7 @@ main { h1, h2, h3, h4, h5, h6 { font-weight: bold; - margin: 2em 0 1em 0; + margin: 1em 0; } h1 { font-size: 2em } h2 { font-size: 1.6em } @@ -135,7 +135,7 @@ main { } a { font-weight: bold } a:hover { text-decoration: underline } - + ul {list-style: disc; margin-left: 1em;} section { margin-bottom: 5rem; } diff --git a/static/bc_test/app.js b/static/bc_test/app.js new file mode 100644 index 0000000..f360258 --- /dev/null +++ b/static/bc_test/app.js @@ -0,0 +1,286 @@ +var exam = []; +var inputs = []; +var correctAnswersIdList = []; +var points = 0; +var maxPoints = 40; + +$(document).ready(function () { + // Create form + createExam(); + + // Catch submit action and change page without reload + performSubmit(); +}); + + + +function createExam() { + + // Load data from JSON + exam = (function () { + var exam = []; + $.ajax({ + async: false, + global: false, + url: "/bc_test/data.json", + dataType: "json", + success: function (data) { + exam = data; + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + // console.log("Status: " + textStatus); + // console.log("Error: " + errorThrown); + } + }); + return exam; + })(); + + var questions = document.getElementById("questions"); + var tasks = document.getElementById("tasks"); + + // console.log(exam); + + // Create HTML + shuffle(exam.questions).forEach(function (question) { + var container = createExamItem(question); + questions.appendChild(container); + }); + + // Create HTML + shuffle(exam.tasks).forEach(function (task) { + var container = createExamItem(task); + tasks.appendChild(container); + }); + + // console.log("I\'m done here!"); + +} + +function createExamItem(item) { + var container = document.createElement("DIV"); + var text = document.createElement("P"); + text.className = "question"; + + text.innerText = item.text; + container.appendChild(text); + + var path = "/bc_test/images/"; + + if (item.image !== null) { + var figure = document.createElement("FIGURE"); + + if (item.image.src !== undefined) { + var image = document.createElement("IMG"); + image.src = path + item.image.src; + figure.appendChild(image); + } + if (item.image.svg !== undefined) { + var object = document.createElement("OBJECT"); + object.data = path + item.image.svg; + object.type = "image/svg+xml"; + figure.appendChild(object); + } + + container.appendChild(figure); + } + var anscontainer = document.createElement("DIV"); + container.appendChild(anscontainer); + anscontainer.className="container"; + + if (item.answers.length > 1) { + // Create radio button with label for each of the answers + shuffle(item.answers).forEach(function (answer) { + + var id = item.id + "_" + answer.id; + + // Save input for later usage + inputs.push(id); + + var subContainer = document.createElement("DIV"); + subContainer.id = id + "_div"; + subContainer.className = "answer"; + + // Store all correct answers + if (answer.isCorrect) { + correctAnswersIdList.push(id); + } + + var input = document.createElement("INPUT"); + input.type = "radio"; + input.name = item.id; + input.id = id; + input.value = id; + // input.required = true; + + subContainer.appendChild(input); + + var label = document.createElement("LABEL"); + label.setAttribute("for", id); + label.innerText = answer.text; + + subContainer.appendChild(label); + + anscontainer.appendChild(subContainer); + + }); + } else { + var answer = item.answers[0]; + + var id = item.id + "_" + answer.id; + + // Save input for later usage + inputs.push(id); + + var subContainer = document.createElement("DIV"); + subContainer.id = id + "_div"; + subContainer.className = "answer single"; + + if (item.prefix != null) { + // console.log(item.prefix); + var prefix = document.createElement("SPAN"); + prefix.innerText = item.prefix; + subContainer.appendChild(prefix); + } + + var input = document.createElement("INPUT"); + input.type = "text"; + input.name = item.id; + input.id = id; + // input.required = true; + + subContainer.appendChild(input); + + anscontainer.appendChild(subContainer); + } + + // console.log(item); + + return container; +} + +function performSubmit() { + + $("#examFrom").submit(function (event) { + + // console.log(event); + + // Prevent form submit + event.preventDefault(); + + var correctAnswersId = []; + var wrongAnswersId = []; + var submittedAnswersId = []; + + // Collect all submitted answers + $("#examFrom :input[type=radio]").serializeArray().forEach(function (answer) { + submittedAnswersId.push(answer.value); + }); + + // Collect all wrong answers and count points + wrongAnswersId = $(submittedAnswersId).not(correctAnswersIdList).get(); + correctAnswersId = $(submittedAnswersId).not(wrongAnswersId).get(); + points = (submittedAnswersId.length - wrongAnswersId.length) * 2; + + // console.log(points); + + // Collect all submitted answers + $("#examFrom :input[type=text]").serializeArray().forEach(function (answer) { + + // Move on if there is no answer + if (!answer.value == "") { + (exam.questions).forEach(function (question) { + if (question.id == answer.name) { + if (question.answers[0].text.toLowerCase() == answer.value.toLowerCase()) { + correctAnswersId.push(answer.name + "_0"); + points += 2; + } else { + wrongAnswersId.push(answer.name + "_0"); + } + + /* + var solution = document.createElement("P"); + solution.innerText = "Správná odpověď je: " + question.answers[0].text; + document.getElementById(answer.name + "_0_div").appendChild(solution); + */ + } + }); + + (exam.tasks).forEach(function (task) { + if (task.id == answer.name) { + if (task.answers[0].text == answer.value) { + correctAnswersId.push(answer.name + "_0"); + points += 5; + } else { + wrongAnswersId.push(answer.name + "_0"); + } + + /* + var solution = document.createElement("P"); + solution.innerText = "Správná odpověď je: " + task.answers[0].text; + document.getElementById(answer.name + "_0_div").appendChild(solution); + */ + } + }); + } + + }); + + // console.log(points); + + // console.log(points); + + // Disable all inputs + /* + inputs.forEach(function (input) { + $("#" + input).prop('disabled', true); + }); + */ + + /* + console.log("Submitted: " + submittedAnswersId); + console.log("Wrong: " + wrongAnswersId); + console.log("Correct: " + correctAnswersId); + */ + + // Reset highlighting + $("div").removeAttr('style'); + + wrongAnswersId.forEach(function (wrongAnswer) { + $("#" + wrongAnswer + "_div").addClass("wrongAnswer"); + }); + + correctAnswersId.forEach(function (correctAnswer) { + $("#" + correctAnswer + "_div").removeClass("wrongAnswer").addClass("correctAnswer"); + }); + + // Delete submit button to prevent another submit + // $("input:submit:first-of-type").remove(); + + // TODO: Add preview of result + var resultsContainer = document.getElementById("results"); + var procnet = Number(points) * 100 /Number(maxPoints); + //resultsContainer.innerHTML = "

Získáno "+ procnet + "% (" + points + "/" + maxPoints +") bodů.

Správně

" + correctAnswersId.length + " otázek ze " + (exam.questions.length + exam.tasks.length) + "

"; + resultsContainer.innerHTML = procnet + "%"; + + }); +} + +// Shuffles the given array to create random order +function shuffle(array) { + var currentIndex = array.length, temporaryValue, randomIndex; + + // While there remain elements to shuffle... + while (0 !== currentIndex) { + + // Pick a remaining element... + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex -= 1; + + // And swap it with the current element. + temporaryValue = array[currentIndex]; + array[currentIndex] = array[randomIndex]; + array[randomIndex] = temporaryValue; + } + + return array; +} \ No newline at end of file diff --git a/static/bc_test/data.json b/static/bc_test/data.json new file mode 100644 index 0000000..970051a --- /dev/null +++ b/static/bc_test/data.json @@ -0,0 +1,333 @@ +{ + "questions": [ + { + "id": 0, + "text": "Protokol pro přenos hypertextových dokumentů v Internetu označujeme:", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "html", + "isCorrect": false + }, + { + "id": 1, + "text": "http", + "isCorrect": true + }, + { + "id": 2, + "text": "url", + "isCorrect": false + }, + { + "id": 3, + "text": "www", + "isCorrect": false + } + ] + }, + { + "id": 1, + "text": "Text v šestnáctkovém kódování má podobu 4D4154454D4154494B41. Po zpětném dekódování dostaneme:", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "INFORMATIK", + "isCorrect": false + }, + { + "id": 1, + "text": "LOGISTICKY", + "isCorrect": false + }, + { + "id": 2, + "text": "ARITMETIKA", + "isCorrect": false + }, + { + "id": 3, + "text": "MATEMATIKA", + "isCorrect": true + } + ] + }, + { + "id": 2, + "text": "Součet dvou čísel vyjádřený ve dvojkové soustavě 110011 a 100001 je ve dvojkové soustavě roven:", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "1100110", + "isCorrect": false + }, + { + "id": 1, + "text": "1010100", + "isCorrect": true + }, + { + "id": 2, + "text": "1001100", + "isCorrect": false + }, + { + "id": 3, + "text": "1111000", + "isCorrect": false + } + ] + }, + { + "id": 3, + "text": "Jakou zkratkou označujeme optické rozpoznávání znaků?", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "URL", + "isCorrect": false + }, + { + "id": 1, + "text": "OCR", + "isCorrect": true + }, + { + "id": 2, + "text": "OZR", + "isCorrect": false + }, + { + "id": 3, + "text": "ORL", + "isCorrect": false + } + ] + }, + { + "id": 4, + "text": "Úhlopříčka obrazovky mobilního telefonu o délce 5\" (palců) je rovna:", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "50 cm", + "isCorrect": false + }, + { + "id": 1, + "text": "24,5 cm", + "isCorrect": false + }, + { + "id": 2, + "text": "17,78 cm", + "isCorrect": false + }, + { + "id": 3, + "text": "12,7 cm", + "isCorrect": true + } + ] + }, + { + "id": 5, + "text": "Senátora, který se účastnil se 17 senátory zasedání senátu se zeptali: \"Jak velká část senátu je dnes přítomna?\" Odpověděl: \"Dnes jsou zde jen dvě třetiny z třetiny celého senátu.\" Kolik senátorů je celkem v senátu?", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "81", + "isCorrect": true + }, + { + "id": 1, + "text": "51", + "isCorrect": false + }, + { + "id": 2, + "text": "68", + "isCorrect": false + }, + { + "id": 3, + "text": "76", + "isCorrect": false + } + ] + }, + { + "id": 6, + "text": "Před včerejškem byl podle kalendáře den, který předchází středě. Jaký den bude pozítří?", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "sobota", + "isCorrect": true + } + ] + }, + { + "id": 7, + "text": "Určete celkový odpor na svorkách obvodu zapojeného podle schématu:", + "image": { + + "svg": "obvod.svg" + }, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "2R", + "isCorrect": false + }, + { + "id": 1, + "text": "3R", + "isCorrect": false + }, + { + "id": 2, + "text": "1/2R", + "isCorrect": false + }, + { + "id": 3, + "text": "3/2R", + "isCorrect": true + } + ] + }, + { + "id": 8, + "text": "Která z uvedených vzdáleností je nejdelší?", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "tři sta milionů cm", + "isCorrect": true + }, + { + "id": 1, + "text": "dvě miliardy mm", + "isCorrect": false + }, + { + "id": 2, + "text": "sto tisíc m", + "isCorrect": false + }, + { + "id": 3, + "text": "tisíc šest set km", + "isCorrect": false + } + ] + }, + { + "id": 9, + "text": "Elektrická energie 1 kWh je odebrána spotřebičem o odporu 20 Ω za dobu 30 minut. Čemu je roven proud?", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "2 A", + "isCorrect": false + }, + { + "id": 1, + "text": "4 A", + "isCorrect": false + }, + { + "id": 2, + "text": "10 A", + "isCorrect": true + }, + { + "id": 3, + "text": "20 A", + "isCorrect": false + } + ] + } + ], + "tasks": [ + { + "id": 10, + "text": "Krokujte algoritmus znázorněný následujícím ikonickým zápisem a určete jaká hodnota bude na konci programu vypsána.", + "image": { + + "svg": "algoritmus.svg" + }, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "15", + "isCorrect": true + } + ] + }, + { + "id": 11, + "text": "Určete číslice K, L, M a N, různé od nuly, tak, aby z nich vzniklá čísla vyhovovala součtu čísel v desítkové soustavě podle vzoru:", + "image": { + "svg": "vzor.svg" + }, + "prefix": "KLMN = ", + "answers": [ + { + "id": 0, + "text": "1573", + "isCorrect": true + } + ] + }, + { + "id": 12, + "text": "Určete součet prvních osmi členů aritmetické posloupnosti, jestliže se součet prvních tří členů rovná 12 a součet prvních pěti členů je 30.", + "image": null, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "72", + "isCorrect": true + } + ] + }, + { + "id": 13, + "text": "Zjistěte třímístný číselný kód k zámku pro který platí následující tvrzení o jednotlivých kombinacích:", + "image": { + "svg": "zamek.svg" + }, + "prefix": null, + "answers": [ + { + "id": 0, + "text": "042", + "isCorrect": true + } + ] + } + ] +} \ No newline at end of file diff --git a/static/bc_test/images/algoritmus.svg b/static/bc_test/images/algoritmus.svg new file mode 100644 index 0000000..f87d81b --- /dev/null +++ b/static/bc_test/images/algoritmus.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + +Když je a dělitelné třemi beze zbytku + +START + +Nastav a na 0 + +Opakuj 10 krát + +Zvyš a o 1 + +Zvyš a o 2 + +Ukaž proměnnou a + +jinak + diff --git a/static/bc_test/images/obvod.svg b/static/bc_test/images/obvod.svg new file mode 100644 index 0000000..acdbb35 --- /dev/null +++ b/static/bc_test/images/obvod.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + +R + +R + +R + diff --git a/static/bc_test/images/vzor.svg b/static/bc_test/images/vzor.svg new file mode 100644 index 0000000..af241ff --- /dev/null +++ b/static/bc_test/images/vzor.svg @@ -0,0 +1,21 @@ + + + + +K +L +M +N +L +M +N +M +N +N + +2 +2 +2 +2 + diff --git a/static/bc_test/images/zamek.svg b/static/bc_test/images/zamek.svg new file mode 100644 index 0000000..837fafe --- /dev/null +++ b/static/bc_test/images/zamek.svg @@ -0,0 +1,47 @@ + + + + + +6 +8 +2 + + + +6 +1 +4 + + + +2 +0 +6 + + + +7 +3 +8 + + + +7 +8 +0 + + +jedno číslo je správně a na správném místě +jedno číslo je správně, ale na špatném místě +dvě čísla jsou správně, ale na špatných místech +žádné číslo není správně +jedno číslo je správně, ale na špatném místě + diff --git a/templates/bc_test.html b/templates/bc_test.html new file mode 100644 index 0000000..3b0f295 --- /dev/null +++ b/templates/bc_test.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} +{% block extra %} +{{ macro::breadcrumbs(page=page) }} +{% endblock %} + +{% block content %} + +
+ + +
+

{{ page.title }}

+
+
Test sestává z 10 testových otázek po dvou bodech a 4 úloh po pěti bodech. Po odeslání se zvýrazní + správně a chybně zodpovězené otázky a vypíše procentuální úspěšnost řešení. +
+
+
+
+ +
+ + + +
+ + + + + +
+{% endblock content %} \ No newline at end of file