Σημειώσεις για διαγωνισμούς προγραμματισμού
Γενικά
Σε ένα διαγωνισμό πληροφορικής, όπως σε παρόμοιους διαγωνισμούς
μαθηματικών, φυσικής, χημείας κλπ. τίθενται προβλήματα τα οποία
καλούνται οι διαγωνιζόμενοι να λύσουν, σε περιορισμένο χρόνο.
Τα προβλήματα είναι αλγοριθμικής φύσης. Η λύση τους είναι
ένα πρόγραμμα για υπολογιστή, σε κάποια διαδεδομένη γλώσσα
(συνήθως C, C++, Pascal ή Basic). Προφανώς το πρόγραμμα
πρέπει να λύνει το πρόβλημα σωστά για κάθε περίπτωση.
Για παράδειγμα ένα πρόβλημα μπορεί να είναι: "Ζητείται ένα
πρόγραμμα που λαμβάνει στην είσοδο δύο ή περισσότερους
ακεραίους και βγάζει στην έξοδο το άθροισμά τους".
Στους διαγωνισμούς προγραμματισμού συμμετέχουν συνήθως τμήματα
πανεπιστημίων που έχουν σχέση με την πληροφορική. Για τον ελληνικό
διαγωνισμό, δικαίωμα συμμετοχής έχουν τα τμήματα των πανεπιστημίων
που αναφέρουν στον τίτλο τους το αντικείμενο των υπολογιστών ή
της πληροφορικής.
Σε γενικές γραμμές, ο διαγωνισμός διέπεται από τους εξής βασικούς
κανόνες:
- Κάθε ομάδα που συμμετέχει στο διαγωνισμό,
αποτελείται από τρεις το πολυ φοιτητές, προπτυχιακούς.
- Κάθε ομάδα συμμετέχει στο διαγωνισμό χρησιμοποιώντας
έναν μόνο υπολογιστή. Το νόημα αυτού του
κανόνα είναι η προώθηση της συνεργασίας μεταξύ των
συναγωνιστών.
- Σκοπός της κάθε ομάδας είναι να λύσει όσο το δυνατόν
περισσότερα προβλήματα, σε όσο το δυνατόν λιγότερο
συνολικό χρόνο.
- Η κάθε ομάδα δοκιμάζει μπορεί να δώσει πολλές λύσεις
σε κάθε πρόβλημα, ώσπου να επιτύχει να το λύσει σωστά.
Ειδικά για τον ελληνικό διαγωνισμό, ισχύουν και τα παρακάτω:
- Κάθε πανεπιστημιακό τμήμα συμμετέχει με τρεις το πολύ ομάδες.
- Ο διαγωνισμός γίνεται με βάση το internet, κατά τα πρότυπα
του διαγωνισμού προγραμματισμού που διοργανώνει
το Duke University, δηλαδή με τη χρήση www και e-mail.
Στο διεθνή διαγωνισμό αντίθετα, ισχύουν τα παρακάτω:
- Κάθε πανεπιστημιακό τμήμα συμμέτεχει με μία ομάδα. Μόνο σε ειδικές
περιπτώσεις, και αν υπάρχει χώρος γίνεται δεκτή και δεύτερη
ομάδα.
- Ο διαγωνισμός γίνεται σε συγκεκριμένο χώρο και χρόνο
με ιδιωτικό κλειστό δίκτυο και με ειδικό λογισμικό.
Άλλοι σημαντικοί κανόνες:
- Εκτός από τον υπολογιστή (και ενδεχομένως το e-mail για την
αποστολή των προγραμμάτων), κάθε ομάδα δεν πρέπει να έχει
πρόσβαση σε οποιοδήποτε είδος ηλεκτρονικής πληροφορίας.
Έτσι απαγορεύονται τουλάχιστον:
- Άλλοι υπολογιστές (γραφείου, φορητοί, αριθμομηχανές κλπ.)
- Δισκέτες, δίσκοι και άλλου είδους δεδομένα, πλροφορίες
ή κώδικας σε ηλεκτρονική μορφή.
- Επιτρέπεται οποιουδήποτε είδους έντυπη μορφή πληροφοριών ή
κώδικα σε έγγραφη ή έντυπη μορφή, πχ. βιβλία, λίστες,
χειρόγραφες σημειώσεις κλπ. Επίσης επιτρέπεται η εκτύπωση
προγραμμάτων κατά τη διάρκεια του διαγωνισμού.
Διαδικασία του διαγωνισμού
Ο διαγωνισμός ξεκινά μια συγκεκριμένη στιγμή, οπότε δίνονται και τα θέματα
και κρατά για λίγες ώρες (συνήθως 4 ή 5). Τα θέματα είναι κάποιος αριθμός
προβλημάτων προς λύση (συνήως 3 ως 8). Σκοπός κάθε ομάδας είναι να λύσει
σωστά όσο το δυνατόν περισσότερα προβλήματα σε όσο το δυνατόν λιγότερο
χρόνο. Οποιαδήποτε στιγμή κατά τη διάρκεια του διαγωνισμού,
κάθε ομάδα, όποτε αισθάνεται ετοιμη,
υποβάλει (με ορισμένη διαδικασία) ένα πρόγραμμα ως υποψήφια
λύση ενός προβλήματος.
Η απάντηση από τους κριτές έρχεται κάποιο χρονικό
διάστημα μετά την υποβολή και το
υποβληθέν πρόγραμμα κρίνεται σωστό ή λάθος, με κάποια αιτιολογία. Προφανώς κάθε
ομάδα έχει το δικαίωμα να κάνει όσες υποβολές θέλει, για κάθε και για όσα
προβλήματα θέλει, χωρίς άλλο περιορισμό εκτός του χρονικού ορίου του
διαγωνισμού,
προκειμένου να στείλει σωστές
λύσεις για όσα περισσότερα πρόβληματα μπορεί (μέχρι
ενδεχομένως να τα λύσει όλα σωστά).
Η βαθμολογία και κατάταξη των ομάδων μετά
το πέρας του διαγωνισμού γίνεται ως εξής:
Οι όμαδες ταξινομούνται πρώτα με τον αριθμό των προβλημάτων
που έχουν λύσει και
έπειτα με το συνολικό χρόνο επίλυσης. Πιο συγκεκριμένα:
- Από την αρχή του διαγωνισμού, για κάθε λεπτό που
περνά μετράται ένας βαθμός ποινής
- Για κάθε υποβολή προγράμματος που είναι σωστό, προστίθεται στους
βαθμούς ποινής της ομάδας ο αριθμός των λεπτών που έχουν περάσει
από την αρχή του διαγωνισμού ως την υποβολή του προγράμματος.
- Για κάθε υποβολή προγράμματος που είναι λάθος, προστίθεται στους
βαθμούς ποινής της ομάδας 15 ή 20 βαθμοί ποινής (καθορίζεται).
- ΠΡΟΣΟΧΗ: Βαθμοί ποινής από προγράμματα για προβλήματα που
τελικά δεν επιλύθηκαν
από την ομάδα (σωστά), δεν προμετρώνται στον τελικό
αριθμό βαθμών ποινής για κάθε ομάδα.
Η τελική κατάταξη γίνεται λοιπόν πρώτα με τον αριθμό
των σωστά λυμένων προβλημάτων
και έπειτα με το συνολικό αριθμό βαθμών ποινής.
Ένα παράδειγμα για τρεις ομάδες: Η (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 κλπ.
Εν ολίγοις: ΜΕΓΑΛΗ ΠΡΟΣΟΧΗ ΣΤΙΣ ΕΚΦΩΝΗΣΕΙΣ ΓΙΑΤΙ ΟΔΗΓΟΥΝ ΣΕ (ΑΔΙΚΑ) ΛΑΘΗ
Συγγραφή των προγραμμάτων
Επειδή η ομάδα αποτελείται από τρία ατομα, ο υπολογιστής είναι ένας, και ο
χρόνος πολύτιμος είναι προφανές ότι αυτός που κάθεται μπροστά στον υπολογιστή
δεν πρέπει να τον δεσμεύει από τους συναγωνιστές του περισσότερο απ'όσο είναι
απαραίτητο. Οι ενέργειες για να επιτευχθεί όσο το δυνατόν μεγαλύτερη οικονομία
του αγαθού αυτού ειναι οι εξής (όπως έχουν κυρίως προταθεί
από το μεγάλο δάσκαλο
Δημήτρη Στάικο και σύμφωνα με την εμπειρία μας):
Στην αρχή του διαγωνισμού που γίνονται γνωστά τα θέματα, καλό είναι
να γίνει μια αρχική φάση "αναγνώρισης", διάρκειας 5 λεπτών. Όλα τα θέματα
μοιράζονται στα μέλη της ομάδας για μια γρήγορη επισκόπηση. Με το πέρας των
5 λεπτών, θα πρέπει να έχουν εντοπιστεί τα τρία θέματα που φαίνονται
πιο εύκολα και με τα οποία θα αρχίσει η ενασχόληση. Επίσης θα πρέπει
να καθοριστεί και ποιό μέλος θα ασχοληθεί με ποιο πρόβλημα αρχικά.
Η ιδέα είναι μόλις κάποιο μέλος στείλει αποστείλει ένα πρόγραμμα,
περιμένοντας την απάντηση, να αρχίσει να ασχολείται με κάποιο άλλο.
Προς το τέλος του διαγωνισμού, όπου ενδεχομένως θα υπάρχουν λιγότερα από
3 άλυτα προβλήματα, μπορεί να γίνει και συνεργασία μεταξύ της ομάδας
για τη λύση τους. Απο την εμπειρία πάντως προκύπτει ότι τα άτομα
δουλεύοντας ξεχωριστά είναι πιο αποδοτικά.
Εφόσον δεν είναι δυνατό ο καθένας να είναι μπροστά σε υπολογιστή
συνέχεια, ο καλύτερος τρόπος να φτιαχτεί ένα πρόγραμμα, είναι η σχεδίαση
στο χαρτί. Τα στάδια ετοιμασίας της λύσης ενός προγράμματος
μπορούν να δοθούν ως εξής:
- Σκεφτόμαστε το γενικό αλγόριθμο επίλυσης του προβλήματος.
- Κάνουμε ένα γενικό σχεδιάγραμμα σε χαρτί.
- Γράφουμε ένα ποιο αναλυτικό πρόγραμμα στο χαρτί, κυρίως στα
σημεία που χρειάζεται προσοχή στις μη προφανείς λεπτομέριες
του προγράμματος.
- Όταν ο υπολογιστής ελευθερωθεί, πρέπει να είμαστε έτοιμοι
να πληκτρολογήσουμε το πρόγραμμα χωρίς σχεδόν καθόλου
σκέψη. Σκέψη πάνω από τον υπολογιστή σημαίνει χαμένος
χρόνος από κάποιον που θα ήθελε να γράψει.
Ακολουθώντας παρόμοιες σκέψεις, θα πρέπει να είμαστε πολύ προσεκτικοί
στο χρόνο debugging πάνω στον υπολογιστή. Προσπαθούμε πάντα να φτιάξουμε
σωστό πρόγραμμα με τη σκέψη, και χρησιμοποιούμε τους debuggers και τα
tests μόνο για να είμαστε τελείως βέβαια οτι το πρόγραμμα είναι σωστό.
Σε περιπτώσεις όπου πχ. το πρόγραμμα κρίνεται λαθεμένο, καλό είναι πρώτα
να εκτυπώσουμε το πρόγραμμα και να προσπαθήσουμε να βρούμε ΟΛΑ τα λάθη
από το χαρτί και να κάνουμε μια σύντομη επαλήθευση στον υπολογιστή, παρά
να ξοδεύουμε χρόνο σε debugging στον υπολογιστή "παίζοντας" με τις
επιλογές του debugger. Προσοχή, να ελέγχουμε όλο το πρόγραμμα για λάθη
και να μη σταματάμε στο πρώτο που θα βρούμε.
Στην αρχή του διαγωνισμού, μπορεί να αποφασιστεί ποιος θα είναι ο πρώτος
που θα χρησιμοποιήσει τον υπολογιστή. Αυτός, αφού δουλέψει πολύ λίγο
στο χαρτί, θα αρχίσει να γράφει στον υπολογιστή κατευθείαν, ώστε να
μην χάνεται ο χρόνος χρησιμοποίησης του μηχανήματος. Έτσι, προφανώς
κάθε στιγμή, ένα άτομο θα χρησιμοποιεί τον υπολογιστή και δύο θα γράφουν
στο χαρτί, θα σκέφτονται ή θα συζητούν λύσεις για τα προβλήματα.
Θέματα αλγορίθμων
Πολύ συχνά το πρόβλημα και ο χρόνος που δίνεται στο πρόγραμμα είναι
τέτοια που υποδεικνύουν τη χρησιμοποίηση αποδοτικού αλγορίθμου.
Ωστόσο, τις περισσότερες φορές, είναι δυνατό είτε σε ολόκληρο το πρόβλημα,
είτε σε μέρη αυτού να χρησιμοποιήσουμε παραλλαγές του αλγορίθμου ή
άλλο αλγόριθμο, που σε θεωρητική βάση να μην είναι ο πιο αποδοτικός,
πρακτικά όμως να μην οδηγεί σε σοβαρή διαφορά χρόνου εκτέλεσης του
προγράμματος, ενώ παράλληλα θα επιτρέπει την πολύ πιο γρήγορη
υλοποίηση, έλεγχο ή τη χρησιμοποίηση έτοιμων υποπρογραμμάτων.
Λόγω του περιορισμένου χρόνου του διαγωνισμού, συμφέρει συχνά
να χρησιμοποιήσουμε τρόπο επίλυσης αργό (υπολογιστικά), άκομψο, αλλά
που να δίνει απάντηση σε λογικά χρονικά περιθώρια και να είναι πχ.
πολύ εύκολος στην υλοποίηση και στον έλεγχο σωστής λειτουργίας, ή πχ.
να υπάρχει ήδη έτοιμος σε χαρτί (να αρκεί η πληκτρολόγηση).
Σε συνδιασμό με το παραπάνω κρίνεται απαραίτητο κάθε ομάδα να που
συμμετέχει στο διαγωνισμό, να είναι εφοδιασμένη με έτοιμες ρουτίνες
που χρησιμοποιούνται συχνά σε προβλήματα. Οι ρουτίνες θα πρέπει
βέβαια να είναι σε έντυπη μορφή και να διακατέχονται από κάποια
χαρακτηριστικά:
- Να είναι ελεγμένα σωστές. Αυτό είναι αυτονόητο, εφόσον οι
ρουτίνες αυτές φτιάχονται πριν απο το διαγωνισμό και
υπάρχει όλος ο χρόνος να κατασκευαστούν σωστά.
- Να είναι εύκολες στην πληκτρολόγηση, για προφανείς λόγους.
Θα πρέπει δηλαδή να είναι μικρές σε μέγεθος, να μην
έχουν περίπλοκα ονόματα μεταβλητών και περίεργες
πράξεις κλπ.
- Κάθε μέλος της ομάδας θα πρέπει να έχει εξοικίωση με αυτές
και να μπορεί να τις χρησιμοποιήσει χωρίς πρόβλημα.
Για παράδειγμα, μπορούμε να αναφέρουμε ότι τέτοιου είδους ρουτίνες μπορεί να
είναι για:
- Γράφους: δημιουργία, αναζήτηση, δομές, γνωστοί αλγόριθμοι κλπ.
- Δέντρα: αντίστοιχα
- Συνδιασμούς, μεταθέσεις, με ή χωρίς επανάληψη, αναδρομική
απαρίθμησή τους με δυνατότητα "κλαδέματος" κλπ.
- Αντιστοίχιση strings σε αριθμούς