## Overview

This subject consists of seminars (tutorials), assignment sets and a
final programming test (colloquium). Because it is a programming
course, most of the work in it – and also its grading – will be
focused on practical programming. It is important that you program
as much and as often as possible, ideally every day, but at least a
few times each week. To this end, this collection contains a large
selection of exercises (these are usually very small programs, with
single- or double-digit number of lines, of which you should be able
to write a couple within an hour) and assignment sets, which are
considerably more extensive (but still only a few hundred lines at
most). In both cases though, the difficulty will increase as time
goes on, so it is important to keep up – do not procrastinate until
the last moment.

Because programming is hard, this course is also going to be hard –
you absolutely need to put in adequate effort. Of course, we hope
that you will successfully complete it, and even more importantly,
that you learn as many new things as possible. Keep in mind that
despite its difficulty, this is only a small step within a long
journey.

### Topics

The subject is split into 4 blocks (the fourth takes place during
the exam period). Each block in the semester contains 4 chapters
(topics) and the corresponding 4 seminars (classes).

│ bl. │     │ topic                                 │
├─────│────▻┼◅──────────────────────────────────────│
│  1  │  1. │ review, generic functions             │
│     │  2. │ concepts and type traits              │
│     │  3. │ constexpr, compile-time programming   │
│     │  4. │ std::span, block review               │
│┄┄┄┄┄│┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄│
│  2  │  5. │ template syntax, class templates      │
│     │  6. │ variadic templates                    │
│     │  7. │ specialisation, move, forwarding      │
│     │  8. │ unordered containers, block review    │
│┄┄┄┄┄│┄┄┄┄┄│┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄│
│  3  │  9. │ ranges, adaptors, iterators           │
│     │ 10. │ SFINAE, tag dispatch, CRTP            │
│     │ 11. │ advanced templates                    │
│     │ 12. │ block and course review               │

### Layout of This Document

The following sections of this chapter contain «binding» rules of
the course: we strongly recommend that you read them carefully.¹
The remainder is split into chapters such that each chapter
corresponds to a single week of the semester. «Important:» in the
first week of the semester, you will be already required to solve
and submit practice exercises, even though first proper class is in
the second week of the semester. The zeroth seminar (class) is
optional, but won't earn you any points either.

The chapters are numbered according to the above table – in the
seminar in the second week of the semester, we will work on the
topic for which you will have already solved and submitted practice
exercises in the first week.

¹ The rules are essentially the same as in PB161 but read them
  carefully anyway.

### Semester Overview

This course requires considerable activity on your part throughout
the semester. This section gives you an overview of important events
in the form of a calendar. The events are marked as follows (more
detailed information on each will follow in subsequent sections):

 • „#X“    – week of semester,
 • „cv0“   – zeroth seminar takes place in this week,
 • „cv1“   – seminar which goes with the first chapter,
 • „X/v“   – interim verity results for chapter X practice ex.,
 • „X/p“   – deadline for chapter X practice ex.,
 • „sX/Y“  – Y-th round of verity testing of assignment set X,
 • „sX/z₁“ – first round of review grades for set X,
 • „sX/op“ – deadline for remedial submissions of set X,
 • „sX/z₂“ – final review grades for set X,
 • „test“  – available programming test dates.

The most important events are highlighted: submission deadlines for
practice exercises and assignment sets (always 23:59 of the given
day).

│                          September                          │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │  Mon  │  Tue  │  Wed  │  Thu  │  Fri  │  Sat  │  Sun  │
├────▻│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│
│  #1 │ 18    │ 19    │ 20    │ 21    │ 22    │ 23    │ 24    │
│ cv0 │       │       │       │ 01/v  │       │«01/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│  #2 │ 25    │ 26    │ 27    │ 28 sv │ 29    │ 30    │       │
│ cv1 │ s1/1  │       │ s1/2  │ 02/v  │ s1/3  │«02/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│


│                           October                           │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │  Mon  │  Tue  │  Wed  │  Thu  │  Fri  │  Sat  │  Sun  │
├────▻│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│
│  #2 │       │       │       │       │       │       │ 1     │
│     │       │       │       │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│  #3 │ 2     │ 3     │ 4     │ 5     │ 6     │ 7     │ 8     │
│     │ s1/4  │       │ s1/5  │ 03/v  │ s1/6  │«03/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│  #4 │ 9     │ 10    │ 11    │ 12    │ 13    │ 14    │ 15    │
│     │ s1/7  │       │ s1/8  │ 04/v  │ s1/9  │«04/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│  #5 │ 16    │ 17    │ 18    │ 19    │ 20    │ 21    │ 22    │
│     │ s1/10 │       │ s1/11 │ 05/v  │«s1/12»│«05/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│  #6 │ 23    │ 24    │ 25    │ 26    │ 27    │ 28 sv │ 29    │
│     │ s2/1  │       │ s2/2  │ 06/v  │ s2/3  │«06/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│  #7 │ 30    │ 31    │       │       │       │       │       │
│     │ s2/4  │ s1/z₁ │       │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│


│                        November                             │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │  Mon  │  Tue  │  Wed  │  Thu  │  Fri  │  Sat  │  Sun  │
├────▻│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│
│  #7 │       │       │ 1     │ 2     │ 3     │ 4     │ 5     │
│     │       │       │ s2/5  │ 07/v  │ s2/6  │«07/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│  #8 │ 6     │ 7     │ 8     │ 9     │ 10    │ 11    │ 12    │
│     │ s2/7  │«s1/op»│ s2/8  │ 08/v  │ s2/9  │«08/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│  #9 │ 13    │ 14    │ 15    │ 16    │ 17 sv │ 18    │ 19    │
│     │ s2/10 │ s1/z₂ │ s2/11 │ 09/v  │«s2/12»│«09/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│ #10 │ 20    │ 21    │ 22    │ 23    │ 24    │ 25    │ 26    │
│     │ s3/1  │       │ s3/2  │ 10/v  │ s3/3  │«10/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│ #11 │ 27    │ 28    │ 29    │ 30    │       │       │       │
│     │ s3/4  │ s2/z₁ │ s3/5  │ 11/v  │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│


│                        December                             │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │  Mon  │  Tue  │  Wed  │  Thu  │  Fri  │  Sat  │  Sun  │
├────▻│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│
│ #11 │       │       │       │       │ 1     │ 2     │ 3     │
│     │       │       │       │       │ s3/6  │«11/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│ #12 │ 4     │ 5     │ 6     │ 7     │ 8     │ 9     │ 10    │
│     │ s3/7  │«s2/op»│ s3/8  │ 12/v  │ s3/9  │«12/p» │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│ #13 │ 11    │ 12    │ 13    │ 14    │ 15    │ 16    │ 17    │
│     │ s3/10 │ s2/z₂ │ s3/11 │       │«s3/12»│       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │ 18    │ 19    │ 20    │ 21    │ 22    │ 23    │ 24    │
│     │       │       │       │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │ 25    │ 26    │ 27    │ 28    │ 29    │ 30    │ 31    │
│     │       │       │       │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│


│                          January                            │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │  Mon  │  Tue  │  Wed  │  Thu  │  Fri  │  Sat  │  Sun  │
├────▻│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│
│     │ 1     │ 2     │ 3     │ 4     │ 5     │ 6     │ 7     │
│     │       │ s3/z₁ │       │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │ 8     │ 9     │ 10    │ 11    │ 12    │ 13    │ 14    │
│     │       │«s3/op»│       │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │ 15    │ 16    │ 17    │ 18    │ 19    │ 20    │ 21    │
│     │       │ s3/z₂ │ test  │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │ 22    │ 23    │ 24    │ 25    │ 26    │ 27    │ 28    │
│     │       │       │ test  │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │ 29    │ 30    │ 31    │       │       │       │       │
│     │       │       │ test  │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│


│                          February                           │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │  Mon  │  Tue  │  Wed  │  Thu  │  Fri  │  Sat  │  Sun  │
├────▻│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│◅──────│
│     │       │       │       │ 1     │ 2     │ 3     │ 4     │
│     │       │       │       │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │ 5     │ 6     │ 7     │ 8     │ 9     │ 10    │ 11    │
│     │       │       │ test  │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│
│     │ 12    │ 13    │ 14    │ 15    │ 16    │ 17    │ 18    │
│     │       │       │       │       │       │       │       │
│┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│┄┄┄┄┄┄┄│

