#### ΜΗ ΠΕΙΡΑΖΕΤΕ ΑΥΤΟ ΤΟ ΑΡΧΕΙΟ #### #### #### Πρόγραμμα ελέγχου του προγράμματος που γράφουν οι φοιτητές. Μη πειράζετε αυτό το πρόγραμμα. #### Γράφετε το πρόγραμμά σας στο αρχείο 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("_L=LLL", file=f) #### Change this print("__filename=LLL", file=f) #### Change this 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(""" import copy uuu = words(__filename) #### 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 = [ "words.txt", "words1.txt", ] outputs = [ sorted(['ABCDF', 'ABCEH', 'ABGEF', 'ACFBE', 'ADCGF', 'ADGCF', 'AFBCG', 'AFBDG', 'AFCEB', 'AFEGI', 'AFHDI', 'AGICD', 'AHCGI', 'AIBCG', 'AICGE', 'AICGH', 'AIGDC', 'BAECI', 'BAFCE', 'BCGAE', 'BCHAE', 'BDAFI', 'BDIAG', 'BECAH', 'BEHCA', 'BGADI', 'BHDAC', 'BHFCI', 'BHGEF', 'BIGAH', 'BIGCF', 'BIHEA', 'CABGE', 'CBGAI', 'CBGHI', 'CBHIG', 'CDEAI', 'CHBEA', 'CHDEF', 'CIAGB', 'CIBHA', 'DAECI', 'DAFGH', 'DAHBC', 'DBCEH', 'DBCFA', 'DBFEI', 'DEACF', 'DEACG', 'DEBIC', 'DEHGI', 'DFHIE', 'DFIGB', 'DGEHI', 'DHAFC', 'DHBGE', 'DIBCF', 'DIBFG', 'DIHFA', 'EAFGH', 'EAGFH', 'EAHCG', 'EBAFI', 'EBCGA', 'EBGHI', 'EBIHA', 'ECDAI', 'ECHGA', 'ECIHG', 'EDGFH', 'EDHIF', 'EDICG', 'EFCGB', 'EGADB', 'EHABC', 'EHADI', 'EHBIF', 'EIACB', 'EIDHA', 'FACIH', 'FAGDI', 'FBGDE', 'FBHDG', 'FCADH', 'FCDHI', 'FCHDG', 'FCHIG', 'FDHBE', 'FECGB', 'FEGAC', 'FEGHD', 'FEGHI', 'FEIBD', 'FGCHB', 'FGDEH', 'FICDH', 'FIHGB', 'GABHD', 'GBEHF', 'GCBEF', 'GCFEH', 'GDBFC', 'GDFAC', 'GDFBE', 'GDFHE', 'GEABF', 'GECAI', 'GFACD', 'GHFCI', 'GIACE', 'GIDHC', 'GIDHF', 'HAGFE', 'HAICG', 'HAIDB', 'HBCIF', 'HBECG', 'HBGCD', 'HCAFD', 'HCAFI', 'HCDIE', 'HCGAD', 'HCIEA', 'HDGFB', 'HEFIB', 'HGAEC', 'HGCDI', 'HIDGA', 'HIEGB', 'IBAFG', 'IBEGC', 'IBGFE', 'IDGEF', 'IECAH', 'IECFG', 'IEDHA', 'IGABF', 'IGBCF', 'IGCDE', 'IHDGA']), sorted(['ACFDB', 'ACFHI', 'ACIEF', 'ADEIC', 'AEBCF', 'AEGHC', 'AEHCF', 'AEIHC', 'AGBIH', 'AGFDC', 'AHBFD', 'AHCGE', 'AHIBC', 'BAHFD', 'BDHEG', 'BDIGF', 'BEICG', 'BGDCF', 'BGDIE', 'BGIDC', 'BHAEC', 'BHAID', 'BHECG', 'BIACF', 'BICEH', 'BIEGH', 'BIFDC', 'CABIF', 'CADGI', 'CAEFD', 'CAFHG', 'CAIHF', 'CBDFH', 'CDAIE', 'CDEAG', 'CDIEA', 'CEAFB', 'CEBFD', 'CEBGI', 'CEDAB', 'CEGAF', 'CEHID', 'CFGID', 'CFIEG', 'CGDHB', 'CGIDE', 'CHABD', 'CHABE', 'CHFDI', 'CIDEH', 'DABIE', 'DACEI', 'DAHBE', 'DBGAE', 'DBGEF', 'DBIHE', 'DEBHA', 'DECFI', 'DFCBE', 'EACGB', 'EADHF', 'EAFBH', 'EAHDB', 'EAHIG', 'EBDCF', 'EBFDC', 'ECAGF', 'ECIDA', 'EDGFI', 'EFHAG', 'EFICD', 'EGBHA', 'EIDAF', 'FACDE', 'FACDI', 'FAIDE', 'FBHEA', 'FBIDA', 'FDBEH', 'FDCEA', 'FDIBA', 'FDIHB', 'FEGAC', 'FEIHB', 'FGCAE', 'FGDIE', 'FGIAC', 'FHABG', 'FIGHB', 'GABDC', 'GACDH', 'GAIFC', 'GBCFH', 'GBECH', 'GBEHD', 'GCBAF', 'GCDBH', 'GCFBD', 'GCFBE', 'GDBIE', 'GDCFB', 'GDIFB', 'GECFA', 'GECHF', 'GFIED', 'GHIEB', 'HACIB', 'HBIAF', 'HCGAI', 'HCGDB', 'HDEIC', 'HDFIB', 'HFACG', 'HFIDC', 'HGCAE', 'HIABE', 'HICBD', 'HICDB', 'HIDFB', 'HIEBA', 'IACEF', 'IBHCD', 'IBHDA', 'ICHDE', 'IDGCE', 'IDHEC', 'IEAFD', 'IFECD', 'IGABD', 'IGEBH']), ] # 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)