Initial commit.
This commit is contained in:
commit
89e2776f50
14
LICENSE
Normal file
14
LICENSE
Normal file
@ -0,0 +1,14 @@
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
|
18
README.md
Normal file
18
README.md
Normal file
@ -0,0 +1,18 @@
|
||||
## Quiz
|
||||
|
||||
Simple quiz app. Answers can be multiple choice or true/false.
|
||||
|
||||
## Usage
|
||||
|
||||
Rename quiz.sh to the subject for which you want to create a quiz.
|
||||
|
||||
cp quiz.sh history.sh
|
||||
|
||||
Run with the -a flag to add questions and follow the prompts.
|
||||
|
||||
./history.sh -a
|
||||
|
||||
|
||||
## Taking the quiz
|
||||
|
||||
Simply run the file with no arguments to take the quiz. At the end, your results will be calculated on a 100 point grading scale.
|
179
quiz.sh
Executable file
179
quiz.sh
Executable file
@ -0,0 +1,179 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
|
||||
add_question() {
|
||||
question="|"
|
||||
until [[ ${#question} -eq 0 ]]; do
|
||||
read -p "Enter the question. (leave blank to end): " question
|
||||
if [[ ${#question} -eq 0 ]]; then
|
||||
continue
|
||||
fi
|
||||
while [[ $question == *"|"* ]]; do
|
||||
echo "Question cannot contain '|'. Please try again."
|
||||
read -p "Enter the question (without '|' character): " question
|
||||
done
|
||||
question="${question^}"
|
||||
|
||||
answers=()
|
||||
read -p "Enter the answer (or press Enter to proceed to correct answer): " answer
|
||||
while [[ -n $answer ]]; do
|
||||
answers+=("$answer")
|
||||
if [[ "${answer^^}" =~ ^(T(R(U(E)?)?)?|F(A(L(S(E)?)?)?)?)$ ]]; then
|
||||
break
|
||||
fi
|
||||
read -p "Next answer? (press Enter to proceed): " answer
|
||||
done
|
||||
|
||||
if [[ ${#answers[@]} -gt 1 ]]; then
|
||||
choices=()
|
||||
for ((i=1; i<=${#answers[@]}; i++)); do
|
||||
letter=$(printf "%s" $((i)) | tr '1-9' 'A-J')
|
||||
choices+=("${letter}: ${answers[$((i-1))]}")
|
||||
done
|
||||
|
||||
choicesStr="${choices[0]}"
|
||||
for ((i=1; i<${#choices[@]}; i++)); do
|
||||
choicesStr+="|${choices[$i]}"
|
||||
done
|
||||
|
||||
echo "Enter the correct choice:"
|
||||
read -p "${choicesStr//|/$'\n'}: " correct
|
||||
correct="${correct^}"
|
||||
while [[ ! $correct =~ ^[A-${letter}]$ ]]; do
|
||||
echo "Invalid choice. Please try again."
|
||||
read -p "Enter the correct choice (${choicesStr}): " correct
|
||||
done
|
||||
correctChoice="${correct:0:1}"
|
||||
elif [[ ${#answers[@]} -eq 1 ]]; then
|
||||
choice=${answers[0]}
|
||||
if [[ "${choice^^}" =~ ^[T][R][U][E]?$ ]]; then
|
||||
correctChoice="T"
|
||||
elif [[ "$choice" =~ ^[F][A][L][S][E]?$ ]]; then
|
||||
correctChoice="F"
|
||||
else
|
||||
echo "Invalid choice. Assuming 'T' (True) as the correct answer."
|
||||
correctChoice="T"
|
||||
fi
|
||||
else
|
||||
echo "No answers provided. Skipping the question."
|
||||
return
|
||||
fi
|
||||
|
||||
question="${question}|${correctChoice:0:1}|${choicesStr}"
|
||||
question="${question%|}"
|
||||
echo "${question}" >> "$0"
|
||||
echo "Question added successfully!"
|
||||
done
|
||||
exit 0
|
||||
}
|
||||
|
||||
|
||||
shuffle_choices() {
|
||||
if [[ ${#answers[@]} -lt 2 ]]; then
|
||||
return
|
||||
fi
|
||||
local letter=({A..Z})
|
||||
local length="${#answers[@]}"
|
||||
local newAnswer
|
||||
local shuffledChoices
|
||||
mapfile -t shuffledChoices < <(shuf -e "${answers[@]#*: }")
|
||||
for i in "${!answers[@]}" ; do
|
||||
if [[ "${answers[$i]:0:1}" == "${answer}" ]]; then
|
||||
newAnswer="${answers[$i]}"
|
||||
fi
|
||||
done
|
||||
for i in "${!shuffledChoices[@]}" ; do
|
||||
shuffledChoices[$i]="${letter[$i]}: ${shuffledChoices[$i]}"
|
||||
if [[ "${shuffledChoices[$i]#*:}" == "${newAnswer#*:}" ]]; then
|
||||
answer="${letter[$i]}"
|
||||
fi
|
||||
done
|
||||
answers=("${shuffledChoices[@]}")
|
||||
}
|
||||
|
||||
|
||||
if [[ $# -gt 1 ]]; then
|
||||
echo "Only 1 argument supported, -a or --question."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ $# -eq 1 ]]; then
|
||||
if [[ "${1}" == "-a" ]] || [[ "${1}" == "--add-question" ]]; then
|
||||
add_question
|
||||
else
|
||||
echo "Only 1 argument supported, -a or --question."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
startPosition="$(grep -n '^exit 0$' "${0}")"
|
||||
startPosition="${startPosition%%:*}"
|
||||
((startPosition++))
|
||||
mapfile -t data < <(tail -n +${startPosition} "$0" | grep -v "^#" | grep -v "^$" | shuf)
|
||||
right=0
|
||||
wrong=0
|
||||
|
||||
echo "Total questions: ${#data[@]}"
|
||||
if [[ ${#data[@]} -eq 0 ]]; then
|
||||
echo "To add questions use the -a or --add-questions flag."
|
||||
fi
|
||||
|
||||
for i in "${data[@]}" ; do
|
||||
question="${i%%|*}"
|
||||
i="${i#*|}"
|
||||
answer="${i%%|*}"
|
||||
answer="${answer^}"
|
||||
i="${i#*|}"
|
||||
unset answers
|
||||
while [[ ${#i} -gt 1 ]]; do
|
||||
answers+=("${i%%|*}")
|
||||
i="${i#*|}"
|
||||
if [[ "${i%%|*}" == "${i}" ]]; then
|
||||
answers+=("${i}")
|
||||
break
|
||||
fi
|
||||
done
|
||||
shuffle_choices
|
||||
echo
|
||||
echo "${question}"
|
||||
for i in "${answers[@]}" ; do
|
||||
echo "${i}"
|
||||
done
|
||||
read -r choice
|
||||
choice="${choice:0:1}"
|
||||
choice="${choice^}"
|
||||
if [[ "${choice}" == "${answer}" ]]; then
|
||||
echo "Correct!"
|
||||
((right++))
|
||||
else
|
||||
echo -n "Wrong, the answer is: "
|
||||
for i in "${answers[@]}" ; do
|
||||
if [[ "${answer}" == "${i:0:1}" ]]; then
|
||||
echo "$i"
|
||||
fi
|
||||
done
|
||||
((wrong++))
|
||||
fi
|
||||
if [[ "${answer}" == "F" ]] || [[ "${answer}" == "T" ]]; then
|
||||
answer="${answer/F/False}"
|
||||
answer="${answer/T/True}"
|
||||
echo "${answer}"
|
||||
fi
|
||||
read -rp "Press enter to continue"
|
||||
done
|
||||
|
||||
|
||||
# Results
|
||||
echo
|
||||
echo "Out of ${#data[@]} questions, you got ${right} correct."
|
||||
if [[ ${#wrong} -gt 0 ]]; then
|
||||
echo "You missed ${wrong} questions."
|
||||
fi
|
||||
if command -v bc &> /dev/null ; then
|
||||
grade=$(echo "scale=2; $right * 100 / ${#data[@]}" | bc)
|
||||
echo "On a 100 based grading scale, this gives you a score of $grade."
|
||||
fi
|
||||
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user