layout |
---|
default |
Αν έχετε πρόσβαση στο internet, μπορείτε να τρέξετε όλες τις υπάρχουσες λύσεις για ένα πρόβλημα (πχ {codename} = hydrocarbons
) με την εντολή
bash tester.sh {codename}
ή αν θέλετε να περιορίσετε τα αποτελέσματα για μία συγκεκριμένη λύση (πχ {solution name} = hydrocarbons_efficient_doubles
), μπορείτε να τρέξετε:
bash tester.sh {codename}:{solution name}
ή αν θέλετε να τρέξετε όλες τις λύσεις για όλα τα προβλήματα (παίρνει αρκετή ώρα), μπορείτε να τρέξετε:
bash tester.sh
Για να τρέξετε τον tester.sh
, πρέπει να έχετε έκδοση του g++
που υποστηρίζει την C++17
(και στα Windows χρειάζεστε το Cygwin). Αν δεν το έχετε μπορείτε να τρέξετε το bash generated_execution.sh
, που τρέχει την τελευταία έκδοση του tester.sh
.
Σημείωση 1: Εδώ μπορείτε να βρείτε μαζεμένα τα testcases για όλα τα προβλήματα στο pdp-archive. Κατεβάστε τα στον φάκελο _includes/source_code/
, ώστε να υπάρχουν τα testcases στο _includes/source_code/testdata/
. Αυτό σας επιτρέπει να τρέξετε λύσεις για όλα τα προβλήματα χωρίς πρόσβαση στο internet.
Σημείωση 2: Εδώ μπορείτε να βρείτε τα testcases ανά χρονιά και ανά πρόβλημα σε zip.
Υπάρχουν οι ακόλουθοι λόγοι:
- Είναι ένας τρόπος να κρατάμε ποια testcases περνούσε η κάθε λύση.
- Μπορούμε να κρατάμε όλες τις πληροφορίες που έχουν τα pdf αρχεία των ενδεικτικών λύσεων (πχ ποιος την έγραψε και από ποιο σχολείο) σε δομημένη μορφή.
- Μπορούμε να κάνουμε grade εύκολα μία καινούργια λύση (ή να αλλάξουμε κάποιον περιορισμό).
Ο πιο εύκολος τρόπος να δείτε πώς δουλεύουν τα αρχεία TASK είναι να ανοίξετε ένα για ένα υπάρχον πρόβλημα (πχ αυτό). Για κάθε αρχείο κώδικα, υπάρχει ένα SOLUTION
που περιγράφει πόσα testcases περνάει και δίνει και κάποιες παραπάνω πληροφορίες για την λύση. Τα αρχεία ελέγχου είναι στο μονοπάτι _includes/source_code/testdata
(πχ _includes/source_code/testdata/31-PDP/hydrocarbons/
) συνήθως με την μορφή {codename}.inΧ
/{codename}.outX
.
Παρακάτω ακολουθούν πιο αναλυτικές οδηγίες:
Ακολουθήστε τα εξής βήματα:
-
Δημιουργήστε τον φάκελο
_includes/source_code/code/XX-PDP/{codename}/
. -
Στον φάκελο που μόλις δημιουργήσατε, δημιουργήστε ένα αρχείο
TASK
που θα έχει την εξής δομή:TASK( name = "{codename}", test_count = {Αριθμός των testcases [int+]}, files_dir = "testdata/XX-PDP/{codename}/", input_file = "{codename}.in", output_file = "{codename}.out", time_limit = {Όριο χρόνου σε δευτερόλεπτα [double+]}, mem_limit = {Όριο μνήμης σε MB [int+]}, solutions = [], )
Για να τρέξετε τοπικά τις λύσεις, προσθέστε στον φάκελο _includes/source_code/testdata/XX-PDP/{codename}/
τα testcases με τη μορφή {codename}.inX
, {codename}.outX
.
(Προαιρετικό) Για να μπορούν και άλλοι να τρέξουν τα testcases, πρέπει να τα ανεβάσετε σε αυτό το repository, από όπου τα κατεβάζει αυτόματα ο tester.
Ακολουθήστε τα εξής βήματα:
- Βάλτε το αρχείο με την λύση στον φάκελο
_includes/source_code/code/XX-PDP/{codename}/
- Προσθέστε στο αρχείο
TASK
τις λεπτομέρειες της λύσης σας:TASK( ... solutions = [ SOLUTION( name = "{codename λύσης - πρέπει να είναι μοναδικό}", source = "{όνομα αρχείου λύσης}", {Ένα από τα εξής: passes_all, passes_only = [1, 2, 3], passes_all_except_for = [5, 10]}, lang = "{Μία από τις: c++, c, pas}", author = PERSON( name = "{Το όνομα ή ψευδόνυμό σας. Ή το όνομα του μαθητή υπέβαλε τη λύση}", school = "{To σχολείο του μαθητή αν ήταν ενδεικτική λύση}", ), special_time_limit = {Όριο χρόνου σε δευτερόλεπτα, αν διαφέρει από αυτό του TASK. [double+]}, comment = "{Σχόλιο αν τα αποτελέσματα είναι διαφορετικά από το Hellenico (και γιατί)}", ), ], ... )
- Βεβαιωθείτε ότι η λύση σας περνάει τα testcases που αναφέρατε, τρέχοντας
bash tester.sh {codename}:{codename λύσης}
. - Αν αυτή είναι η πρώτη λύση που προσθέτετε, στο αρχείο
_data/contests/XX-PDP.yml
, στο πρόβλημα για το οποίο προσθέτετε κώδικες, αλλάξτε τοcodes_in_git: true
.
Δείτε ένα παράδειγμα commit.
Σημείωση: Καμία φορά ο server του Jekyll καθυστερεί την εκτέλεση της λύσης (και μπορεί να δείτε κάποια TLEs). Άρα μπορεί να είναι καλύτερο να τον απενεργοποίησετε όταν τρέχετε τον tester.sh
.
Δεν είναι αναγκαίο για να τον χρησιμοποιήσετε, αλλά καμία φορά βοηθάει να ξέρετε ότι ο tester ακολουθεί περίπου τα εξής βήματα:
- Κάνει compile τον
utils/test_parser.cc
και τον τρέχει. - Ο
test_parser
κάνει τα εξής βήματα:- Διασχίζει όλους τους υποφακέλους στο
_includes/source_code/code/
και βρίσκει (και κάνει parse) όλα τα αρχεία TASK. - Δημιουργεί το αρχείο
cache.csv
ώστε την επόμενη φορά που θα τεστάρει ένα μόνο πρόβλημα, να μην ψάξει όλα τα αρχεία. - Ελέγχει όλα τα TASKs ψάχνοντας τις λύσεις που ταιριάζουν στο input.
- Για κάθε λύση που πρέπει να τρέξει τυπώνει μία γραμμή στο
generated_execution.sh
.
- Διασχίζει όλους τους υποφακέλους στο
- Ο
tester.sh
τρέχει τοgenerated_execution.sh
, το οποίο χρησιμοποιεί:- Το
fetch_testdata.sh
για να κατεβάσει τα testcases από το internet. - Το
test_functions.sh
για να κάνει compile κάθε λύση και να το τρέξει με τα testcases που πρέπει (σε ένα προσωρινό φάκελοtmp/
) και να μετρήσει τον χρόνο που χρειάζεται.
- Το
Αυτά τα εργαλεία έχουν τα εξής προβλήματα:
- Ο κώδικας για το
test_parser.cc
δεν είναι καθαρογραμμένος και δεν έχει καθόλου καλά σχόλια. - Δεν υπάρχουν έλεγχοι για διάφορα κοινά λάθη (πχ ότι κάθε αρχείο κώδικα αντιστοιχεί σε μία λύση), αλλά δεν θα έπρεπε να είναι δύσκολο να προστεθούν.
- Δεν υπάρχει περιορισμός για την μνήμη που χρησιμοποιεί ένα πρόγραμμα.