GrepBoard/Manuals
84 manuals ·

Build a study plan from exam date and daily hours

·updated ·claude-sonnet-5-5 · run 2026-10-20 (ChatGPT could not be run, so Claude was used)·7 steps

An exam date and daily hours alone give an unrealistic plan. Add a pace rule, get CSV, and check daily totals, weekdays and unit coverage with a script.

"Exam in three weeks, 2 hours on weekdays, 4 on weekends, make me a schedule" returns a tidy table. Whether you can actually follow it is a separate question.

[1] Put the conditions in a file. Type the units and page counts yourself. OpenAI's exam study system use case gives the same advice: do not let the model invent exam coverage, and have it flag anything uncertain for you to confirm. The study period is 2026-10-24 to 11-13: 21 days (15 weekdays + 6 weekend days), 3,240 minutes in all.

info.en.txt
Exam: a fictional certification exam on 2026-11-14 (Saturday)Study start date: 2026-10-24Available time: 120 minutes on weekdays, 240 minutes on Saturday and SundayUnits (pages): 1 Basic Concepts (30) · 2 Data Model (45) · 3 Query Processing (60) · 4 Concurrency Control (50) · 5 Recovery (35) · 6 Security (25) · 7 Performance Tuning (55) · 8 Case Studies (40)Weak units: 4 Concurrency Control, 7 Performance Tuning</info>

[2] The first prompt (head.en.v1.txt) was the one in [5] without the pace rule, the review length and the two-units-a-day cap. It only said: first pass at least once, then reviews 2-3 days after each earlier session. Results went to out.en.v1.1.txt and out.en.v1.2.txt.

[3] The checker: each day's total must be above 0 and within that day's limit, weekdays must match the calendar, and every unit's first-pass time must equal pages x 3 minutes (the PACE line; 0 minutes means the unit is missing). The first version had no PACE line.

check.en.py
import csv, sys, datetime as dtfrom collections import defaultdictS, E = dt.date(2026, 10, 24), dt.date(2026, 11, 14)W = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]PG = {"1":30,"2":45,"3":60,"4":50,"5":35,"6":25,"7":55,"8":40}day, st, bad = defaultdict(int), defaultdict(int), 0for r in csv.DictReader(open(sys.argv[1], encoding="utf-8")):    d = dt.date.fromisoformat(r["date"]); m = int(r["minutes"])    day[d] += m    if r["type"] == "study": st[r["unit"].split()[0]] += m    if r["weekday"] != W[d.weekday()]:        print("WEEKDAY", d, r["weekday"], "!=", W[d.weekday()]); bad += 1for i in range((E - S).days):    d = S + dt.timedelta(i); cap = 240 if d.weekday() > 4 else 120    if not 0 < day[d] <= cap: print("DAY    ", d, W[d.weekday()], day[d], "/", cap); bad += 1for u, p in PG.items():    if st[u] != p * 3: print("PACE   ", u, st[u], "!=", p * 3); bad += 1print(sum(day.values()), "min,", bad, "problems"); sys.exit(bad > 0)

[4] Without the PACE line, the first-pass results showed no overruns or wrong weekdays. With no PACE line to catch missing units, I counted them in the CSV separately: all 8 units had a first pass. Read in date order, though, they looked thin: the first run covered 340 pages in 630 minutes (10/24-10/27), the second in 720 minutes (10/24-10/29). That is 1.9 and 2.1 minutes per page, below the 3 used in [5].

[5] Add a pace. 3 minutes per page is an example value; use your own reading speed. The full revised prompt:

head.en.txt
Build a study plan from the conditions in <info>, covering every day until the exam. Rules:- Fill every date from the start date through the day before the exam with at least one row. Do not schedule anything on the exam day.- The minutes on any one day must not exceed that day's available time. Write minutes as integers.- Include all 8 units as a first pass (type=study). First-pass time is pages x 3 minutes per unit; if that is longer than a day's available time, split it over several days. At most two units get a first pass on the same day.- Add reviews (type=review) 2-3 days after the first pass, about 20 minutes per unit. Review weak units more often.- Use only the units and page counts in <info>. Do not invent exam topics or units.- Write weekday as Mon, Tue, Wed, Thu, Fri, Sat or Sun, matching the calendar.- Output CSV only. The first line is date,weekday,unit,type,minutes. No code fences, no other text. <info>
console
$ cat head.en.txt info.en.txt | claude -p --model claude-sonnet-5-5 --max-turns 1 --tools "" --setting-sources "" --strict-mcp-config > out.en.1.txt$ python3 -I check.en.py out.en.1.txt; echo exit $?2020 min, 0 problemsexit 0$ python3 -I check.en.py out.en.v1.1.txt | tail -2; echo exit ${PIPESTATUS[0]}PACE    8 70 != 1203240 min, 8 problemsexit 1

Both runs of the revised prompt came back clean, with each unit's first pass exactly pages x 3 minutes. Unit 3's 180 minutes were split over 10/26-10/27 (80 + 100) in the first run and sat on Sunday 10/25 in the second. The original prompt's runs failed PACE on 8 and 7 units.

[6] Check that the script catches errors. out-bad.en.txt is out.en.1.txt with row 2's weekday changed to Sun and row 3's 135 changed to 235 by hand (not a model error).

console
$ python3 -I check.en.py out-bad.en.txt; echo exit $?WEEKDAY 2026-10-24 Sun != SatDAY     2026-10-24 Sat 325 / 240PACE    2 235 != 1352120 min, 3 problemsexit 1

[7] The script cannot tell whether weak units (4 and 7) get more reviews, or whether the last two days are free of new material. Read those yourself. For validating CSV output in general, see Claude CSV conversion with column checks.

#study-plan#exam#csv#prompt