Add course schedules for ISF and ITZS programs for 2026 and 2024 sessions

- Created new snapshot files for ISF credits and daily schedules for the 26-АРХ and 26-ПГС programs.
- Added summer 2026 and winter 2024 exam schedules for the 23-ИТзс program, detailing lectures, labs, and consultations.
This commit is contained in:
2026-10-19 22:55:28 +03:00
parent 15851b26cd
commit e38c388462
24 changed files with 73775 additions and 70942 deletions

36
scripts/snapshot-lines.js Normal file
View File

@@ -0,0 +1,36 @@
// One readable line per parsed lesson, the form both snapshots compare: what a student sees
// (day, time, weeks or dates, subject, kind, room, teacher, groups), not ids or source colours.
const DAYS = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"];
const weeks = (ranges) =>
ranges?.map(([a, b]) => (b === null ? `с ${a}` : a === b ? `${a}` : `${a}-${b}`)).join(",") || "";
export const lessonLine = (l) =>
[
`${l.date || DAYS[l.day]} ${l.start}${l.end ? `–${l.end}` : ""}`,
(l.date ? "один раз" : l.dates?.length ? `даты ${l.dates.join(",")}` : l.weekRanges ? `нед. ${weeks(l.weekRanges)}` : "каждую неделю") +
(l.variant === "upper" ? ", верхняя строка" : l.variant === "lower" ? ", нижняя строка" : ""),
l.subject,
l.type,
l.room,
l.teacher,
[...l.groups, ...l.subgroups.map((s) => `${s.group}/${s.label.replace("Подгруппа ", "п")}`)].join(","),
]
.map((part) => String(part ?? "").replace(/\s+/g, " ").trim())
.join(" | ");
/** Sorted lesson lines of a parsed document, with its groups and period on top. */
export const snapshotOf = (schedule) => [
`# ${schedule.period} · ${schedule.groups.join(", ")}`,
...schedule.lessons.map(lessonLine).sort(),
];
/** Lines only in `before` (removed) and only in `after` (added), duplicates counted. */
export function diffLines(before, after) {
const count = (lines) => lines.reduce((m, x) => m.set(x, (m.get(x) || 0) + 1), new Map());
const a = count(before), b = count(after);
const removed = [], added = [];
for (const [line, n] of a) for (let i = b.get(line) || 0; i < n; i++) removed.push(line);
for (const [line, n] of b) for (let i = a.get(line) || 0; i < n; i++) added.push(line);
return { removed, added };
}