#### ΜΗ ΠΕΙΡΑΖΕΤΕ ΑΥΤΟ ΤΟ ΑΡΧΕΙΟ #### #### #### Πρόγραμμα ελέγχου του προγράμματος που γράφουν οι φοιτητές. Μη πειράζετε αυτό το πρόγραμμα. #### Γράφετε το πρόγραμμά σας στο αρχείο 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, 'remarkable': 1, 'over': 1, 'sleepy': 1, 'TOOK': 1, 'White': 1, 'hedge': 1, 'seemed': 1, 'just': 1, 'had': 3, 'actually': 1, 'late': 1, 'to': 9, 'bank': 1, 'under': 1, 'Oh': 2, 'worth': 1, 'ought': 1, 'do': 1, 'sitting': 1, 'very': 2, 'conversations': 2, 'watch': 1, 'Alice': 4, 'trouble': 1, 'day': 1, 'nor': 1, 'down': 1, 'did': 1, 'OF': 1, 'large': 1, 'twice': 1, 'stupid': 1, 'she': 7, 'suddenly': 1, 'tired': 1, 'hurried': 1, 'see': 1, 'dear': 2, 'close': 1, 'out': 2, 'what': 1, 'for': 2, 'pictures': 2, 'daisy-chain': 1, 'I': 1, 'Rabbit': 3, 'reading': 1, 'across': 2, 'either': 1, 'be': 2, 'never': 1, 'quite': 1, 'picking': 1, 'beginning': 1, 'by': 2, 'rabbit-hole': 1, 'on': 2, 'sister': 2, 'would': 1, 'getting': 1, 'of': 7, 'could': 1, 'daisies': 1, 'this': 1, 'own': 1, 'afterwards': 1, 'burning': 1, 'feel': 1, 'into': 1, 'There': 1, 'pop': 1, 'feet': 1, 'hear': 1, 'considering': 1, 'use': 1, 'or': 4, 'her': 8, 'WAISTCOAT-POCKET': 1, 'much': 1, 'way': 1, 'was': 5, 'OUT': 1, 'eyes': 1, 'that': 3, 'started': 1, 'occurred': 1, 'but': 3, 'So': 1, 'rabbit': 1, 'with': 3, 'peeped': 1, 'made': 1, 'whether': 1, 'up': 1, 'flashed': 1, 'making': 1, 'ITS': 1, 'say': 1, 'and': 8, 'then': 1, 'ran': 2, 'WATCH': 1, 'is': 1, 'mind': 2, 'it': 11, 'as': 2, 'itself': 1, 'at': 3, 'have': 1, 'in': 4, 'seen': 1, 'pink': 1, 'looked': 1, 'no': 1, 'fortunately': 1, 'get': 1, 'when': 3, 'field': 1, 'hot': 1, 'book': 2, 'take': 1, 'before': 1, 'A': 1, 'shall': 1, 'VERY': 2, 'after': 1, 'curiosity': 1, 'nothing': 2, 'a': 7, 'natural': 1, 'wondered': 1, 'well': 1, 'think': 1, 'thought': 2, 'without': 1, 'so': 2, 'time': 2, 'pleasure': 1, 'the': 13, 'waistcoat-pocket': 1, 'having': 1, 'once': 1}, {'all': 2, 'remarkable': 2, 'over': 2, 'sleepy': 1, 'TOOK': 2, 'White': 1, 'hedge': 2, 'seemed': 2, 'just': 2, 'had': 4, 'actually': 2, 'late': 2, 'to': 16, 'bank': 1, 'under': 2, 'Oh': 4, 'worth': 1, 'ought': 2, 'do': 1, 'sitting': 1, 'very': 2, 'conversations': 2, 'watch': 2, 'Alice': 6, 'trouble': 1, 'day': 1, 'nor': 2, 'down': 2, 'did': 2, 'OF': 2, 'large': 2, 'twice': 1, 'stupid': 1, 'she': 11, 'suddenly': 1, 'tired': 1, 'hurried': 2, 'see': 2, 'dear': 4, 'close': 1, 'out': 4, 'what': 1, 'for': 3, 'pictures': 2, 'daisy-chain': 1, 'I': 2, 'Rabbit': 5, 'reading': 1, 'across': 4, 'either': 2, 'be': 3, 'never': 2, 'quite': 2, 'picking': 1, 'beginning': 1, 'by': 2, 'rabbit-hole': 2, 'on': 3, 'sister': 2, 'would': 1, 'getting': 1, 'of': 9, 'could': 1, 'daisies': 1, 'this': 2, 'own': 1, 'afterwards': 2, 'burning': 2, 'feel': 1, 'into': 1, 'There': 2, 'pop': 2, 'feet': 2, 'hear': 2, 'considering': 1, 'use': 1, 'or': 5, 'her': 11, 'WAISTCOAT-POCKET': 2, 'much': 2, 'way': 2, 'was': 7, 'OUT': 2, 'eyes': 1, 'that': 6, 'started': 2, 'occurred': 2, 'but': 5, 'So': 1, 'rabbit': 2, 'with': 5, 'peeped': 1, 'made': 1, 'whether': 1, 'up': 1, 'flashed': 2, 'making': 1, 'ITS': 2, 'say': 2, 'and': 12, 'then': 2, 'ran': 3, 'WATCH': 2, 'is': 1, 'mind': 3, 'it': 20, 'as': 2, 'itself': 2, 'at': 6, 'have': 2, 'in': 6, 'seen': 2, 'pink': 1, 'looked': 2, 'no': 1, 'fortunately': 2, 'get': 1, 'when': 5, 'field': 2, 'hot': 1, 'book': 2, 'take': 2, 'before': 2, 'A': 2, 'shall': 2, 'VERY': 4, 'after': 2, 'curiosity': 2, 'nothing': 3, 'a': 11, 'natural': 2, 'wondered': 2, 'well': 1, 'think': 2, 'thought': 3, 'without': 1, 'so': 4, 'time': 4, 'pleasure': 1, 'the': 19, 'waistcoat-pocket': 2, 'having': 1, '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)