Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Crontab Parsing by uouo198372
from datetime import datetime, timedelta
def parse_field(field, min_val, max_val):
values = set()
if field == "*":
return set(range(min_val, max_val + 1))
parts = field.split(",")
for part in parts:
if "/" in part:
base, step = part.split("/")
step = int(step)
if base == "*":
start, end = min_val, max_val + 1
else:
start, end = map(int, base.split("-"))
start, end = start, end+ 1
for v in range(start, end, step):
values.add(v)
elif "-" in part:
start, end = map(int, part.split("-"))
values.update(range(start, end+ 1))
else:
values.add(int(part))
return values
def parse_special(s):
mapping = {
"@yearly": "0 0 1 1 *",
"@annually": "0 0 1 1 *",
"@monthly": "0 0 1 * *",
"@weekly": "0 0 * * 0",
"@daily": "0 0 * * *",
"@midnight": "0 0 * * *",
"@hourly": "0 * * * *",
}
return mapping.get(s, s)
def next_crontab_exec(crontab_time: str, current_time_str: str) -> list[str]:
# your code here
current_time = datetime.fromisoformat(current_time_str)
crontab_time = parse_special(crontab_time)
fields = crontab_time.split()
day_n = current_time.day
mon_n = current_time.month
minute_f, hour_f, dom_f, mon_f, dow_f = fields
minute_vals = parse_field(minute_f, 0, 59)
hour_vals = parse_field(hour_f, 0, 23)
dom_vals = parse_field(dom_f, 1, 31)
mon_vals = parse_field(mon_f, 1, 12)
dow_vals = parse_field(dow_f, 0, 6)
current = datetime.fromisoformat(current_time_str)
results = []
t = current + timedelta(minutes =1)
next_executions = []
py_dow_vals = {(d + 6) % 7 for d in dow_vals}
while len(results) < 3:
if (t.minute in minute_vals and
t.hour in hour_vals and
t.day in dom_vals and
t.month in mon_vals and
t.weekday() in py_dow_vals):
results.append(t.strftime("%Y-%m-%dT%H:%M"))
t += timedelta(minutes=1)
return results
print("Example:")
print(next_crontab_exec("* * * * *", "2025-03-03T14:30"))
# These "asserts" are used for self-checking
assert next_crontab_exec("* * * * *", "2025-03-03T14:30") == [
"2025-03-03T14:31",
"2025-03-03T14:32",
"2025-03-03T14:33",
]
assert next_crontab_exec("*/15 * * * *", "2025-03-03T14:30") == [
"2025-03-03T14:45",
"2025-03-03T15:00",
"2025-03-03T15:15",
]
assert next_crontab_exec("5,10,15,20 * * * *", "2025-03-03T14:07") == [
"2025-03-03T14:10",
"2025-03-03T14:15",
"2025-03-03T14:20",
]
assert next_crontab_exec("10-20 * * * *", "2025-03-03T14:05") == [
"2025-03-03T14:10",
"2025-03-03T14:11",
"2025-03-03T14:12",
]
assert next_crontab_exec("10-30/5 * * * *", "2025-03-03T14:12") == [
"2025-03-03T14:15",
"2025-03-03T14:20",
"2025-03-03T14:25",
]
assert next_crontab_exec("@daily", "2025-03-03T14:30") == [
"2025-03-04T00:00",
"2025-03-05T00:00",
"2025-03-06T00:00",
]
print("The mission is done! Click 'Check Solution' to earn rewards!")
Dec. 9, 2025
Comments: