Skip to content

Latest commit

 

History

History
121 lines (90 loc) · 9.33 KB

File metadata and controls

121 lines (90 loc) · 9.33 KB
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.

Γιατί χρησιμοποιούμε αυτά τα εργαλεία

Υπάρχουν οι ακόλουθοι λόγοι:

  1. Είναι ένας τρόπος να κρατάμε ποια testcases περνούσε η κάθε λύση.
  2. Μπορούμε να κρατάμε όλες τις πληροφορίες που έχουν τα pdf αρχεία των ενδεικτικών λύσεων (πχ ποιος την έγραψε και από ποιο σχολείο) σε δομημένη μορφή.
  3. Μπορούμε να κάνουμε grade εύκολα μία καινούργια λύση (ή να αλλάξουμε κάποιον περιορισμό).

Οδηγίες

Ο πιο εύκολος τρόπος να δείτε πώς δουλεύουν τα αρχεία TASK είναι να ανοίξετε ένα για ένα υπάρχον πρόβλημα (πχ αυτό). Για κάθε αρχείο κώδικα, υπάρχει ένα SOLUTION που περιγράφει πόσα testcases περνάει και δίνει και κάποιες παραπάνω πληροφορίες για την λύση. Τα αρχεία ελέγχου είναι στο μονοπάτι _includes/source_code/testdata (πχ _includes/source_code/testdata/31-PDP/hydrocarbons/) συνήθως με την μορφή {codename}.inΧ/{codename}.outX.

Παρακάτω ακολουθούν πιο αναλυτικές οδηγίες:

Προσθέστε TASK

Ακολουθήστε τα εξής βήματα:

  1. Δημιουργήστε τον φάκελο _includes/source_code/code/XX-PDP/{codename}/.

  2. Στον φάκελο που μόλις δημιουργήσατε, δημιουργήστε ένα αρχείο 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 = [],
    )
    

Προσθέστε τα testcases

Για να τρέξετε τοπικά τις λύσεις, προσθέστε στον φάκελο _includes/source_code/testdata/XX-PDP/{codename}/ τα testcases με τη μορφή {codename}.inX, {codename}.outX.

(Προαιρετικό) Για να μπορούν και άλλοι να τρέξουν τα testcases, πρέπει να τα ανεβάσετε σε αυτό το repository, από όπου τα κατεβάζει αυτόματα ο tester.

Προσθέστε SOLUTION

Ακολουθήστε τα εξής βήματα:

  1. Βάλτε το αρχείο με την λύση στον φάκελο _includes/source_code/code/XX-PDP/{codename}/
  2. Προσθέστε στο αρχείο 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 (και γιατί)}",
           ),
        ],
        ...
    )
    
  3. Βεβαιωθείτε ότι η λύση σας περνάει τα testcases που αναφέρατε, τρέχοντας bash tester.sh {codename}:{codename λύσης}.
  4. Αν αυτή είναι η πρώτη λύση που προσθέτετε, στο αρχείο _data/contests/XX-PDP.yml, στο πρόβλημα για το οποίο προσθέτετε κώδικες, αλλάξτε το codes_in_git: true.

Δείτε ένα παράδειγμα commit.

Σημείωση: Καμία φορά ο server του Jekyll καθυστερεί την εκτέλεση της λύσης (και μπορεί να δείτε κάποια TLEs). Άρα μπορεί να είναι καλύτερο να τον απενεργοποίησετε όταν τρέχετε τον tester.sh.

Περίπου πώς δουλεύει ο tester.sh

Δεν είναι αναγκαίο για να τον χρησιμοποιήσετε, αλλά καμία φορά βοηθάει να ξέρετε ότι ο tester ακολουθεί περίπου τα εξής βήματα:

  1. Κάνει compile τον utils/test_parser.cc και τον τρέχει.
  2. Ο test_parser κάνει τα εξής βήματα:
    1. Διασχίζει όλους τους υποφακέλους στο _includes/source_code/code/ και βρίσκει (και κάνει parse) όλα τα αρχεία TASK.
    2. Δημιουργεί το αρχείο cache.csv ώστε την επόμενη φορά που θα τεστάρει ένα μόνο πρόβλημα, να μην ψάξει όλα τα αρχεία.
    3. Ελέγχει όλα τα TASKs ψάχνοντας τις λύσεις που ταιριάζουν στο input.
    4. Για κάθε λύση που πρέπει να τρέξει τυπώνει μία γραμμή στο generated_execution.sh.
  3. Ο tester.sh τρέχει το generated_execution.sh, το οποίο χρησιμοποιεί:
    • Το fetch_testdata.sh για να κατεβάσει τα testcases από το internet.
    • Το test_functions.sh για να κάνει compile κάθε λύση και να το τρέξει με τα testcases που πρέπει (σε ένα προσωρινό φάκελο tmp/) και να μετρήσει τον χρόνο που χρειάζεται.

Προβλήματα

Αυτά τα εργαλεία έχουν τα εξής προβλήματα:

  1. Ο κώδικας για το test_parser.cc δεν είναι καθαρογραμμένος και δεν έχει καθόλου καλά σχόλια.
  2. Δεν υπάρχουν έλεγχοι για διάφορα κοινά λάθη (πχ ότι κάθε αρχείο κώδικα αντιστοιχεί σε μία λύση), αλλά δεν θα έπρεπε να είναι δύσκολο να προστεθούν.
  3. Δεν υπάρχει περιορισμός για την μνήμη που χρησιμοποιεί ένα πρόγραμμα.