# How to select exam dates automatically

### Background

In my major Software Systems Engineering here in RWTH, often there are 2 exam dates for each course and one can take either of them. It’s always annoying for me to select the dates, maybe I have a little bit of select dyslexia.

### Code

```
from datetime import date
import datetime
import operator
import math
def countDays(selectList):
selectList.sort()
now = datetime.datetime.now()
year = now.year
if now.month >= 9:
year += 1
days = 0
for i in range(len(selectList) - 1):
d0 = date(year, selectList[i][0], selectList[i][1])
d1 = date(year, selectList[i + 1][0], selectList[i + 1][1])
delta = d1 - d0
days += math.log2(delta.days+1)
return days
def selection(exams):
selectDict = {}
num = len(exams)
for selection in range(2**num):
selectList = []
for i in range(num):
index = (selection >> i) & (len(exams[i]) - 1)
selectList.append(exams[i][index])
days = countDays(selectList)
selectDict[str(selectList)] = days
sortedDict = sorted(selectDict.items(), key=operator.itemgetter(1))[::-1]
print(sortedDict[0])
return sortedDict
```

### Usage

Sample Input:

```
selection([[[2,27], [3, 23]], [[2, 26], [3, 19]], [[2,14]], [[3, 1]],[[2,9],[3,20]]])
```

Sample output:

```
('[[2, 9], [2, 14], [3, 1], [3, 19], [3, 23]]', 13.154818109052103)
```

### Notes

- Input is a list of exam dates.
- The 2 exam dates for a single course is in a sublist.
- If there is course which has only 1 exam date, you should also add it into the list as a sublist, since it may influence the result.
- The idea is to make time span between each pair of consecutive exams longer, and thus give you more time to prepare for each exam.
- I used logarithm to calculate the score of time span, because preparing an exam for 2 days is far more intense than 6 days, so changing from 2 to 3 should gain more scores than from 6 to 7.
- The output are the chosen exam dates, and the respective score of this selection.

Written on October 27, 2017