#### ΜΗ ΠΕΙΡΑΖΕΤΕ ΑΥΤΟ ΤΟ ΑΡΧΕΙΟ #### #### #### Πρόγραμμα ελέγχου του προγράμματος που γράφουν οι φοιτητές. Μη πειράζετε αυτό το πρόγραμμα. #### Γράφετε το πρόγραμμά σας στο αρχείο user.py και μόνο εκεί. #### import re import sys import os import subprocess # Το πρόγραμμα του χρήστη βρίσκεται στο "tst_userfilename" tst_userfilename="user.py" # Αν ο χρήστης έχει δώσει ένα όρισμα στην κλήση του προγράμματος τότε αυτό είναι το όνομα # του προγράμματος του χρήστη που θέλουμε να ελεγχθεί και όχι απαραίτητα το 'user.py' if len(sys.argv)>1: tst_userfilename=sys.argv[1] # Τα προγράμματα ελέγχου που γράφονται αυτόματα έχουν το παρακάτω πρόθεμα tst_testerfilename="__testcode__" # Αυτή η συνάρτηση φτιάχνει το πρόγραμμα python που ελέγχει το πρόγραμμα του χρήστη στην είσοδο inp και # έξοδο outp. # firstline είναι ο αριθμός της πρώτης γραμμής του κώδικα του χρήστη και lastline ο αριθμός της τελευταίας # fname είναι το όνομα του αρχείου του χρήστη def maketestprog(inp, outp, firstline, lastline, fname): f = open(fname, 'w+') print("#### Checking file: {uf}".format(uf=tst_userfilename), file=f) print("import sys, math, os", file=f) print("LLL=\"{LLL}\"".format(LLL=inp), file=f) #### Change this (especially for string args) print("__s=LLL", file=f) #### Change this print("__d=LLL", file=f) #### Change this # print(""" #def _bad(*args): # print("*** You used a forbidden function ***") # return 0 # #__builtins__.max = _bad #__builtins__.min = _bad #""", file=f) print("# start user code", file=f) for i in range(firstline, lastline+1): print(lines[i], file=f, end='') print("# end user code", file=f) print(""" uuu = process(__s) #### Change this if uuu != {uuu}: #### Change this line. Use quotes to compare strings. print("Σφάλμα στην είσοδο {LLL}") print("Το αποτέλεσμα του προγράμματος ήταν ", uuu, ". Έπρεπε να είναι {uuu}.") sys.exit(1) else: print("OK") sys.exit(0) """.format(LLL=inp, uuu=outp), file=f) return fname # Στις λίστες inputs, outputs βρίσκονται κάποια inputs και τα αντίστοιχα σωστά outputs inputs = [ "story1.txt", "story2.txt", ] outputs = [ {'all': 1, 'just': 1, 'over': 1, 'TOOK': 1, 'White': 1, 'had': 3, 'late': 1, 'to': 9, 'bank': 1, 'under': 1, 'worth': 1, 'ought': 1, 'then': 1, 'Oh': 2, 'very': 2, 'watch': 1, 'Alice': 4, 'hedge': 1, 'day': 1, 'nor': 1, 'down': 1, 'did': 1, 'OF': 1, 'large': 1, 'twice': 1, 'she': 7, 'tired': 1, 'see': 1, 'dear': 2, 'close': 1, 'out': 2, 'what': 1, 'for': 2, 'I': 1, 'be': 2, 'never': 1, 'quite': 1, 'by': 2, 'on': 2, 'would': 1, 'of': 7, 'could': 1, 'think': 1, 'own': 1, 'feel': 1, 'into': 1, 'There': 1, 'pop': 1, 'feet': 1, 'use': 1, 'her': 8, 'much': 1, 'way': 1, 'was': 5, 'OUT': 1, 'eyes': 1, 'that': 3, 'but': 3, 'So': 1, 'with': 3, 'made': 1, 'this': 1, 'up': 1, 'ITS': 1, 'say': 1, 'and': 8, 'do': 1, 'ran': 2, 'WATCH': 1, 'is': 1, 'mind': 2, 'it': 11, 'as': 2, 'at': 3, 'have': 1, 'in': 4, 'seen': 1, 'pink': 1, 'no': 1, 'get': 1, 'when': 3, 'field': 1, 'hot': 1, 'book': 2, 'take': 1, 'A': 1, 'shall': 1, 'VERY': 2, 'after': 1, 'a': 7, 'well': 1, 'or': 4, 'so': 2, 'time': 2, 'hear': 1, 'the': 13, 'once': 1}, {'all': 2, 'just': 2, 'over': 2, 'TOOK': 2, 'White': 1, 'had': 4, 'late': 2, 'to': 16, 'bank': 1, 'under': 2, 'worth': 1, 'ought': 2, 'then': 2, 'Oh': 4, 'very': 2, 'watch': 2, 'Alice': 6, 'hedge': 2, 'day': 1, 'nor': 2, 'down': 2, 'did': 2, 'OF': 2, 'large': 2, 'twice': 1, 'she': 11, 'tired': 1, 'see': 2, 'dear': 4, 'close': 1, 'out': 4, 'what': 1, 'for': 3, 'I': 2, 'be': 3, 'never': 2, 'quite': 2, 'by': 2, 'on': 3, 'would': 1, 'of': 9, 'could': 1, 'think': 2, 'own': 1, 'feel': 1, 'into': 1, 'There': 2, 'pop': 2, 'feet': 2, 'use': 1, 'her': 11, 'much': 2, 'way': 2, 'was': 7, 'OUT': 2, 'eyes': 1, 'that': 6, 'but': 5, 'So': 1, 'with': 5, 'made': 1, 'this': 2, 'up': 1, 'ITS': 2, 'say': 2, 'and': 12, 'do': 1, 'ran': 3, 'WATCH': 2, 'is': 1, 'mind': 3, 'it': 20, 'as': 2, 'at': 6, 'have': 2, 'in': 6, 'seen': 2, 'pink': 1, 'no': 1, 'get': 1, 'when': 5, 'field': 2, 'hot': 1, 'book': 2, 'take': 2, 'A': 2, 'shall': 2, 'VERY': 4, 'after': 2, 'a': 11, 'well': 1, 'or': 5, 'so': 4, 'time': 4, 'hear': 2, 'the': 19, 'once': 1} ] # lines = open(tst_userfilename).readlines() for i,l in enumerate(lines): if re.match('####START', l): #print("START found at line %d, [%s]"% (i, l)) firstline = i+1 if re.match('####STOP', l): #print("STOP found at line %d, [%s]"% (i, l)) lastline = i-1 errors=0 for i,inp in enumerate(inputs): print print("-------------------Case No %d------------------"% i) filename = maketestprog(inputs[i], outputs[i], firstline, lastline, tst_testerfilename+str(i)+".py") if os.name.lower() in ['posix', 'linux', 'bsd']: exit_code = subprocess.call(["timeout", "3s", "python3", filename]) else: exit_code = subprocess.call(["python3", filename]) if exit_code == 0: print("---Case No %d: OK"% i) else: errors += 1 print("---Case No %d: ERROR"% i) print() if errors>0: print("****** The program has run in error in some cases.") sys.exit(1) else: print("****** The program has run correctly in all cases.") sys.exit(0)