Παπαγάλοι Parrots Ο Γηάλλεο αγαπάεη ηα πνπιηά. Από ηόηε πνπ δηάβαζε γηα ηελ ηερληθή κεηάδνζεο κελπκάησλ IP over Avian Carriers (IPoAC), πεξλάεη έλα κεγάιν κέξνο ηνπ ρξόλνπ ηνπ εθπαηδεύνληαο έλα ζκήλνο έμππλσλ παπαγάισλ λα κεηαθέξνπλ κελύκαηα ζε κεγάιεο απνζηάζεηο. Τν όλεηξν ηνπ Γηάλλε είλαη λα ρξεζηκνπνηήζεη ηα πνπιηά ηνπ γηα λα ζηείιεη έλα M θάπνπ καθξηά. Τν M είλαη κία αθνινπζία από N (όρη απαξαίηεηα δηαθξηηνύο) αθεξαίνπο, θαζέλαο από ηνπο νπνίνπο είλαη κεηαμύ 0 θαη 255, Ο Γηάλλεο έρεη ζηε δηάζεζή ηνπ K εηδηθά εθπαηδεπκέλνπο παπαγάινπο. Όινη νη παπαγάινη κνηάδνπλ κεηαμύ ηνπο θαη ν Γηάλλεο δελ κπνξεί λα ηνπο μερσξίζεη. Κάζε πνπιί κπνξεί λα ζπκάηαη έλαλ κόλν αθέξαην κεηαμύ 0 θαη R, ζυμπεριλαμβανομένων. Νσξίηεξα, ν Γηάλλεο δνθίκαζε έλα απιό ζρήκα (scheme): γηα λα ζηείιεη έλα, έβγαδε πξνζεθηηθά ηα πνπιηά από ην θινπβί ηνπο έλα θάζε θνξά. Πξηλ αθήζεη θάζε πνπιί λα πεηάμεη, ηνπ κάζαηλε έλαλ αξηζκό κε ηε ζεηξά πνπ απηνί εκθαλίδνληαη ζηελ αθνινπζία ηνπ κελύκαηνο. Δπζηπρώο, απηό ην ζρήκα δε ιεηηνύξγεζε. Τειηθά όια ηα πνπιηά έθηαλαλ ζηνλ πξννξηζκό, όκσο δελ έθηαλαλ αλαγθαζηηθά κε ηελ ίδηα ζεηξά κε ηελ νπνία έθεπγαλ. Με ην ζρήκα απηό, ν Γηάλλεο κπνξνύζε λα αλαθαηαζθεπάζεη όινπο ηνπο αξηζκνύο πνπ έζηειλε, δελ κπνξνύζε όκσο λα ηνπο βάιεη ζηε ζσζηή ζεηξά. Γηα λα πξαγκαηνπνηήζεη ην όλεηξό ηνπ, ν Γηάλλεο ρξεηάδεηαη έλα θαιύηεξν ζρήκα θαη γη απηό ζέιεη ηε βνήζεηά ζαο. Δνζέληνο ελόο κελύκαηνο M, ζθνπεύεη λα αθήζεη ηα πνπιηά ηνπ λα πεηάμνπλ έλαέλα, όπσο πξηλ. Θέιεη λα γξάςεηε έλα πξόγξακκα κε δύν μερσξηζηέο ιεηηνπξγίεο: Πξώηνλ, ην πξόγξακκά ζαο πξέπεη λα κπνξεί λα δηαβάζεη έλα M θαη λα ην κεηαζρεκαηίζεη ζε κία αθνινπζία ην πνιύ K αθεξαίσλ, κεηαμύ 0 θαη R, ζπκπεξηιακβαλνκέλσλ, ηνπο νπνίνπο ζα κάζεη ζηα πνπιηά. Δεύηεξνλ, ην πξόγξακκά ζαο πξέπεη λα κπνξεί λα δηαβάζεη ηε ιίζηα ησλ αθεξαίσλ κεηαμύ 0 θαη R, ζπκπεξηιακβαλνκέλσλ, όπσο απηνί έξρνληαη όηαλ ηα πνπιηά θηάλνπλ ζηνλ πξννξηζκό, θαη ζηε ζπλέρεηα λα αλαθαηαζθεπάζεη ην αξρηθό M. Μπνξείηε λα ππνζέζεηε όηη όινη νη παπαγάινη πάληνηε θηάλνπλ ζηνλ πξννξηζκό θαη όηη θάζε έλαο από απηνύο ζπκάηαη ηνλ αξηζκό πνπ ηνπ είρε αλαηεζεί. Ο Γηάλλεο ζαο ζπκίδεη θαη πάιη όηη νη παπαγάινη είλαη δπλαηόλ λα θηάλνπλ κε νπνηαδήπνηε ζεηξά. Σεκεηώζηε όηη ν Γηάλλεο έρεη κόλν K παπαγάινπο, επνκέλσο ε αθνινπζία ησλ αθεξαίσλ κεηαμύ 0 θαη R, ζπκπεξηιακβαλνκέλσλ, πνπ ζα θαηαζθεπάζεηε πξέπεη λα πεξηέρεη ην πνιύ K αθέξαηνπο. Ζηηείηαι Γξάςηε δύν μερσξηζηέο δηαδηθαζίεο. Η κία από απηέο ζα ρξεζηκνπνηεζεί από ηνλ απνζηνιέα (encoder) θαη ε άιιε από ηνλ παξαιήπηε (decoder). Οιόθιεξε ε δηαδηθαζία είλαη ε εμήο: αξρηθό θσδηθνπνηεκέλν αλαθαηεκέλν ηειηθό (πξέπεη λα είλαη ίζν κε ην M) Σειίδα 1 από 5
Οη δύν δηαδηθαζίεο πνπ πξέπεη λα γξάςεηε είλαη: Η δηαδηθαζία encode(n,m) πνπ δέρεηαη ηηο αθόινπζεο παξακέηξνπο: N ην κήθνο ηνπ κελύκαηνο. M έλαλ κνλνδηάζηαην πίλαθα N αθεξαίσλ πνπ αλαπαξηζηνύλ ην. Μπνξείηε λα ππνζέζεηε όηη 0 M[i] 255 όπνπ 0 i < N. Η δηαδηθαζία απηή πξέπεη λα θσδηθνπνηεί ην M ζε κία αθνινπζία αθεξαίσλ κεηαμύ 0 θαη R, ζπκπεξηιακβαλνκέλσλ, πνπ ζα ζηαιεί κε ηνπο παπαγάινπο. Γηα λα αλαθέξεη απηή ηελ αθνινπζία, ε δηαδηθαζία encode πνπ ζα γξάςεηε πξέπεη λα θαιεί ηε δηαδηθαζία send(a) γηα θάζε αθέξαην a πνπ ζέιεη λα δώζεη ζε θάπνην από ηα πνπιηά. Η δηαδηθαζία decode(n,l,x) πνπ δέρεηαη ηηο αθόινπζεο παξακέηξνπο: N ην κήθνο ηνπ αξρηθνύ κελύκαηνο. L ην κήθνο ηνπ κελύκαηνο πνπ ιακβάλεηαη (ην πιήζνο ησλ πνπιηώλ πνπ ζηάιζεθαλ). X έλαλ κνλνδηάζηαην πίλαθα L αθεξαίσλ πνπ αλαπαξηζηνύλ ηνπο αξηζκνύο πνπ παξαιήθζεθαλ. Οη αξηζκνί X[i] (όπνπ 0 i < L) είλαη αθξηβώο νη αξηζκνί πνπ παξήγαγε ε δηαδηθαζία encode, πηζαλώο όκσο κε δηαθνξεηηθή ζεηξά. Η δηαδηθαζία απηή πξέπεη λα αλαθαηαζθεπάδεη ην αξρηθό. Γηα λα ην αλαθέξεη, ε δηαδηθαζία decode πνπ ζα γξάςεηε πξέπεη λα θαιεί ηε δηαδηθαζία output(b) γηα θάζε αθέξαην b ζην απνθσδηθνπνηεκέλν, κε ηε ζσζηή ζεηξά. Σεκεηώζηε όηη ηα R θαη K δελ δίλνληαη σο παξάκεηξνη εηζόδνπ παξαθαιώ δείηε ηηο πεξηγξαθέο ησλ ππνπξνβιεκάησλ παξαθάησ. Γηα λα επηιύνπλ ζσζηά θάπνην από ηα δνζέληα ππνπξνβιήκαηα, νη δηαδηθαζίεο ζαο πξέπεη λα ηθαλνπνηνύλ ηνπο αθόινπζνπο πεξηνξηζκνύο: Όινη νη αθέξαηνη πνπ ζηέιλνληαη από ηε δηαδηθαζία encode πξέπεη λα είλαη εληόο ησλ νξίσλ πνπ θαζνξίδνληαη από ην ππνπξόβιεκα. Η δηαδηθαζία encode δελ πξέπεη λα θαιεί ηε δηαδηθαζία send πεξηζζόηεξεο θνξέο από ην όξην K πνπ θαζνξίδεηαη ζην ππνπξόβιεκα. Παξαθαιώ, ζεκεηώζηε όηη ην K εμαξηάηαη από ην κήθνο ηνπ κελύκαηνο. Η δηαδηθαζία decode πξέπεη λα αλαθαηαζθεπάδεη ζσζηά ην αξρηθό M θαη λα θαιεί ηε δηαδηθαζία output(b) αθξηβώο N θνξέο, όπνπ ην b λα ηζνύηαη κε M[0], M[1],..., M[N-1], αληίζηνηρα. Σην ηειεπηαίν ππνπξόβιεκα, ε βαζκνινγία ζαο ζα θαζνξηζηεί από ην ιόγν κεηαμύ ησλ κεθώλ ηνπ θσδηθνπνηεκέλνπ κελύκαηνο θαη ηνπ αξρηθνύ κελύκαηνο. Παράδειγμα Έζησ ε πεξίπησζε όπνπ N = 3, θαη M= 10 30 20 Σειίδα 2 από 5
Η δηαδηθαζία encode(n,m), ρξεζηκνπνηώληαο θάπνηα πεξίεξγε κέζνδν, κπνξεί λα θσδηθνπνηήζεη ην κε ηελ αθνινπζία ησλ αξηζκώλ (7, 3, 2, 70, 15, 20, 3). Γηα λα αλαθέξεη απηήλ ηελ αθνινπζία, πξέπεη λα θαιέζεη ηε δηαδηθαζία send σο εμήο: send(7) send(3) send(2) send(70) send(15) send(20) send(3) Μόιηο θηάζνπλ όινη νη παπαγάινη ζηνλ πξννξηζκό, ππνζέζηε όηη πξνθύπηεη ε ιίζηα ησλ αλαθαηεκέλσλ αξηζκώλ: (3, 20, 70, 15, 2, 3, 7). Η δηαδηθαζία decode ζα θιεζεί ηόηε κε N=3, L=7, θαη X= 3 20 70 15 2 3 7 Η δηαδηθαζία decode πξέπεη λα αλαθαηαζθεπάζεη ην αξρηθό (10, 30, 20). Αλαθέξεη ην απνηέιεζκά ηεο θαιώληαο ηε δηαδηθαζία output σο εμήο. output(10) output(30) output(20) Υποπροβλήμαηα Υποπρόβλημα 1 (17 βαθμοί) N = 8, θαη θάζε αθέξαηνο ζηνλ πίλαθα M είλαη 0 ή 1. Κάζε θσδηθνπνηεκέλνο αθέξαηνο πξέπεη λα είλαη ζηελ πεξηνρή από 0 έσο R=65535, Υποπρόβλημα 2 (17 βαθμοί) 1 N 16. Κάζε θσδηθνπνηεκέλνο αθέξαηνο πξέπεη λα είλαη ζηελ πεξηνρή από 0 έσο R=65535, Σειίδα 3 από 5
Υποπρόβλημα 3 (18 βαθμοί) 1 N 16. Υποπρόβλημα 4 (29 βαθμοί) 1 N 32. Υποπρόβλημα 5 (μέτρι 19 βαθμοί) 16 N 64. Τν κέγηζην πιήζνο θιήζεσλ ηεο send είλαη K=15 N. Σημανηικό: ε βαζκνινγία ζε απηό ην ππνπξόβιεκα εμαξηάηαη από ην ιόγν κεηαμύ ηνπ κήθνπο ηνπ θσδηθνπνηεκέλνπ κελύκαηνο θαη ηνπ κήθνπο ηνπ αξρηθνύ κελύκαηνο. Γηα θάζε πεξίπησζε ειέγρνπ t ζε απηό ην ππνπξόβιεκα, έζησ Pt=Lt/Nt ν ιόγνο κεηαμύ ηνπ κήθνπο Lt ηνπ θσδηθνπνηεκέλνπ κελύκαηνο θαη ηνπ κήθνπο Nt ηνπ αξρηθνύ κελύκαηνο. Έζησ P ν κέγηζηνο όισλ ησλ Pt. Η βαζκνινγία ζαο γηα απηό ην ππνπξόβιεκα ζα είλαη: αλ P 5, παίξλεηε ην ζύλνιν ησλ 19 βαζκώλ. αλ 5 < P 6, παίξλεηε 18 βαζκνύο. αλ 6 < P 7, παίξλεηε 17 βαζκνύο. αλ 7 < P 15, παίξλεηε 1 + 2 (15 - P) βαζκνύο, ζηξνγγπινπνηεκέλν πξνο ηα θάησ ζηνλ πιεζηέζηεξν αθέξαην. αλ P > 15 ή οποιαδήποηε από ηηο εμόδνπο ζαο είλαη ιάζνο, παίξλεηε 0 βαζκνύο. Σημανηικό: Κάζε έγθπξε ιύζε ησλ ππνπξνβιεκάησλ 1 έσο 4 ζα ιύλεη επίζεο όια ηα πξνεγνύκελα ππνπξνβιήκαηα. Όκσο, ιόγσ ηνπ κεγαιύηεξνπ νξίνπ γηα ην K, κία έγθπξε ιύζε ηνπ ππνπξνβιήκαηνο 5 κπνξεί λα κελ είλαη ζε ζέζε λα ιύζεη ηα ππνπξνβιήκαηα 1 έσο 4. Είλαη δπλαηόλ όκσο λα θαηαζθεπάζεηε κία ιύζε πνπ λα ιύλεη ζσζηά όια ηα ππνπξνβιήκαηα. Λεπηομέρειες σλοποίηζης Όρια Πεξηβάιινλ βαζκνιόγεζεο: Σην πξαγκαηηθό πεξηβάιινλ βαζκνιόγεζεο, νη ππνβνιέο ζαο ζα κεηαγισηηίδνληαη ζε δύν μερσξηζηά πξνγξάκκαηα e θαη d, ηα νπνία ζα εθηεινύληαη μερσξηζηά. Τα αξρεία ηνπ encoder θαη ηνπ decoder ζα κεηαγισηηηζηνύλ θαη ζα ζπλδεζνύλ (link) θαη ζηα δύν πξνγξάκκαηα, αιιά ην e ζα θαιεί κόλν ηελ encode θαη ην d ζα θαιεί κόλν ηε decode. Σειίδα 4 από 5
Όξην ρξόλνπ CPU: Τν πξόγξακκα e ζα θάλεη 50 θιήζεηο ζηε δηαδηθαζία encode θαη ζα πξέπεη λα ηξέρεη ζε 2 seconds. Τν πξόγξακκα d ζα θάλεη 50 θιήζεηο ζηε δηαδηθαζία decode θαη ζα πξέπεη λα ηξέρεη ζε 2 seconds. Όξην κλήκεο: 256 MB Σημείωζη: Δελ ππάξρεη ξεηό όξην ζην κέγεζνο ηεο κλήκεο ζηνίβαο (stack memory). Η κλήκε ζηνίβαο πξνζκεηξάηαη ζηε ζπλνιηθή κλήκε. Διεπαθή (Interface, API) Καηάινγνο πινπνίεζεο: parrots/ Υινπνηήζηε: encoder.c ή encoder.cpp ή encoder.pas decoder.c ή decoder.cpp ή decoder.pas Σημείωζη για ηοσς προγραμμαηιζηές C/C++: ηόζν ζην παξάδεηγκα δηνξζσηή όζν θαη ζηνλ πξαγκαηηθό δηνξζσηή, ηα αξρεία encoder.c[pp] θαη decoder.c[pp] ζπλδένληαη καδί κε ην δηνξζσηή. Επνκέλσο, πξέπεη λα νξίζεηε όιεο ηηο θαζνιηθέο κεηαβιεηέο ζε θάζε αξρείν σο static γηα λα κελ αιιειεπηδξνύλ κε κεηαβιεηέο ησλ άιισλ αξρείσλ. Δηεπαθή ρξήζηε: encoder.h ή encoder.pas decoder.h ή decoder.pas Δηεπαθή δηνξζσηή: encoderlib.h ή encoderlib.pas decoderlib.h ή decoderlib.pas Παξάδεηγκα δηνξζσηή: grader.c ή grader.cpp ή grader.pas Τν παξάδεηγκα δηνξζσηή εθηειείηαη ζε δύν μερσξηζηνύο γύξνπο. Σε θάζε γύξν, θαιεί πξώηα ηελ encode κε ηα δεδνκέλα θαη ζηε ζπλέρεηα θαιεί ηελ decode κε ηελ έμνδν πνπ παξήγαγε ε encode. Σηνλ πξώην γύξν, ην παξάδεηγκα δηνξζσηή δελ αιιάδεη ηε ζεηξά ησλ αθεξαίσλ ζην θσδηθνπνηεκέλν. Σην δεύηεξν γύξν, ην παξάδεηγκα δηνξζσηή αληηκεηαζέηεη ηνπο αθεξαίνπο πνπ βξίζθνληαη ζε άξηηεο θαη ζε πεξηηηέο ζέζεηο. Ο πξαγκαηηθόο δηνξζσηήο ζα αλαθαηεύεη ηνπο αθεξαίνπο ηνπ θσδηθνπνηεκέλνπ κελύκαηνο κε νπνηνλδήπνηε ηξόπν. Μπνξείηε λα αιιάμεηε ηνλ ηξόπν κε ηνλ νπνίν ην παξάδεηγκα δηνξζσηή αληηκεηαζέηεη ηα δεδνκέλα, ηξνπνπνηώληαο ηε δηαδηθαζία shuffle (ζηε C/C++) ή Shuffle (ζηελ Pascal). Τν παξάδεηγκα δηνξζσηή επίζεο ειέγρεη ην εύξνο θαη ην κήθνο ησλ θσδηθνπνηεκέλσλ δεδνκέλσλ. Η πξνθαζνξηζκέλε ζπκπεξηθνξά είλαη λα ειέγρεη όηη νη θσδηθνπνηεκέλνη αθέξαηνη είλαη κεηαμύ 0 θαη 65535, ζπκπεξηιακβαλνκέλσλ, θαη όηη ην κήθνο είλαη ην πνιύ 10 N. Μπνξείηε λα αιιάμεηε απηή ηε ζπκπεξηθνξά ηξνπνπνηώληαο ηηο ζηαζεξέο channel_range (π.ρ. από 65535 ζε 255) θαη max_expansion (π.ρ. από 10 ζε 15 ή 7). Παξάδεηγκα εηζόδνπ δηνξζσηή: grader.in.1, grader.in.2,... Σημείωζη: Τν παξάδεηγκα δηνξζσηή δηαβάδεη ηελ είζνδν σο εμήο: Γξακκή 1: N Γξακκή 2: κία ιίζηα N αξηζκώλ: M[0], M[1],..., M[N-1] Αλακελόκελε έμνδνο γηα ην παξάδεηγκα εηζόδνπ δηνξζσηή: grader.expect.1, grader.expect.2,... Γηα ην πξόβιεκα απηό, θάζε έλα από απηά ηα αξρεία πξέπεη λα πεξηέρεη αθξηβώο ην θείκελν Correct. Σειίδα 5 από 5