Papegojor Yanee är fågelentusiast. Sedan hon läst om IP over Avian Carriers (IPoAC), har hon spenderat mycket tid med att träna en flock papegojor att leverera meddelanden över långa avstånd. Yanees dröm är att använda fåglarna för att skicka ett meddelande M till ett land långt bort. Hennes meddelande M är en följd av N (inte nödvändigtvis olika) heltal, alla från 0 till 255. Yanee har K tränade papegojor. Alla papegojor ser likadana ut, Yanee kan inte skilja på dem. Varje fågel kan komma ihåg ett heltal från 0 till R. Inledningsvis provade Yanee en väldigt enkel metod för att skicka ett meddelande. Hon släppte ut fåglarna en i taget. Innan fågeln flög iväg tilldelade hon den nästa tal i följden. Olyckligtvis fungerade inte det, eftersom fåglarna inte kom fram i samma ordning som de skickades iväg. Yanee kunde således skicka över alla talen i följden, men inte i rätt ordning. Yanee behöver en bättre metod, och det är där du kommer in. Hon vill att du skriver ett program som utför två operationer: Ditt program ska kunna läsa ett meddelande M och transformera det till en följd av K heltal mellan 0 och R som hon kommer att tilldela fåglarna, som tidigare. Ditt program ska också kunna läsa en lista med heltal mellan 0 och R och transformera det tillbaka till det ursprungliga meddelandet M. Du kan anta att papegojorna alltid kommer fram, och att de kommer ihåg det tal de blev tilldelade. De kan dock komma fram i godtycklig ordning. Observera att Yanee bara har K papegojor, så följden av heltal mellan 0 och R som du ska producera kan innehålla högst K heltal. Din uppgift Implementera två funktioner. En används av avsändaren (encode) och den andra av mottagaren (decode). Processen visas nedan. De två funktioner du ska skriva är: Funktionen encode(n,m) som tar följande parametrar: N meddelandets längd. M en en-dimensionell lista med N heltal, d.v.s. meddelandet. Du kan anta att 0 M[i] 255 för 0 i < N. Funktionen måste koda meddelandet M till en följd av heltal mellan 0 och R, som ska skickas ut med papegojorna. För att ange vilken följd som ska användas ska funktionen anropa send(a) för varje heltal a som du vill ge till en papegoja. Sida 1 av 5
Funktionen decode(n,l,x) som tar följande parametrar: N längden på det ursprungliga meddelandet. L längden på det mottagna meddelandet (antalet fåglar). X en en-dimensionell lista med L de mottagna talen. Talen X[i] (för 0 i < L) är precis de tal som din funktion encode producerade, men i annan ordning. Funktionen måste återskapa det ursprungliga meddelandet. För att returnera svaret måste din funktion anropa output(b) för varje tal b i det avkodade (ursprungliga) meddelandet, i rätt ordning. För att korrekt lösa en given deluppgift måste din funktion uppfylla följande villkor: Alla heltal skickade från din procedur måste ligga i intervallet angiven i deluppgiften. Antalet anrop funktionen encode anropar funktionen send får inte överstiga K angiven i deluppgiften. Var vänlig att observera att K beror på längden på meddelandet. Funktionen decode måste korrekt återskapa originalmeddelandet M och anropa funktionen output(b) exakt N gånger, med b lika med M[0], M[1],..., M[N-1], respektive. I sista deluppgiften varierar din poäng beroende på kvoten mellan längderna på det kodade meddelandet och originalmeddelandet. Exempel Betrakta fallet där N = 3, och 10 M= 30 20 Funktionen encode(n,m), som använder någon skum metod, kodar meddelandet till en sekvens av heltal (7, 3, 2, 70, 15, 20, 3). För att rapportera sekvensen, anropas funktionen send enligt följande: send(7) send(3) send(2) send(70) send(15) send(20) send(3) När alla papegojor anlänt till destinationen, anta att vi får följande lista heltal: (3, 20, 70, 15, 2, 3, 7). Funktionen decode kommer bli anropad med N=3, L=7, och X= 3 20 70 15 2 3 Sida 2 av 5
Funktionen decode ska återskapa originalmeddelandet (10, 30, 20). Den rapporterar sitt result genom anrop till funktionen output enligt följande: output(10) output(30) output(20) Deluppgifter Deluppgift 1 (17 poäng) N = 8, och varje heltal i vektorn M är antingen 0 eller 1. Varje kodat heltal måste ligga i intervallet från 0 till R=65535, inklusive. Deluppgift 2 (17 poäng) 1 N 16. Varje kodat heltal måste ligga i intervallet från 0 till R=65535, inklusive. Deluppgift 3 (18 poäng) 1 N 16. Deluppgift 4 (29 poäng) 1 N 32. Sida 3 av 5
Deluppgift 5 (up to 19 poäng) 16 N 64. Antalet tillåtna anrop till funktionen send är max K=15 N. Viktigt: poängen för den här deluppgiften beror på kvoten mellan längden på det kodade meddelandet och originalmeddelandet. För ett givet testfall t i den här deluppgiften, låt Pt=Lt/Nt vara kvoten mellan längden Lt av det kodade meddelandet och längden Nt av originalmeddelandet. Låt P vara maximum of alla Pt. Din poäng för denna deluppgift bestäms enligt följande regler: Om P 5, får du alla 19 poäng. Om 5 < P 6, får du 18 poäng. Om 6 < P 7, får du 17 poäng. Om 7 < P 15, blir din poäng 1 + 2 (15 - P), avrundat neråt till närmaste heltal. Om P > 15 eller om någon av dina outputs är felaktiga får du 0 poäng. Implementationsdetaljer Gränser Rättarmiljön: I den riktiga rättarmiljön kommer din inskickning bli kompilerad till två program e och d som körs separat. Både encoder- och decoder modulen kommer bli länkade till varje program, men e anropar enbart encode och d anropar enbart decode. CPU-tidsgräns: Program e kommer göra 50 anrop till funktionen encode och ska köra under 2 sekunder. Program d kommer göra 50 anrop till funktionen decode och ska köra under 2 sekunder. Minnesgräns: 256 MB Observera: Det finns ingen explicit gräns för stackstorleken. Stacken räknas in i det totala minnesanvändandet. Gränssnitt (API) Implementationskatalog: parrots/ Att implementeras av den tävlande: encoder.c eller encoder.cpp eller encoder.pas decoder.c eller decoder.cpp eller decoder.pas Observera för C/C++ programmerare: både i exempelrättaren och i den riktiga rättaren länkas encoder.c[pp] och decoder.c[pp] tillsammans med rättaren. Därför ska du deklarera alla globala variabler inuti varje fil som static för att förhindra dem från att krocka med variabler från andra filer. Gränssnitt för tävlande: encoder.h eller encoder.pas decoder.h eller decoder.pas Sida 4 av 5
Rättargränssnitt: encoderlib.h eller encoderlib.pas decoderlib.h eller decoderlib.pas Exempelrättaren: grader.c eller grader.cpp eller grader.pas Exempelrättaren exekverar två separata omgångar. I varje omgång anropas först encode med den givna datan, och sedan anropas decode med utdatan som funktionen encode producerade. I första omgången ändras inte ordningen på heltalen i det kodade meddelandet. I andra omgången byter exempelrättaren plats på heltalen på udda och jämna positioner. Den riktiga rättaren kommer göra en mängd olika permutationer på det kodade meddelandet. Du kan ändra hur exempelrättaren blandar datan genom att modifiera funktionen shuffle (i C/C++) eller Shuffle (i Pascal). Exempelrättaren kontrollerar dessutom både storleken och längden på den kodade datan. Som default kontrollerar den att den kodade datan ligger i intervallet 0 till 65535, inklusive, och att längden är max 10 N. Du kan ändra detta genom att justera konstanterna channel_range (från 65535 till 255, t.ex.) och max_expansion (från 10 till 15 eller 7, t.ex.). Indata till exempelrättaren: grader.in.1, grader.in.2,... Observera: Exempelrättaren läser indata i följande format: Linje 1: N Linje 2: en lista med N heltal: M[0], M[1],..., M[N-1] Förväntad utdata från exempelrättaren: grader.expect.1, grader.expect.2,... För den här uppgiften ska alla filer bestå av texten Correct. Sida 5 av 5