Commit faa5cc6b authored by Henrik Tramberend's avatar Henrik Tramberend
Browse files

Add examiner example

parent 33c932e2
......@@ -20,6 +20,7 @@ import Development.Shake
import Development.Shake.FilePath
import Embed
import Filter
import Project
import Shuffle
import Student
import System.Directory
......@@ -36,7 +37,6 @@ import Text.Pandoc
import Text.Pandoc.PDF
import Text.Pandoc.Walk
import Utilities
import Project
replaceSuffix srcSuffix targetSuffix filename =
dropSuffix srcSuffix filename ++ targetSuffix
......@@ -85,21 +85,21 @@ main = do
let string = Y.encodePretty Y.defConfig examStationary
liftIO $ B.writeFile "new-exam.yaml" string
--
phony "new-mc" $ do
phony "new-multiple-choice" $ do
let string = Y.encodePretty Y.defConfig multipleChoiceStationary
liftIO $ B.writeFile "new-mc-quest.yaml" string
liftIO $ B.writeFile "new-multiple-choice-quest.yaml" string
--
phony "new-ma" $ do
phony "new-multiple-answers" $ do
let string = Y.encodePretty Y.defConfig multipleAnswersStationary
liftIO $ B.writeFile "new-ma-quest.yaml" string
liftIO $ B.writeFile "new-multiple-answers-quest.yaml" string
--
phony "new-ft" $ do
phony "new-fill-text" $ do
let string = Y.encodePretty Y.defConfig fillTextStationary
liftIO $ B.writeFile "new-ft-quest.yaml" string
liftIO $ B.writeFile "new-fill-text-quest.yaml" string
--
phony "new-f" $ do
phony "new-free-answer" $ do
let string = Y.encodePretty Y.defConfig freeStationary
liftIO $ B.writeFile "new-f-quest.yaml" string
liftIO $ B.writeFile "new-free-answer-quest.yaml" string
--
phony "exams" $ need exams
--
......@@ -149,16 +149,14 @@ cleanCommitIdOrFail :: FilePath -> Action String
cleanCommitIdOrFail root = do
clean <- liftIO $ isWorkingTreeClean root
if clean
then throw $ GitException "Workspace dirty, aborting."
then throw $
GitException
"Workspace dirty, aborting. Please commit all changes or add them to .gitignore."
else liftIO lastCommitId
-- buildExam projectDir "exam" examPath questionSources out
buildExam :: FilePath
-> String
-> FilePath
-> [FilePath]
-> FilePath
-> Action ()
buildExam ::
FilePath -> String -> FilePath -> [FilePath] -> FilePath -> Action ()
buildExam projectDir disposition examSource questionSources out = do
need [examSource]
putLoud "Reading questions ..."
......@@ -187,9 +185,8 @@ buildExam projectDir disposition examSource questionSources out = do
putLoud "Compiling PDF ..."
compilePandocPdf examPandoc out
filterFailed :: [T.Text]
-> Map.HashMap T.Text Student
-> Map.HashMap T.Text Student
filterFailed ::
[T.Text] -> Map.HashMap T.Text Student -> Map.HashMap T.Text Student
filterFailed failed students = foldl (flip Map.delete) students failed
compileTemplates :: FilePath -> Action MT.TemplateCache
......@@ -208,7 +205,8 @@ compileTemplates disposition = do
compileProjectTemplate :: FilePath -> FilePath -> Action MT.Template
compileProjectTemplate disposition name = do
dirs <- getProjectDirs
let filename = (project dirs) </> "exams" </> "templates" </> disposition </> name
let filename =
(project dirs) </> "exams" </> "templates" </> disposition </> name
need [filename]
text <- liftIO $ T.readFile filename
let result = M.compileTemplate name (fixMustacheMarkupText text)
......@@ -239,10 +237,8 @@ compilePandocPdf exam out = do
putNormal $ "# pandoc (for " ++ out ++ ")"
pandocMakePdf options exam out
compileQuestion :: FilePath
-> MT.TemplateCache
-> (Question, FilePath)
-> Action Pandoc
compileQuestion ::
FilePath -> MT.TemplateCache -> (Question, FilePath) -> Action Pandoc
compileQuestion projectDir templates question = do
putLoud "Compiling question ..."
return $ compile question
......@@ -260,9 +256,7 @@ compileQuestion projectDir templates question = do
T.unpack $
M.substitute (chooseTemplate templates question) (MT.mFromJSON question)
compileToPandoc
:: Y.ToJSON a
=> MT.Template -> a -> Pandoc
compileToPandoc :: Y.ToJSON a => MT.Template -> a -> Pandoc
compileToPandoc template thing =
case readMarkdown def $ T.unpack $ M.substitute template $ MT.mFromJSON thing of
Left err -> throw $ PandocException (show err)
......@@ -283,8 +277,8 @@ lookupTemplate name templates =
(throw $ MustacheException $ "Cannot lookup template: " ++ name)
(Map.lookup name templates)
compileExam
:: FilePath
compileExam ::
FilePath
-> MT.TemplateCache
-> (Exam, [(Student, [(Question, FilePath)])])
-> Action Pandoc
......@@ -295,8 +289,8 @@ compileExam projectDir templates (exam, students) = do
list <- mapM (compileStudentExam projectDir templates exam) students
return $ joinPandoc $ title : list
compileStudentExam
:: FilePath
compileStudentExam ::
FilePath
-> MT.TemplateCache
-> Exam
-> (Student, [(Question, FilePath)])
......@@ -319,15 +313,14 @@ joinPandoc list =
Pandoc nullMeta $ concatMap (\(Pandoc _ blocks) -> blocks) list
-- | Filters questions by LectureIds and ExcludedTopicIds.
filterQuestions :: [T.Text]
-> [T.Text]
-> [(Question, FilePath)]
-> [(Question, FilePath)]
filterQuestions ::
[T.Text] -> [T.Text] -> [(Question, FilePath)] -> [(Question, FilePath)]
filterQuestions includeLectures excludeTopics questions =
filter (not . (flip elem) excludeTopics . qstTopicId . fst) $
filter ((flip elem) includeLectures . qstLectureId . fst) questions
type GroupedQuestions = Map.HashMap T.Text (Map.HashMap T.Text [(Question, FilePath)])
type GroupedQuestions
= Map.HashMap T.Text (Map.HashMap T.Text [(Question, FilePath)])
-- | Groups questions first by LectureId and then by TopicId into nested HashMaps.
groupQuestions :: [(Question, FilePath)] -> GroupedQuestions
......@@ -339,8 +332,8 @@ groupQuestions questions =
Map.insertWith (++) (attrib $ fst question) [question] rmap
-- The BUG is probably here!
generateExam
:: Exam
generateExam ::
Exam
-> [(Question, FilePath)]
-> [Student]
-> (Exam, [(Student, [(Question, FilePath)])])
......@@ -354,9 +347,8 @@ generateExam exam questions students =
studentQuestions = map (selectQuestionsForStudent candidates) sorted
in (exam, studentQuestions)
where
selectQuestionsForStudent :: [(Question, FilePath)]
-> Student
-> (Student, [(Question, FilePath)])
selectQuestionsForStudent ::
[(Question, FilePath)] -> Student -> (Student, [(Question, FilePath)])
-- | Initialize the RNG with a hash over the student data.
-- Should produce the identical exam for one student each time and different
-- exams for all students every time.
......@@ -395,18 +387,14 @@ generateExam exam questions students =
numberQuestion (n, (q, p)) = (q {qstCurrentNumber = n}, p)
-- | Throw, result is shitty.
maybeThrowYaml
:: Y.FromJSON a
=> FilePath -> Either Y.ParseException a -> a
maybeThrowYaml :: Y.FromJSON a => FilePath -> Either Y.ParseException a -> a
maybeThrowYaml _ (Right yaml) = yaml
maybeThrowYaml path (Left exception) =
throw $
YamlException $ "Error parsing YAML file: " ++ path ++ ", " ++ show exception
-- | Reads a YAML file or throws.
readYAML
:: Y.FromJSON a
=> FilePath -> Action a
readYAML :: Y.FromJSON a => FilePath -> Action a
readYAML path = do
result <- liftIO $ Y.decodeFileEither path
let contents =
......@@ -436,8 +424,12 @@ readStudentInfo path tracks = do
-- Reads list of failed students
readFailedStudents :: FilePath -> Action [T.Text]
readFailedStudents path = do
need [path]
readYAML path
exists <- Development.Shake.doesFileExist path
if exists
then do
need [path]
readYAML path
else return []
-- Reads all the questions and returns them along with the base directory of
-- each.
......@@ -461,11 +453,8 @@ readQuestion file = do
return (question, takeDirectory file)
-- Renders a catalog of all questions (TODO sorted by LectureId and TopicId).
renderCatalog :: FilePath
-> Templates
-> [(Question, FilePath)]
-> FilePath
-> Action ()
renderCatalog ::
FilePath -> Templates -> [(Question, FilePath)] -> FilePath -> Action ()
renderCatalog projectDir templates questions out = do
commitId <- cleanCommitIdOrFail projectDir
-- putNormal $ show questions
......
LectureId: 01-raster-images-math
TopicId: raster-image-storage
Answer:
tag: FreeForm
CorrectAnswer: "$i=3(1920y+x)+1$"
HeightInMm: 20
Title: Speicherung von Rasterbildern
Difficulty: Medium
Comment: ""
Points: 5
Question: |
Ein RGB Bild wird mit 8 Bit pro Komponente in einem Array von Bytes
gespeichert. Das Bild hat Full-HD (1920x1080 Pixel) Auflösung.
Die Komponenten eines Pixels sind
in der Reihenfolge rot, grün, blau abgelegt.
Wie lautet die Berechnungsvorschrift für den Index $i$ in das Speicherarray
für die *grüne* Komponente des Pixels mit den Koordinaten $(x, y)$?
LectureId: 01-raster-images-math
TopicId: raster-image-storage
Answer:
tag: FreeForm
CorrectAnswer: "$i=6(1920y+x)+4$"
HeightInMm: 20
Title: Speicherung von Rasterbildern
Difficulty: Medium
Comment: ""
Points: 5
Question: |
Ein RGB Bild wird mit 16 Bit pro Komponente in einem Array von Bytes
gespeichert. Das Bild hat Full-HD (1920x1080 Pixel) Auflösung.
Die Komponenten eines Pixels sind
in der Reihenfolge rot, grün, blau abgelegt.
Wie lautet die Berechnungsvorschrift für den Index $i$ in das Speicherarray
für die *blaue* Komponente des Pixels mit den Koordinaten $(x, y)$?
LectureId: 01-raster-images-math
TopicId: raster-image-storage
Answer:
tag: FreeForm
CorrectAnswer: "$i=12(1920y+x)+4$"
HeightInMm: 20
Title: Speicherung von Rasterbildern
Difficulty: Medium
Comment: ""
Points: 5
Question: |
Ein RGB Bild wird mit einer 32 Bit Fließkommazahl pro Komponente in einem
Array von Bytes gespeichert. Das Bild hat Full-HD (1920x1080 Pixel) Auflösung.
Die Komponenten eines Pixels sind
in der Reihenfolge rot, grün, blau abgelegt.
Wie lautet die Berechnungsvorschrift für den Index $i$ in das Speicherarray
für die *grüne* Komponente des Pixels mit den Koordinaten $(x, y)$?
Points: 5
LectureId: 07-transformation-2
TopicId: replacement-transform
Answer:
CorrectAnswer: $R_x(\pi/2)T_y(z)R_x(-\pi/2)$
tag: FreeForm
HeightInMm: 20
Title: Ersatztransformation
Difficulty: Easy
Comment: ''
Question: |
Die Hardware eines fiktiven Prozessors stellt folgende diskrete Operationen für die Transformation von 3D Vektoren zur Verfügung:
| Translation | Rotation | Skalierung |
|-|-|-|
| $T_x(x)$ | $R_x(\alpha)$ | $S_x(x)$ |
| $T_y(y)$ | $R_y(\alpha)$ | $S_y(y)$ |
| $T_z(z)$ | $R_z(\alpha)$ | $S_z(z)$ |
Nehmen Sie an, dass die Hardwareeinheit für die Operation $T_z(z)$ ausfällt. Wie lässt sich diese Transformation durch eine Kombination aus den verbleibenden Operationen ersetzen? Wie lautet also $T_z^{\mathrm{Ersatz}}(z)$
\ No newline at end of file
Points: 5
LectureId: 07-transformation-2
TopicId: replacement-transform
Answer:
CorrectAnswer: $R_x(-\pi/2)T_z(y)R_x(\pi/2)$
tag: FreeForm
HeightInMm: 20
Title: Ersatztransformation
Difficulty: Easy
Comment: ''
Question: |
Die Hardware eines fiktiven Prozessors stellt folgende diskrete Operationen für die Transformation von 3D Vektoren zur Verfügung:
| Translation | Rotation | Skalierung |
|-|-|-|
| $T_x(x)$ | $R_x(\alpha)$ | $S_x(x)$ |
| $T_y(y)$ | $R_y(\alpha)$ | $S_y(y)$ |
| $T_z(z)$ | $R_z(\alpha)$ | $S_z(z)$ |
Nehmen Sie an, dass die Hardwareeinheit für die Operation $T_y(y)$ ausfällt. Wie lässt sich diese Transformation durch eine Kombination aus den verbleibenden Operationen ersetzen? Wie lautet also $T_y^{\mathrm{Ersatz}}(y)$
\ No newline at end of file
Points: 5
LectureId: 07-transformation-2
TopicId: replacement-transform
Answer:
CorrectAnswer: $R_y(\pi/2)T_z(x)R_y(-\pi/2)$
tag: FreeForm
HeightInMm: 20
Title: Ersatztransformation
Difficulty: Easy
Comment: ''
Question: |
Die Hardware eines fiktiven Prozessors stellt folgende diskrete Operationen für die Transformation von 3D Vektoren zur Verfügung:
| Translation | Rotation | Skalierung |
|-|-|-|
| $T_x(x)$ | $R_x(\alpha)$ | $S_x(x)$ |
| $T_y(y)$ | $R_y(\alpha)$ | $S_y(y)$ |
| $T_z(z)$ | $R_z(\alpha)$ | $S_z(z)$ |
Nehmen Sie an, dass die Hardwareeinheit für die Operation $T_x(x)$ ausfällt. Wie lässt sich diese Transformation durch eine Kombination aus den verbleibenden Operationen ersetzen? Wie lautet also $T_x^{\mathrm{Ersatz}}(x)$
\ No newline at end of file
Points: 5
LectureId: 07-transformation-2
TopicId: replacement-transform
Answer:
CorrectAnswer: $R_z(-\pi/2)R_y(\alpha)R_z(\pi/2)$
tag: FreeForm
HeightInMm: 20
Title: Ersatztransformation
Difficulty: Easy
Comment: ''
Question: |
Die Hardware eines fiktiven Prozessors stellt folgende diskrete Operationen für die Transformation von 3D Vektoren zur Verfügung:
| Translation | Rotation | Skalierung |
|-|-|-|
| $T_x(x)$ | $R_x(\alpha)$ | $S_x(x)$ |
| $T_y(y)$ | $R_y(\alpha)$ | $S_y(y)$ |
| $T_z(z)$ | $R_z(\alpha)$ | $S_z(z)$ |
Nehmen Sie an, dass die Hardwareeinheit für die Operation $R_x(\alpha)$ ausfällt. Wie lässt sich diese Transformation durch eine Kombination aus den verbleibenden Operationen ersetzen? Wie lautet also $R_x^{\mathrm{Ersatz}}(\alpha)$?
\ No newline at end of file
Points: 5
LectureId: 07-transformation-2
TopicId: replacement-transform
Answer:
CorrectAnswer: $R_z(\pi/2)R_x(\alpha)R_z(-\pi/2)$
tag: FreeForm
HeightInMm: 20
Title: Ersatztransformation
Difficulty: Easy
Comment: ''
Question: |
Die Hardware eines fiktiven Prozessors stellt folgende diskrete Operationen für die Transformation von 3D Vektoren zur Verfügung:
| Translation | Rotation | Skalierung |
|-|-|-|
| $T_x(x)$ | $R_x(\alpha)$ | $S_x(x)$ |
| $T_y(y)$ | $R_y(\alpha)$ | $S_y(y)$ |
| $T_z(z)$ | $R_z(\alpha)$ | $S_z(z)$ |
Nehmen Sie an, dass die Hardwareeinheit für die Operation $R_y(\alpha)$ ausfällt. Wie lässt sich diese Transformation durch eine Kombination aus den verbleibenden Operationen ersetzen? Wie lautet also $R_y^{\mathrm{Ersatz}}(\alpha)$?
\ No newline at end of file
Points: 5
LectureId: 07-transformation-2
TopicId: replacement-transform
Answer:
CorrectAnswer: $R_y(-\pi/2)R_x(\alpha)R_y(\pi/2)$
tag: FreeForm
HeightInMm: 20
Title: Ersatztransformation
Difficulty: Easy
Comment: ''
Question: |
Die Hardware eines fiktiven Prozessors stellt folgende diskrete Operationen für die Transformation von 3D Vektoren zur Verfügung:
| Translation | Rotation | Skalierung |
|-|-|-|
| $T_x(x)$ | $R_x(\alpha)$ | $S_x(x)$ |
| $T_y(y)$ | $R_y(\alpha)$ | $S_y(y)$ |
| $T_z(z)$ | $R_z(\alpha)$ | $S_z(z)$ |
Nehmen Sie an, dass die Hardwareeinheit für die Operation $R_z(\alpha)$ ausfällt. Wie lässt sich diese Transformation durch eine Kombination aus den verbleibenden Operationen ersetzen? Wie lautet also $R_z^{\mathrm{Ersatz}}(\alpha)$?
\ No newline at end of file
!Students
course: Computergrafik Grundlagen
semester: Sommer 2017
students:
'123456': !Student
department: FB6
displayName: James Tiberius Kirk
employeeNumber: '123456'
givenName: James Tiberius
mail: captainkirk@tramberend.de
sAMAccountName: kirk
sn: Kirk
uid: '123456'
track: 1
'234567': !Student
department: FB6
displayName: Leonard McCoy
employeeNumber: '234567'
givenName: Leonard
mail: drmccoy@tramberend.de
sAMAccountName: mccoy
sn: McCoy
uid: '234567'
track: 2
{
"798101": {
"department": "FB6",
"displayName": "Mahmoud, Hassan",
"employeeNumber": "798101",
"givenName": "Hassan",
"mail": "s53445@beuth-hochschule.de",
"sAMAccountName": "s53445",
"sn": "Mahmoud",
"uid": "s53445",
"track": 1
},
"814510": {
"department": "FB6",
"displayName": "Sahli, Hanen",
"employeeNumber": "814510",
"givenName": "Hanen",
"mail": "s57637@beuth-hochschule.de",
"sAMAccountName": "s57637",
"sn": "Sahli",
"uid": "s57637",
"track": 1
},
"832701": {
"department": "FB6",
"displayName": "Naci Aydogan",
"employeeNumber": "832701",
"givenName": "Naci",
"mail": "s61660@beuth-hochschule.de",
"sAMAccountName": "s61660",
"sn": "Aydogan",
"uid": "s61660",
"track": 2
},
"836381": {
"department": "FB6",
"displayName": "Justen, David Alexander",
"employeeNumber": "836381",
"givenName": "David Alexander",
"mail": "s64386@beuth-hochschule.de",
"sAMAccountName": "s64386",
"sn": "Justen",
"uid": "s64386",
"track": 2
}
}
\ No newline at end of file
LectureId: 02-antialiasing
TopicId: supersampling
Answer:
tag: MultipleChoice
Choices:
- Correct: true
TheAnswer: "Treppeneffekte an Silhouette von Objekten"
- Correct: true
TheAnswer: "Moiré-Effekte auf fein strukturierten Oberflächen"
- Correct: false
TheAnswer: "Farbverschiebungen im RGB-Spektrum."
- Correct: false
TheAnswer: "Geringe Farbauflösung in dunklen Bildbereichen"
- Correct: false
TheAnswer: "Nichtlineare Wiedergabe linearer Intensitätsverläufe"
Title: Supersampling
Difficulty: Easy
Comment: ""
Points: 5
Question: |
Die Verwendung mehrerer Abtastpunkte pro Pixel bei der
Bilderzeugung (Supersampling) hilft welche der folgenden, für die
Bildqualität abträglichen Effekte zu vermeiden?
LectureId: 02-antialiasing
TopicId: supersampling
Answer:
tag: MultipleChoice
Choices:
- Correct: true
TheAnswer: "Stratified Sampling"
- Correct: false
TheAnswer: "Point Sampling"
- Correct: false
TheAnswer: "Grid Sampling"
- Correct: false
TheAnswer: "Random Sampling"
- Correct: false
TheAnswer: "Das ist kein Pixel-Sampler"
Title: Supersampling
Difficulty: Easy
Comment: ""
Points: 5
Question: |
Bei der Abtastung eines Pixels kommen unterschiedliche Sampling-Strategien zum Einsatz. Welche Art von Sampling wird in der folgenden Klasse implementiert?
```.java
public class SomeSampler implements Sampler {
...
public Vec3 color(double x, double y) {
Vec3 color = new Vec3(0, 0, 0);
for (int xi = 0; xi < n; xi++) {
for (int yi = 0; yi < n; yi++) {
double rx = Math.random();
double ry = Math.random();
double xs = x + (xi + rx) / n;
double ys = y + (yi + ry) / n;
color.add(sampler.color(xs, ys));
}
}
return color.div(n * n);
}
}
```
LectureId: 02-antialiasing
TopicId: supersampling
Answer:
tag: MultipleChoice
Choices:
- Correct: false
TheAnswer: "Stratified Sampling"
- Correct: true
TheAnswer: "Point Sampling"
- Correct: false
TheAnswer: "Grid Sampling"
- Correct: false
TheAnswer: "Random Sampling"
- Correct: false
TheAnswer: "Das ist kein Pixel-Sampler"
Title: Supersampling
Difficulty: Easy
Comment: ""
Points: 5
Question: |
Bei der Abtastung eines Pixels kommen unterschiedliche Sampling-Strategien zum Einsatz. Welche Art von Sampling wird in der folgenden Klasse implementiert?
```.java
public class SomeSampler implements Sampler {
...
public Vec3 color(double x, double y) {
return sampler.color(x + 0.5, y + 0.5);
}
}
```
LectureId: 02-antialiasing
TopicId: supersampling
Answer:
tag: MultipleChoice
Choices:
- Correct: false
TheAnswer: "Stratified Sampling"
- Correct: false
TheAnswer: "Point Sampling"
- Correct: true
TheAnswer: "Grid Sampling"
- Correct: false
TheAnswer: "Random Sampling"
- Correct: false
TheAnswer: "Das ist kein Pixel-Sampler"
Title: Supersampling
Difficulty: Easy
Comment: ""
Points: 5
Question: |
Bei der Abtastung eines Pixels kommen unterschiedliche Sampling-Strategien zum Einsatz. Welche Art von Sampling wird in der folgenden Klasse implementiert?
```.java
public class SomeSampler implements Sampler {
...
public Vec3 color(double x, double y) {
Vec3 color = new Vec3(0, 0, 0);
for (int xi = 0; xi < n; xi++) {
for (int yi = 0; yi < n; yi++) {
double xs = x + xi / n;
double ys = y + yi / n;