Nth Fibonacci¶
Assignment¶
Write a program that takes an integer n
and returns the nth Fibonacci number.
Sample Solution¶
import sys
n = int(sys.argv[1])-1
nums = [0, 1]
while n >= len(nums):
nums.append(nums[-1] + nums[-2])
return nums[n]
Example Grader¶
from __future__ import annotations
import subprocess
import sys
# this assignment is out of 100 points
N = 100
score = 0
failing_cases = []
# set up the fibonacci sequence so that we can check student answers
cur_fib = 1
next_fib = 1
# parse information from Tin
submission, _submission_file, username, log_file, *_ = sys.argv[1:]
for i in range(1, N + 1):
try:
# pass n as an argument to the student submission
res = subprocess.run(
[sys.executable, submission, str(i)],
# it shouldn't take more than 5 seconds
timeout=5,
stdin=subprocess.DEVNULL,
capture_output=True,
check=False,
)
# the student submission is too slow
except subprocess.TimeoutExpired:
print(f"Script timeout for number {i}")
else:
# check if the script failed
if res.stderr or res.returncode != 0:
print(f"Script error for number {i}")
failing_cases.append(i)
continue
try:
stdout = res.stdout.strip().decode("utf-8")
except UnicodeDecodeError:
print(f"Non-UTF-8 output for number {i}")
failing_cases.append(i)
continue
if not stdout.isdigit():
print(f"Non-integer printed for number {i}")
failing_cases.append(i)
continue
student_ans = int(stdout)
if student_ans == cur_fib:
score += 1
else:
print(f"Invalid result for number {i} (printed {student_ans}, answer is {cur_fib})")
failing_cases.append(i)
# calculate our next fibonacci number
next_fib, cur_fib = cur_fib + next_fib, next_fib
print(f"Score: {score / N}")
with open(log_file, "a", encoding="utf-8") as logfile:
logfile.write(
f"User: {username}; Score: {score}/{N}; Failing test cases: {', '.join(str(case) for case in failing_cases)}\n"
)