82 lines
3.9 KiB
Markdown
82 lines
3.9 KiB
Markdown
# CLRS practice exam generator
|
|
|
|
Generates practice exams by randomly selecting questions and their answers from the CLRS textbook
|
|
|
|
## Why?
|
|
|
|
[Interleaved practice](https://en.wikipedia.org/wiki/Varied_practice) is when you mix practicing a bunch of subjects together. Textbooks are designed such that all the questions relevant to a particular topic are grouped together. While this is good for reference, it's not all that good for practice.
|
|
|
|
## How?
|
|
|
|
[Peng-Yu Chen](https://pengyuc.com/) and [contributors to the walkccc/CLRS](https://github.com/walkccc/CLRS/graphs/contributors) have collected solutions to many (but not all!) of the problems in the third edition of CLRS. They have also conviently and seemingly accidentally structured them in a way that lends itself well to being parsed into a database. I've written a script that automatically sorts all of these problems into an SQLite database, and another you can use to query it and generate nice-looking HTML practice exams.
|
|
|
|
This is probably best described as something that barely works. As in, it's something I duct taped together while bored in class and bothered to do very little error-handling.
|
|
|
|
Not to mention, `walkccc/CLRS` is incomplete as far as data sets go. It's the largest and most well-formated that I'm aware of, anyways.
|
|
|
|
### How can I generate new practice exams?
|
|
|
|
This setup assumes you have Python 3, Git, and the `cmarkgfm` Python package. Before you get started, make sure you have the `cmarkgfm` package installed. On Debian:
|
|
|
|
```bash
|
|
$ sudo apt install python3-cmarkgfm
|
|
```
|
|
|
|
Or with pip, call:
|
|
```bash
|
|
$ pip install cmarkgfm
|
|
```
|
|
|
|
Next, you can run this script if you're on some kind of Unix machine. Something similar on Windows but idk how that stuff works.
|
|
|
|
```bash
|
|
# 1. Make yourself a workspace
|
|
mkdir work
|
|
cd work
|
|
|
|
# 2. Get the problems
|
|
git clone https://github.com/walkccc/CLRS
|
|
|
|
# 3. Get the scripts
|
|
git clone https://git.nats.solutions/nat/clrs-practice-exam
|
|
cd clrs-practice-exam
|
|
|
|
# 4. Clean the data
|
|
python clean-data.py ../CLRS/docs
|
|
|
|
# 5. Generate the practice exam
|
|
python practice-exam-generator.py "select * from problem where chapter in (3,4,7,12,15,16,22,24,26,34) order by random() limit 20" --template template.html
|
|
```
|
|
|
|
### Specifics
|
|
|
|
`practice-exam-generator.py` takes a positional argument that's an SQL query. The query in the example above is the one I used to generate the example exams, and it's kind of but not super reflective of the stuff I've covered in my algorithms course.
|
|
|
|
The relevant table in the database is made like this:
|
|
|
|
```sql
|
|
create table if not exists problem (
|
|
problem_number number not null,
|
|
question text not null,
|
|
answer text not null,
|
|
chapter number not null,
|
|
section number,
|
|
starred number not null
|
|
)
|
|
```
|
|
|
|
So, you can use all of this information to construct your SQL query.
|
|
|
|
Both scripts take an `-h` argument that breaks down what you can pass to it to tweak things based on your setup.
|
|
|
|
The `template.html` document should probably include [KaTeX](https://katex.org/) lest the many, many LaTeX equations be broken. This template must include the string "%$%content" somewhere in it; it'll be replaced with all the selected problems when the exam is being generated
|
|
|
|
## "License"
|
|
|
|
This software (that is, the scripts; not including anything you'll find in `./examples`) is a gift from me to you. You form a relationship with all those from whom you accept gifts, and with this relationship comes certain expectations. Namely:
|
|
|
|
* When you share this gift with others, you will share it in the same spirit as I share it with you.
|
|
* You will not use this gift to hurt people, any living creatures, or the planet
|
|
|
|
The questions were written by Michelle Bodnar and Andrew Lohr and used here on a fair-use basis. The answers are organized in the [walkccc/CLRS](https://github.com/walkccc/CLRS) repository, by [Peng-Yu Chen](https://github.com/walkccc) and [contributors](https://github.com/walkccc/CLRS/graphs/contributors). Their repository is shared under the MIT license.
|