ερωτήσεις
Ο διαγωνισμός ξεκινά μια συγκεκριμένη στιγμή, οπότε δίνονται και τα θέματα
και κρατά για λίγες ώρες (συνήθως 4 ή 5). Τα θέματα είναι κάποιος αριθμός
προβλημάτων προς λύση (συνήως 3 ως 8). Σκοπός κάθε ομάδας είναι να λύσει
σωστά όσο το δυνατόν περισσότερα προβλήματα σε όσο το δυνατόν λιγότερο
χρόνο. Οποιαδήποτε στιγμή κατά τη διάρκεια του διαγωνισμού,
κάθε ομάδα, όποτε αισθάνεται ετοιμη,
υποβάλει (με ορισμένη διαδικασία) ένα πρόγραμμα ως υποψήφια λύση ενός προβλήματος.
Η απάντηση από τους κριτές έρχεται κάποιο χρονικό διάστημα μετά την υποβολή και το
υποβληθέν πρόγραμμα κρίνεται σωστό ή λάθος, με κάποια αιτιολογία. Προφανώς κάθε
ομάδα έχει το δικαίωμα να κάνει όσες υποβολές θέλει, για κάθε και για όσα
προβλήματα θέλει, χωρίς άλλο περιορισμό εκτός του χρονικού ορίου του διαγωνισμού,
προκειμένου να στείλει σωστές
λύσεις για όσα περισσότερα πρόβληματα μπορεί (μέχρι ενδεχομένως να τα λύσει όλα σωστά).
Η βαθμολογία και κατάταξη των ομάδων μετά το πέρας του διαγωνισμού γίνεται ως εξής:
Οι όμαδες ταξινομούνται πρώτα με τον αριθμό των προβλημάτων που έχουν λύσει και
έπειτα με το συνολικό χρόνο επίλυσης. Πιο συγκεκριμένα:
- Από την αρχή του διαγωνισμού, για κάθε λεπτό που περνά μετράται ένας
βαθμός ποινής
- Για κάθε υποβολή προγράμματος που είναι σωστό, προστίθεται στους
βαθμούς ποινής της ομάδας ο αριθμός των λεπτών που έχουν περάσει
από την αρχή του διαγωνισμού ως την υποβολή του προγράμματος.
- Για κάθε υποβολή προγράμματος που είναι λάθος, προστίθεται στους
βαθμούς ποινής της ομάδας 15 ή 20 βαθμοί ποινής (καθορίζεται).
- ΠΡΟΣΟΧΗ: Βαθμοί ποινής από προγράμματα για προβλήματα που
τελικά δεν επιλύθηκαν
από την ομάδα (σωστά), δεν προμετρώνται στον τελικό αριθμό βαθμών
ποινής για κάθε ομάδα.
Η τελική κατάταξη γίνεται λοιπόν πρώτα με τον αριθμό των σωστά λυμένων προβλημάτων
και έπειτα με το συνολικό αριθμό βαθμών ποινής.
Ένα παράδειγμα για τρεις ομάδες: H (1) λύνει τρία προβλήματα, το πρώτο στη 1 ώρα,
το δεύτερο στις 2 ώρες και το τρίτο στις 3 ώρες και τριάντα λεπτά (από την αρχή του
διαγωνισμού) ενώ έχει και λάθος υποβολές σε ένα τέταρτο πρόβλημα. Η (2) κάνει
λάθος στο πρώτο στα 40 λεπτά, λάθος το τέταρτο στα 50 λεπτά,
στέλνει σωστά το δεύτερο στη μία ωρα, στέλνει σωστά
το πρώτο στη 1 ώρα και 20 λεπτά. Η (3) στέλνει σωστά το δεύτερο πρόβλημα στις
2 ώρες και το τέταρτο πρόβλημα στις 2 ώρες και 40 λεπτά. Η κατάταξη θα είναι ως εξής:
Κατάταξη | Ομάδα | Αριθμός λυμένων προβλημάτων | Βαθμοί ποινής
|
---|
1η | (1) | 3 | 60+120+210=390
|
2η | (2) | 2 | 15+60+80=155
|
3η | (3) | 2 | 120+160=280
|
Τι σημαίνει σωστό πρόγραμμα
Στους διαγωνισμούς προγραμματισμού για πανεπιστήμια, το σωστό πρόγραμμα
κρίνεται μόνο από τον εξωτερικό έλεγχο της λειτουργίας του (έλεγχος
με τη μέθοδο του μαύρου κουτιού). Κάθε πρόγραμμα
που υποβάλουμε ως υποψήφια λύση για ένα πρόβλημα, ελέγχεται με κάποια
(κρυφά) δεδομένα εισόδου από την κριτική επιτροπή του διαγωνισμού
(τους κριτές (judges)). Αν το πρόγραμμα βγάζει τις αντίστοιχες σωστές
εξόδους, σε αποδεκτό χρόνο, τότε το πρόγραμμα θεωρείται σωστό.
Το πρόγραμμα μπορεί να κριθεί ως λαθεμένο σύμφωνα με τις ακόλουθες αιτιολογίες:
- Λάθος απάντηση: Το πρόγραμμα που υποβάλαμε έδωσε δεδομένα εξόδου
διαφορετικά από αυτά που θα έπρεπε να βγάλει ένα σωστό πρόγραμμα.
- Λάθος παρουσίασης: Το πρόγραμμα φαίνεται ότι βγάζει σωστά αποτελέσματα
αλλά ο τρόπος που τα βγάζει δε συμφωνεί με τους κανόνες που περιγράφει
η εκφώνηση. Θα πρέπει να δίνεται μεγάλη προσοχή στις εκφωνήσεις, ώστε
να μην χάνει κάποιος βαθμούς και χρόνο από παρόμοια λάθη (που δεν είναι
επί της ουσίας)
- Τέλος χρόνου: Το πρόγραμμα που υποβάλαμε δεν τελείωσε την εκτέλεσή του
στον προκαθορισμένο χρόνο που του δόθηκε. Αυτό μπορεί να οφείλεται
σε πολλούς λόγους, πχ. επειδή το πρόγραμμα χρησιμοποιεί πολύ αργό
αλγόριθμο, ή επειδή έχει λάθος και πέφτει σε κάποια άπειρη ανακύκλωση.
Σε μερικές αρχιτεκτονικές (πχ. DOS) μπορεί να σημαίνει ότι το
πρόγραμμά μας έγραψε έξω από τη μνήμη του και ενδεχομένως να
προκάλεσε crash στο μηχάνημα ελέγχου.
- run-time error: Το πρόγραμμα κατά την εκτέλεση παρουσίασε λάθος,
πχ. έκανε crash, segmentation fault, memory full, out of bound access
κλπ. Αυτό οφείλεται σε δεδομένα με μέγεθος ή κάποια χαρακτηριστικά
που δεν τα έχουμε προβλέψει.
- compile-time error: Υποτίθεται ότι τα προγράμματα που στέλνουμε περνούν
από το μεταγλωττιστή χωρίς λάθη. Τέτοιο λάθος δεν πρέπει να συμβεί ποτέ,
εκτός αν είμαστε εντελώς απρόσεκτοι.
Στους διαγωνισμούς αυτούς, δε λαμβάνεται καθόλου υπόψη η μορφή του προγράμματος
που υποβάλουμε (πχ. σχόλια, identation, εύλογα ονόματα μεταβλητών κλπ.). Τα
χαρακτηριστικά αυτά βοηθάνε μόνο το συγγραφέα του προγράμματος και (κυρίως) το
συνεργάτη του που θα τον βοηθήσει στη διόρθωση λαθών. Θα πρέπει λοιπόν να
χρησιμοποούνται με μέτρο και μόνο αν δεν επιβαρύνουν άνισα τη βαθμολογία της ομάδας.
Κύριοι σκοποί μια ομάδας που θέλει να συμμετάσχει με αξιώσεις είναι να αντιμετωπίσει
κάθε πρόβλημα με τα ακόλουθα κατά νου:
- Να βρει έναν ικανοποιητικό αλγόριθμο για την επίλυση του προβλήματος
- Να λάβει υπόψη της όλα τα στοιχεία της εκφώνησης, ώστε να προβλέψει
για κάθε δυνατή είσοδο, το σωστό αποτέλεσμα. ΠΡΟΣΟΧΗ στις
ακραίες περιπτώσεις, τις περίεργες και πονηρές εισόδους κλπ.
Οι σκοποί αυτοί βέβαια είναι όλη η ουσία του διαγωνισμού, και στην προετοιμασία μας,
με αυτά κυρίως τα θέματα θα ασχοληθούμε.
Στρατηγικές για καλή απόδοση στο διαγωνισμό
Οι εκφωνήσεις των θεμάτων
Μεγάλη σημασία πρέπει να δοθεί στο γεγονός ότι η εκφώνηση δεν λέει ποτέ ψέματα.
Αν πχ. λέγεται ότι η είσοδος θα είναι ένας θετικός ακέραιος, τότε αποκλείεται
να δοθεί ως είσοδος ένα αλφαριθμητικό (string) ή ένας αρνητικός. Μπορεί όμως
η εκφώνηση να περιέχει κάποια ασάφεια, ή να μην διευκρινίζει κάτι. Δεν
πρέπει να κάνουμε δικές μας παραδοχές! Με την κατάλληλη διαδικασία ρωτάμε
για διευκρίνηση από τους κριτές, ή αν γίνεται, λαμβάνουμε όλες τις δυνατές περιπτώσεις
υπόψην. Πχ. στο προηγούμενο παράδειγμα, δεν είναι εντελώς σαφές αν η είσοδος μπορεί
να είναι το 0 (μηδέν). Είτε ρωτούμε, είτε λύνουμε το πρόβλημα και για το 0.
Πολύ σημαντικό είναι επίσης ότι η εκφώνιση αλλά ίσως και οι κανόνες
του διαγωνισμού προκαθορίζουν τη μορφή των δεδομένων της εισόδου και της
εξόδου που θα πρέπει να υποστηρίζει το πρόγραμμά μας. Πχ. μπορεί να ζητείται
η είσοδος και η έξοδος να είναι συγκεκριμένα αρχεία ή αντίθετα οι προκαθορισμένες
(standard input, standard output). Μπορεί να καθορίζεται ότι η είσοδος θα είναι
αριθμοί σε μία μόνο γραμμή ενώ η έξοδος ένας αριθμός σε κάθε σειρά, χωρίς άλλα
σχόλια, παραπάνω κενά, παραπάνω αλλαγές γραμμής, λέξεις, επεξηγήσεις,
σχόλια για debugging κλπ.
Εν ολίγοις: ΜΕΓΑΛΗ ΠΡΟΣΟΧΗ ΣΤΙΣ ΕΚΦΩΝΗΣΕΙΣ ΓΙΑΤΙ ΟΔΗΓΟΥΝ ΣΕ (ΑΔΙΚΑ) ΛΑΘΗ
Συγγραφή του προγράμματος
Επειδή η ομάδα αποτελείται από τρία ατομα, ο υπολογιστής είναι ένας, και ο
χρόνος πολύτιμος είναι προφανές ότι αυτός που κάθεται μπροστά στον υπολογιστή
δεν πρέπει να τον δεσμεύει από τους συναγωνιστές του περισσότερο απ'όσο είναι
απαραίτητο. Οι ενέργειες για να επιτευχθεί όσο το δυνατόν μεγαλύτερη οικονομία
του αγαθού αυτού ειναι οι εξής (όπως έχουν κυρίως προταθεί από το μεγάλο δάσκαλο
Δημήτρη Στάικο και σύμφωνα με την εμπειρία μας):