Σημειώσεις για διαγωνισμούς προγραμματισμού
Έκδοση0.2.0
Αντώνης Καβαρνός
EMailAntonios.Kavarnos@softlab.ece.ntua.gr
Τηλέφωνο+30-1-772-1597

Σημειώσεις για διαγωνισμούς προγραμματισμού

Γενικά

Σε ένα διαγωνισμό πληροφορικής, όπως σε παρόμοιους διαγωνισμούς μαθηματικών, φυσικής, χημείας κλπ. τίθενται προβλήματα τα οποία καλούνται οι διαγωνιζόμενοι να λύσουν, σε περιορισμένο χρόνο. Τα προβλήματα είναι αλγοριθμικής φύσης. Η λύση τους είναι ένα πρόγραμμα για υπολογιστή, σε κάποια διαδεδομένη γλώσσα (συνήθως C, C++, Pascal ή Basic). Προφανώς το πρόγραμμα πρέπει να λύνει το πρόβλημα σωστά για κάθε περίπτωση. Για παράδειγμα ένα πρόβλημα μπορεί να είναι: "Ζητείται ένα πρόγραμμα που λαμβάνει στην είσοδο δύο ή περισσότερους ακεραίους και βγάζει στην έξοδο το άθροισμά τους".

Στους διαγωνισμούς προγραμματισμού συμμετέχουν συνήθως τμήματα πανεπιστημίων που έχουν σχέση με την πληροφορική. Για τον ελληνικό διαγωνισμό, δικαίωμα συμμετοχής έχουν τα τμήματα των πανεπιστημίων που αναφέρουν στον τίτλο τους το αντικείμενο των υπολογιστών ή της πληροφορικής.

Σε γενικές γραμμές, ο διαγωνισμός διέπεται από τους εξής βασικούς κανόνες:

Ειδικά για τον ελληνικό διαγωνισμό, ισχύουν και τα παρακάτω: Στο διεθνή διαγωνισμό αντίθετα, ισχύουν τα παρακάτω: Άλλοι σημαντικοί κανόνες:

Διαδικασία του διαγωνισμού

Ο διαγωνισμός ξεκινά μια συγκεκριμένη στιγμή, οπότε δίνονται και τα θέματα και κρατά για λίγες ώρες (συνήθως 4 ή 5). Τα θέματα είναι κάποιος αριθμός προβλημάτων προς λύση (συνήως 3 ως 8). Σκοπός κάθε ομάδας είναι να λύσει σωστά όσο το δυνατόν περισσότερα προβλήματα σε όσο το δυνατόν λιγότερο χρόνο. Οποιαδήποτε στιγμή κατά τη διάρκεια του διαγωνισμού, κάθε ομάδα, όποτε αισθάνεται ετοιμη, υποβάλει (με ορισμένη διαδικασία) ένα πρόγραμμα ως υποψήφια λύση ενός προβλήματος. Η απάντηση από τους κριτές έρχεται κάποιο χρονικό διάστημα μετά την υποβολή και το υποβληθέν πρόγραμμα κρίνεται σωστό ή λάθος, με κάποια αιτιολογία. Προφανώς κάθε ομάδα έχει το δικαίωμα να κάνει όσες υποβολές θέλει, για κάθε και για όσα προβλήματα θέλει, χωρίς άλλο περιορισμό εκτός του χρονικού ορίου του διαγωνισμού, προκειμένου να στείλει σωστές λύσεις για όσα περισσότερα πρόβληματα μπορεί (μέχρι ενδεχομένως να τα λύσει όλα σωστά).

Η βαθμολογία και κατάταξη των ομάδων μετά το πέρας του διαγωνισμού γίνεται ως εξής: Οι όμαδες ταξινομούνται πρώτα με τον αριθμό των προβλημάτων που έχουν λύσει και έπειτα με το συνολικό χρόνο επίλυσης. Πιο συγκεκριμένα:

Η τελική κατάταξη γίνεται λοιπόν πρώτα με τον αριθμό των σωστά λυμένων προβλημάτων και έπειτα με το συνολικό αριθμό βαθμών ποινής.

Ένα παράδειγμα για τρεις ομάδες: Η (1) λύνει τρία προβλήματα, το πρώτο στη 1 ώρα, το δεύτερο στις 2 ώρες και το τρίτο στις 3 ώρες και τριάντα λεπτά (από την αρχή του διαγωνισμού) ενώ έχει και λάθος υποβολές σε ένα τέταρτο πρόβλημα. Η (2) κάνει λάθος στο πρώτο στα 40 λεπτά, λάθος το τέταρτο στα 50 λεπτά, στέλνει σωστά το δεύτερο στη μία ωρα, στέλνει σωστά το πρώτο στη 1 ώρα και 20 λεπτά. Η (3) στέλνει σωστά το δεύτερο πρόβλημα στις 2 ώρες και το τέταρτο πρόβλημα στις 2 ώρες και 40 λεπτά. Η κατάταξη θα είναι ως εξής:
ΚατάταξηΟμάδαΑριθμός λυμένων προβλημάτωνΒαθμοί ποινής
(1)360+120+210=390
(2)215+60+80=155
(3)2120+160=280

Τι σημαίνει σωστό πρόγραμμα

Στους διαγωνισμούς προγραμματισμού για πανεπιστήμια, το σωστό πρόγραμμα κρίνεται μόνο από τον εξωτερικό έλεγχο της λειτουργίας του (έλεγχος με τη μέθοδο του μαύρου κουτιού). Κάθε πρόγραμμα που υποβάλουμε ως υποψήφια λύση για ένα πρόβλημα, ελέγχεται με κάποια (κρυφά) δεδομένα εισόδου από την κριτική επιτροπή του διαγωνισμού (τους κριτές (judges)). Αν το πρόγραμμα βγάζει τις αντίστοιχες σωστές εξόδους, σε αποδεκτό χρόνο, τότε το πρόγραμμα θεωρείται σωστό. Το πρόγραμμα μπορεί να κριθεί ως λαθεμένο σύμφωνα με τις ακόλουθες αιτιολογίες:

Στους διαγωνισμούς αυτούς, δε λαμβάνεται καθόλου υπόψη η μορφή του προγράμματος που υποβάλουμε (πχ. σχόλια, identation, εύλογα ονόματα μεταβλητών κλπ.). Τα χαρακτηριστικά αυτά βοηθάνε μόνο το συγγραφέα του προγράμματος και (κυρίως) το συνεργάτη του που θα τον βοηθήσει στη διόρθωση λαθών. Θα πρέπει λοιπόν να χρησιμοποούνται με μέτρο και μόνο αν δεν επιβαρύνουν άνισα τη βαθμολογία της ομάδας.

Κύριοι σκοποί μια ομάδας που θέλει να συμμετάσχει με αξιώσεις είναι να αντιμετωπίσει κάθε πρόβλημα με τα ακόλουθα κατά νου:

Οι σκοποί αυτοί βέβαια είναι όλη η ουσία του διαγωνισμού, και στην προετοιμασία μας, με αυτά κυρίως τα θέματα θα ασχοληθούμε.

Στρατηγικές για καλή απόδοση στο διαγωνισμό

Οι εκφωνήσεις των θεμάτων

Μεγάλη σημασία πρέπει να δοθεί στο γεγονός ότι η εκφώνηση δεν λέει ποτέ ψέματα. Αν πχ. λέγεται ότι η είσοδος θα είναι ένας θετικός ακέραιος, τότε αποκλείεται να δοθεί ως είσοδος ένα αλφαριθμητικό (string) ή ένας αρνητικός. Μπορεί όμως η εκφώνηση να περιέχει κάποια ασάφεια, ή να μην διευκρινίζει κάτι. Δεν πρέπει να κάνουμε δικές μας παραδοχές! Με την κατάλληλη διαδικασία ρωτάμε για διευκρίνηση από τους κριτές, ή αν γίνεται, λαμβάνουμε όλες τις δυνατές περιπτώσεις υπόψην. Πχ. στο προηγούμενο παράδειγμα, δεν είναι εντελώς σαφές αν η είσοδος μπορεί να είναι το 0 (μηδέν). Είτε ρωτούμε, είτε λύνουμε το πρόβλημα και για το 0.

Πολύ σημαντικό είναι επίσης ότι η εκφώνιση αλλά ίσως και οι κανόνες του διαγωνισμού προκαθορίζουν τη μορφή των δεδομένων της εισόδου και της εξόδου που θα πρέπει να υποστηρίζει το πρόγραμμά μας. Πχ. μπορεί να ζητείται η είσοδος και η έξοδος να είναι συγκεκριμένα αρχεία ή αντίθετα οι προκαθορισμένες (standard input, standard output). Μπορεί να καθορίζεται ότι η είσοδος θα είναι αριθμοί σε μία μόνο γραμμή ενώ η έξοδος ένας αριθμός σε κάθε σειρά, χωρίς άλλα σχόλια, παραπάνω κενά, παραπάνω αλλαγές γραμμής, λέξεις, επεξηγήσεις, σχόλια για debugging κλπ.

Εν ολίγοις: ΜΕΓΑΛΗ ΠΡΟΣΟΧΗ ΣΤΙΣ ΕΚΦΩΝΗΣΕΙΣ ΓΙΑΤΙ ΟΔΗΓΟΥΝ ΣΕ (ΑΔΙΚΑ) ΛΑΘΗ

Συγγραφή των προγραμμάτων

Επειδή η ομάδα αποτελείται από τρία ατομα, ο υπολογιστής είναι ένας, και ο χρόνος πολύτιμος είναι προφανές ότι αυτός που κάθεται μπροστά στον υπολογιστή δεν πρέπει να τον δεσμεύει από τους συναγωνιστές του περισσότερο απ'όσο είναι απαραίτητο. Οι ενέργειες για να επιτευχθεί όσο το δυνατόν μεγαλύτερη οικονομία του αγαθού αυτού ειναι οι εξής (όπως έχουν κυρίως προταθεί από το μεγάλο δάσκαλο Δημήτρη Στάικο και σύμφωνα με την εμπειρία μας):

Στην αρχή του διαγωνισμού που γίνονται γνωστά τα θέματα, καλό είναι να γίνει μια αρχική φάση "αναγνώρισης", διάρκειας 5 λεπτών. Όλα τα θέματα μοιράζονται στα μέλη της ομάδας για μια γρήγορη επισκόπηση. Με το πέρας των 5 λεπτών, θα πρέπει να έχουν εντοπιστεί τα τρία θέματα που φαίνονται πιο εύκολα και με τα οποία θα αρχίσει η ενασχόληση. Επίσης θα πρέπει να καθοριστεί και ποιό μέλος θα ασχοληθεί με ποιο πρόβλημα αρχικά. Η ιδέα είναι μόλις κάποιο μέλος στείλει αποστείλει ένα πρόγραμμα, περιμένοντας την απάντηση, να αρχίσει να ασχολείται με κάποιο άλλο. Προς το τέλος του διαγωνισμού, όπου ενδεχομένως θα υπάρχουν λιγότερα από 3 άλυτα προβλήματα, μπορεί να γίνει και συνεργασία μεταξύ της ομάδας για τη λύση τους. Απο την εμπειρία πάντως προκύπτει ότι τα άτομα δουλεύοντας ξεχωριστά είναι πιο αποδοτικά.

Εφόσον δεν είναι δυνατό ο καθένας να είναι μπροστά σε υπολογιστή συνέχεια, ο καλύτερος τρόπος να φτιαχτεί ένα πρόγραμμα, είναι η σχεδίαση στο χαρτί. Τα στάδια ετοιμασίας της λύσης ενός προγράμματος μπορούν να δοθούν ως εξής:

Ακολουθώντας παρόμοιες σκέψεις, θα πρέπει να είμαστε πολύ προσεκτικοί στο χρόνο debugging πάνω στον υπολογιστή. Προσπαθούμε πάντα να φτιάξουμε σωστό πρόγραμμα με τη σκέψη, και χρησιμοποιούμε τους debuggers και τα tests μόνο για να είμαστε τελείως βέβαια οτι το πρόγραμμα είναι σωστό. Σε περιπτώσεις όπου πχ. το πρόγραμμα κρίνεται λαθεμένο, καλό είναι πρώτα να εκτυπώσουμε το πρόγραμμα και να προσπαθήσουμε να βρούμε ΟΛΑ τα λάθη από το χαρτί και να κάνουμε μια σύντομη επαλήθευση στον υπολογιστή, παρά να ξοδεύουμε χρόνο σε debugging στον υπολογιστή "παίζοντας" με τις επιλογές του debugger. Προσοχή, να ελέγχουμε όλο το πρόγραμμα για λάθη και να μη σταματάμε στο πρώτο που θα βρούμε.

Στην αρχή του διαγωνισμού, μπορεί να αποφασιστεί ποιος θα είναι ο πρώτος που θα χρησιμοποιήσει τον υπολογιστή. Αυτός, αφού δουλέψει πολύ λίγο στο χαρτί, θα αρχίσει να γράφει στον υπολογιστή κατευθείαν, ώστε να μην χάνεται ο χρόνος χρησιμοποίησης του μηχανήματος. Έτσι, προφανώς κάθε στιγμή, ένα άτομο θα χρησιμοποιεί τον υπολογιστή και δύο θα γράφουν στο χαρτί, θα σκέφτονται ή θα συζητούν λύσεις για τα προβλήματα.

Θέματα αλγορίθμων

Πολύ συχνά το πρόβλημα και ο χρόνος που δίνεται στο πρόγραμμα είναι τέτοια που υποδεικνύουν τη χρησιμοποίηση αποδοτικού αλγορίθμου. Ωστόσο, τις περισσότερες φορές, είναι δυνατό είτε σε ολόκληρο το πρόβλημα, είτε σε μέρη αυτού να χρησιμοποιήσουμε παραλλαγές του αλγορίθμου ή άλλο αλγόριθμο, που σε θεωρητική βάση να μην είναι ο πιο αποδοτικός, πρακτικά όμως να μην οδηγεί σε σοβαρή διαφορά χρόνου εκτέλεσης του προγράμματος, ενώ παράλληλα θα επιτρέπει την πολύ πιο γρήγορη υλοποίηση, έλεγχο ή τη χρησιμοποίηση έτοιμων υποπρογραμμάτων. Λόγω του περιορισμένου χρόνου του διαγωνισμού, συμφέρει συχνά να χρησιμοποιήσουμε τρόπο επίλυσης αργό (υπολογιστικά), άκομψο, αλλά που να δίνει απάντηση σε λογικά χρονικά περιθώρια και να είναι πχ. πολύ εύκολος στην υλοποίηση και στον έλεγχο σωστής λειτουργίας, ή πχ. να υπάρχει ήδη έτοιμος σε χαρτί (να αρκεί η πληκτρολόγηση).

Σε συνδιασμό με το παραπάνω κρίνεται απαραίτητο κάθε ομάδα να που συμμετέχει στο διαγωνισμό, να είναι εφοδιασμένη με έτοιμες ρουτίνες που χρησιμοποιούνται συχνά σε προβλήματα. Οι ρουτίνες θα πρέπει βέβαια να είναι σε έντυπη μορφή και να διακατέχονται από κάποια χαρακτηριστικά:

Για παράδειγμα, μπορούμε να αναφέρουμε ότι τέτοιου είδους ρουτίνες μπορεί να είναι για: