International Olympiad in Informatics July 2011, Pattaya City, Thailand Soutěžní úlohy Den 2 Czech 1.3. Papoušnet

Podobné dokumenty
63. ročník Matematické olympiády 2013/2014

International Olympiad in Informatics 2013

Popis programu EnicomD

Je to SMTP a POP3 server který spolupracuje s GSM branami Alphatech. Převádí SMS zprávy na y a y na SMS zprávy.

NPRG030 Programování I, 2015/16 1 / :25:32

Sdílení dat mezi podprogramy

nadstavbový modul programu Amicus

Popis funkcí a parametrů programu. Reliance External communicator. Verze 1.5.0

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

TÉMATICKÝ OKRUH Softwarové inženýrství

Více o konstruktorech a destruktorech

Činnost počítače po zapnutí

Geis Point Plugin Map

61. ročník Matematické olympiády 2011/2012

Datové struktury 2: Rozptylovací tabulky

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

ALGORITMIZACE A PROGRAMOVÁNÍ

Programovací jazyk Pascal

1/1 ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA V PRAZE PROVOZNĚ EKONOMICKÁ FAKULTA PŘIJÍMACÍ ŘÍZENÍ 2017/2018

BM Software, Němčičky 84, Němčičky u Břeclavi. Převody přesčasů / nedočasů v systému Docházka 3000

Algoritmizace a programování

Cvičení č. 3. Sdílené prostředky a synchronizace Program Banka. 4 body

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Faxový server společnosti PODA s.r.o.

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

KTE/TEVS - Rychlá Fourierova transformace. Pavel Karban. Katedra teoretické elektrotechniky Fakulta elektrotechnická Západočeská univerzita v Plzni

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Zadání soutěžních úloh

Vyčtení / zapsání hodnot z/do OMC8000 pomocí protokolu UDP

6. ROČNÍK ŠKOLNÍ SOUTĚŽE V PROGRAMOVÁNÍ 2013

1. DATOVÉ SCHRÁNKY OBECNÝ PŘÍSTUP K DATOVÉ SCHRÁNCE DATOVÉ ZPRÁVY... 3

Vzhled a popis hlavních funkcí systému SMSbrána.cz

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Struktura programu v době běhu

Svolávací systém Uživatelský manuál

Docházkový systém modul E-PORTÁL

67. ročník Matematické olympiády 2017/2018

Programování II. Modularita 2017/18

Manuál pro práci s modulem Otázky a odpovědi

KRY. Projekt č. 2. Kamil Dudka xdudka00

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Dokumentace. k modulu. podnikový informační systém (ERP) Datové schránky

Časová a prostorová složitost algoritmů

DUM 06 téma: Tvorba makra pomocí VBA

dovolují dělení velkých úloh na menší = dekompozice

ZAMĚSTNANECKÝ PORTÁL nastavení a práce v ESO9 PAM

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

Způsoby realizace této funkce:

Prohledávání do šířky = algoritmus vlny

Manuál k e-learningovému vzdělávacímu modulu 1 MODUL HIGH-TECH POTRAVINY. Popularizace zdraví Po.Zdrav (CZ.1.07/3.1.00/ )

Doklady, u kterých dodavatelé použijí ustanovení 92a zákona o DPH, je třeba do programu zapsat následovně:

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Korespondenční Seminář z Programování

Hodnocení soutěžních úloh

Internetový obchod ES Pohoda Web Revolution

Základní komunikační operace

Procesy a vlákna (Processes and Threads)

PROGRAM SKYPE. Návod Skype. VERZE NÁVODU A PROGRAMU VYUŽITÍ PRO V TOMTO NÁVODU SE NAUČÍTE. STÁHNUTÍ A INSTALACE

Testování prvočíselnosti

Ethernetový komunikátor ETH-BOX1

MATEMATIKA A Metodický list č. 1

Dynamické programování

Manuál SQL Ekonom funkce pro zajištění souladu s ochranu osobních údajů podle GDPR

Uživatelský manuál. KNXgw232

Návod pro rodičovský portál systému Edookit

Nastavení přístupových práv terminálů BM-Finger na čipování docházky a otevírání dveří

Základy objektové orientace I. Únor 2010

Mocniny. Nyní si ukážeme jak je to s umocňováním záporných čísel.

Konstruktory a destruktory

59. ročník Matematické olympiády 2009/2010

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Podmíněný příkaz

Práce s bankovními výpisy

NÁVOD NA PRÁCI S E-LEARNINGOVÝMI OPORAMI

Operační systémy 2: Zápočtové úkoly

Bc. Martin Majer, AiP Beroun s.r.o.

68. ročník Matematické olympiády 2018/2019

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Paměť počítače. alg2 1

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

Prosím mějte na paměti, že z bezpečnostních důvodů byste měli změnit Internetový přístupový kód každých 60 dní.

Postup nastavení bezpečné ové schránky pro zákazníky Logicentra

IB112 Základy matematiky

ezkouška požadavky na IT

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Úvod. Programovací paradigmata

Sada zásuvných modulů pro práci s daty vektorové katastrální mapy

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Data Transfer Software

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Zaměstnanecký portál nastavení a práce v ESO9 PAM

Jazz Server osobní nastavení uživatele

Kombinatorika, výpočty

Modul Účetní centrála Efektivní řešení pro přenos dokladů mezi účetními firmami a jejich klienty

Obsah. Kapitola 1 Začínáme s jazykem ABAP a systémem SAP Přehled architektury systému SAP...16

Příručka uživatele HELPDESK GEOVAP

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

e-learningový systém EDU

Návrh a management projektu. Řízení a koordinace projektu

Návod k používání služeb na portálu SMSbrána.cz.

Transkript:

Papoušnet Není většího ptačího nadšence, než Yanee. Není tedy divu, že poté, co si přečetla článek IP over Avian Crarriers (IPoAC), se bezhlavě vrhla do výcviku hejna papoušků, kteří by efektivně nahradili její stávající pomalé internetové připojení. Aby toho mohla dosáhnout, potřebuje pomocí papoušků umět přenést zprávu M, která se skládá z posloupnosti N (ne nutně různých) celých čísel v intervalu 0 až 255 včetně. Dosud se jí podařilo vycvičit K papoušků, kteří se umí naučit papouškovat libovolné číslo v intervalu 0 až R včetně. Nejdříve vyzkoušela brát jednotlivé papoušky, každého naučit papouškovat odpovídající číslo ze zprávy, a vyslat je do cíle v pořadí, které odpovídá pořadí čísel ve zprávě. Bohužel se ukázalo, že tento postup nefunguje. Papoušci sice do cíle dorazili, ale ne v tom pořadí, v jakém je Yanee vypustila. Takže ačkoliv bylo možné zrekonstruovat všechna čísla původní zprávy, nebylo možné zrekonstruovat jejich pořadí. Nezbývá jí tedy nic jiného, než vymyslet lepší postup. Resp. nechat si od vás lepší postup poradit. Nerada by ale papoušky přeučovala to, co už umí, takže by potřebovala program, který provádí dvě samostatné operace: První operace by měla umět přečíst zprávu M a transformovat ji do posloupnosti nejvýše K celých čísel v intervalu 0 až R včetně, která pak naučí jednotlivé papoušky papouškovat. Druhá operace by měla umět přečíst seznam celých čísel v intervalu 0 až R včetně tak, jak byla nadiktována papoušky v místě jejich příletu, a převést tento seznam zpět na původní zprávu M. Můžete předpokládat, že každý vypuštěný papoušek vždy dorazí do cíle a že přenese právě to číslo, které se naučil. Papoušci ale mohou do cíle přilétat v jakémkoliv pořadí. Připomeňme, že Yanee má pouze K papoušků, takže sekvence celých čísel v intervalu 0 až R včetně, kterou odešlete, musí být dlouhá nejvýše K. Váš úkol Naimplementujte dvě samostatné procedury. Jedna z nich bude použita pro odesílání zpráv jako enkodér a druhá pro jejich příjem jako dekodér. Celý proces je zachycen na následujícím obrázku: Vaším úkolem je naimplemetovat následující procedury: encode(n, M) s následujícími parametry: Strana 1 z 5

N délka zprávy. M jednorozměrné pole celých čísel reprezentující zprávu. Můžete předpokládat, že pro všechna i (0 i < N) platí, že 0 M[i] 255. Tato procedura musí zakódovat zprávu M do posloupnosti celých čísel v intervalu 0 až R včetně, která bude přenesena pomocí papoušků. Pro odeslání této sekvence musí procedura encode volat proceduru send(a) pro každé číslo, které si přejete poslat po některém z papoušků. decode(n, L, X) s následujícími parametry: N délka původní zprávy. L počet čísel, která byla přijata (resp. počet papoušků, které Yanee vypustila). X jednorozměrné pole L celých čísel, reprezentující přijatá čísla. Čísla X[i] (0 i < L) jsou stejná čísla, která odeslala vaše procedura encode, ale mohou být ve zcela odlišném pořadí. Tato procedura musí zrekonstruovat původní zprávu. Pro výpis této zprávy musí vaše procedura volat proceduru output(b), pro každé celé číslo b v původní zprávě, tato volání musí být samozřejmě ve správném pořadí. Všimněte si, že čísla R ani K nejsou předána jako parametry, viz popis jednotlivých podúloh. Pro korektní vyřešení daných podúloh, musí vaše procedury splňovat následující podmínky: Všechna čísla odeslaná procedurou encode musí být v rozsahu, který je specifikovaný v podúloze. Počet volání funkce send nesmí překročit limit K specifikovaný v podúloze. Připomeňme, že K závisí na délce zprávy. Procedura decode musí správně zrekonstruovat původní zprávu M a počet volání procedury output(b) musí být přesně N s tím, že b je postupně rovné číslům M[0], M[1],..., M[N-1]. V poslední podúloze závisí přidělený počet bodů na poměru mezi počtem papoušků potřebných na přenos zprávy a délkami těchto zpráv. Příklad Uvažute případ, kdy N = 3, M= 10 30 20 Procedura encode(n,m), za pomocí černé magie a několika kouzelných krabiček, může enkódovat zprávu do posloupnosti čísel (7, 3, 2, 70, 15, 20, 3). Pro odeslání této posloupnosti by tedy měla zavolat proceduru send následovně: send(7) send(3) Strana 2 z 5

send(2) send(70) send(15) send(20) send(3) Jakmile všichni papoušci dosáhnou cíle, dostaneme např. následující seznam přijatých čísel: (3, 20, 70, 15, 2, 3, 7). Procedura decode poté bude zavolána s parametry N=3, L=7, X= 3 20 70 15 2 3 7 Procedura, tentokrát pomocí bílé magie a několika křišťálových koulí, zrekonstruuje původní zprávu (10, 30, 20) a odešle ji na výstup pomocí následujících volání procedury output: output(10) output(30) output(20) Podúlohy Podúloha 1 (17 bodů) N = 8 a každé číslo v poli M je 0 nebo 1. Každé odeslané číslo musí být v intervalu 0 až R=65535 včetně. Podúloha 2 (17 bodů) 1 N 16 Každé odeslané číslo musí být v intervalu 0 až R=65535 včetně. Podúloha 3 (18 bodů) 1 N 16 Strana 3 z 5

Podúloha 4 (29 bodů) 1 N 32 Podúloha 5 (až 19 bodů) 16 N 64 Počet volání procedury send musí být nejvýše K=15 N. Důležité: Přidělený počet bodů za tuto podúlohu závisí na poměru mezi počty volání procedury send a délkami odpovídajících zpráv. Pro každý testovací vstup t v této podúloze označme jako Pt=Lt/Nt poměr mezi počtem volání procedury send Lt a délkou původní zprávy Nt. Dále označme jako P maximum ze všech Pt. Celkový bodový zisk bude určen následujícími pravidly: Pokud P 5, dostanete plný počet bodů, tj. 19 bodů. Pokud 5 < P 6, dostanete 18 bodů. Pokud 6 < P 7, dostanete 17 bodů. Pokud 7 < P 15, dostanete 1+2 (15-P) bodů. Počet bodů bude zaokrouhlen dolů k nejbližšímu celému číslu. Pokud P > 15 nebo jakýkoliv z výstupů bude nesprávný, dostanete 0 bodů. Důležité: Jakékoliv korektní řešení pro podúlohy 1 až 4 vyřeší správně i všechny předchozí podúlohy. To ale, kvůli vyšší hranici pro K, neplatí pro podúlohu 5, neboť korektní řešení pro tuto podúlohu nemusí být schopné vyřešit podúlohy 1 až 4. Je ale možné vyřešit všechny podúlohy jedním programem. Implementační detaily Limity Vyhodnocovací prostředí: Ve skutečném vyhodnocovacím prostředí bude vaše řešení přeloženo do dvou programů e a d a ty budou spuštěny odděleně. Moduly encoder i decoder budou slinkovány dohromady, ale pouze e zavolá metodu encode a pouze d zavolá decode. Časový limit: Program e zavolá 50krát proceduru encode a měl by skončit do 2 sekund. Program d zavolá 50krát proceduru decode a měl by skončit do 2 sekund. Paměťový limit: 256 MB Poznámka: Není žádný explicitní limit pro velikost zásobníku programu. Jeho velikost se počítá do celkově spotřebované paměti. Rozhraní (API) Složka s implementací: parrots/ Strana 4 z 5

Účastníci mají implementovat: encoder.c nebo encoder.cpp nebo encoder.pas decoder.c nebo decoder.cpp nebo decoder.pas Poznámka pro programátory v C/C++: v ukázkovém i ve finálním vyhodnocovači jsou encoder.c[pp] i decoder.c[pp] slinkovány dohromady s vyhodnocovačem. Proto byste měli všechny globální proměnné v každém zdrojovém souboru deklarovat jako statické, abyste předešli pomíchání proměnných z různých souborů. Rozhraní pro účastníky: encoder.h nebo encoder.pas decoder.h nebo decoder.pas Rozhraní vyhodnocovače: encoderlib.h nebo encoderlib.pas decoderlib.h nebo decoderlib.pas Ukázkový vyhodnocovač: grader.c nebo grader.cpp nebo grader.pas Ukázkový vyhodnocovač provádí dva kroky. V každém kroku zavolá encode se vstupními daty a následně zavolá decode s daty, která encode odeslala. V prvním kroku pořadí odeslaných čísel nemění, zatímco ve druhé navzájem prohodí odeslaná čísla na sudý a lichých pozicích. Skutečný vyhodocovač provádí různé druhy permutací nad odeslanými čísly. Samozřejmě můžete libovolně měnit způsob, kterým se permutace dat v ukázkovém vyhodnocovači provádí editací procedury shuffle (v C/C++) resp. Shuffle (v Pascalu). Ukázkový vyhodnocovač rovněž kontroluje rozsah i délku odeslaných dat. Implicitně kontroluje, zda jsou všechna odeslaná čísla v rozsahu 0 až 65535 a zda je jejich počet nejvýše 10 N. Toto chování může změnit editací konstant channel_range (např. z 65535 na 255) a max_expansion (např. z 10 na 15 nebo 7). Ukázkové vstupy pro vyhodnocovač: grader.in.1, grader.in.2,... Poznámka: Ukázkový vyhodnovač čte vstupy v následujícím formátu: Řádek 1: N Řádek 2: Seznam N čísel M[0], M[1],..., M[N-1] Očekávaný výstup pro vzorové vstupy je v souborech: grader.expect.1, grader.expect.2, V této úloze každý z těchto souborů obsahuje text Correct.. Strana 5 z 5