|
|
@ -11,10 +11,10 @@ chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'( |
|
|
|
|
|
|
|
class Status(Enum): |
|
|
|
"""Possible correctness statuses for a program.""" |
|
|
|
Correct = auto() |
|
|
|
WrongAnswer = auto() |
|
|
|
Timeout = auto() |
|
|
|
Invalid = auto() |
|
|
|
Correct = auto() # returns the expected output and a 0 exit code |
|
|
|
Invalid = auto() # has a syntax error or uses an undefined command |
|
|
|
WrongAnswer = auto() # returns an unknown exit code or invalid output |
|
|
|
Timeout = auto() # ran for more time than allowed by the timeout value |
|
|
|
|
|
|
|
|
|
|
|
def check_pair(script, instr, outstr, timeout) -> Status: |
|
|
@ -91,7 +91,7 @@ def find_script( |
|
|
|
max_length, |
|
|
|
processes, |
|
|
|
timeout, |
|
|
|
invalid_prefix, |
|
|
|
out_valid_prefix, |
|
|
|
out_log, |
|
|
|
) -> List[str]: |
|
|
|
""" |
|
|
@ -101,17 +101,18 @@ def find_script( |
|
|
|
:param max_length: maximum script length to test |
|
|
|
:param processes: number of parallel processes to spawn |
|
|
|
:param timeout: maximum allowed time in seconds for each script run |
|
|
|
:param invalid_prefix: prefix to the files in which invalid scripts |
|
|
|
are to be stored, one file per script length |
|
|
|
:param out_valid_prefix: store valid scripts (includes correct scripts |
|
|
|
and incorrect scripts that do not contain syntax or runtime errors) |
|
|
|
into files starting with this prefix |
|
|
|
:param out_log: stream to which progress logs are written |
|
|
|
:returns: list of matching scripts |
|
|
|
""" |
|
|
|
candidates = [] |
|
|
|
out_invalid = [] |
|
|
|
out_valid = [] |
|
|
|
bound_check_script = partial(check_script, pairs, timeout) |
|
|
|
|
|
|
|
for i in range(max_length + 1): |
|
|
|
out_invalid.append(open(invalid_prefix + str(i), "w")) |
|
|
|
out_valid.append(open(out_valid_prefix + str(i), "w")) |
|
|
|
|
|
|
|
chars_count = len(chars) |
|
|
|
num_tasks = int((chars_count ** (max_length + 1) - 1) / (chars_count - 1)) |
|
|
@ -141,10 +142,10 @@ def find_script( |
|
|
|
) |
|
|
|
candidates.append(script) |
|
|
|
|
|
|
|
if status == Status.Invalid: |
|
|
|
print(script, file=out_invalid[len(script)]) |
|
|
|
if status != Status.Invalid: |
|
|
|
print(script, file=out_valid[len(script)], flush=True) |
|
|
|
|
|
|
|
for file in out_invalid: |
|
|
|
for file in out_valid: |
|
|
|
file.close() |
|
|
|
|
|
|
|
print(f"Finished in {time() - start_time:.1f}s", file=out_log, flush=True) |
|
|
|