6. ROČNÍK ŠKOLNÍ SOUTĚŽE V PROGRAMOVÁNÍ – 2013 •
Pořadí úloh si určujete sami, u každé úlohy je uvedeno její bodové hodnocení.
•
Můžete řešit různé úlohy v různých programovacích jazycích.
•
Každou hotovou úlohu raději ihned nahrajte na server: http://www.sspbrno.cz/soutezPRG
•
Při nahrávání volte pozorně číslo úlohy!
•
Nahrávejte vždy jen ZDROJOVÝ KÓD (tj. soubor končící příponou c, cpp, cs, php, java, py)
•
Nahrajte i rozpracované a nedokončené úlohy.
Úloha 1: Bankovní automat (5 bodů) Bankovní automat vám může vydat peníze v různých bankovkách. U bankomatů si už dnes můžete vybrat z několika možností, v jakých bankovkách chcete peníze dostat. Bankomat bude vydávat peníze v bankovkách o hodnotě: 200, 500, 1000, 2000 a 5000. •
Načtěte od uživatele peníze, které chce vybrat (maximálně 10 000).
•
Zkontrolujte, zda je možno tento obnos pokrýt dostupnými bankovkami.
•
Pokud to jde, nabídněte uživateli více možností, jak danou sumu z bankovek poskládat, nejvíce 3 možnosti.
Pravidla: •
Jedna z možností musí obsahovat bankovky s nejnižší možnou hodnotou
•
Jedna z možností musí obsahovat nejvyšší možnou bankovku.
•
Žádné bankovky nebude v žádné volbě více než 5 ks.
U každé z možností bude také uvedeno, kolik jakých bankovek uživatel při dané volbě dostane. Vstupy a výstupy Příklad vstupu 1: 450, Příklad výstupu 1: „nelze“ Příklad vstupu 2: 6900, Příklad výstupu 2: •
výstup 1: 2x200 + 3x500 + 5x1000
•
výstup 2: 2x200 + 1x500 + 3x2000
•
výstup 3: 2x200 + 3x500 + 1x5000
Bodování •
Načtení vstupu a validace vstupu (2 bod)
•
Korektní výstup 1 (1bod)
•
Korektní výstup 2 (1bod)
•
Korektní výstup 3 (1bod)
Školní soutěž v programování 2013
1/5
Úloha 2: Testování spojů (18 bodů) Přístroj pro testování spojů je specifické zařízení, které testuje tištěné spoje a to tím způsobem, že spoj rozdělí na pomyslnou mřížku, kterou potom po částech kontroluje. V každém čtverci dané mřížky otestuje odpor a uloží ho jako hodnotu od 0 do 255. Tato mřížka je vždy o velikosti 8x8. Vaše úloha je následující: 1. Načtěte mřížku ze souboru a vypište ji na monitor tak, abyste mezi hodnotami nechali bílé místo (mezera nebo tabulátor). Výpis bude odpovídat přiloženému souboru. 2. Spoje je možno najít tak, že hodnota v daném čtverci je menší než 30. Je-li hodnota rovna 30 a více, už se nedá počítat s tím, že by to byl spoj. Vypište mřížku na obrazovku tak, aby na místě spoje byla znázorněna 0 a tam, kde není spoj, hodnota 1. 3. Otestujte desku vůči chybám: •
Chyba1 nastane, pokud je čtverec považován za slepý konec. Jinak řečeno, pokud pro daný čtverec, který je považován za spoj neexistují alespoň 2 čtverce v 4-sousednosti, které jsou taktéž spoj. Netestujte řádky a slupce 0 a 7.
•
Chyba2 nastane, pokud je čtverec považován za křižovatku. Jinak řečeno, takový čtverec, který je považován za spoj a má alespoň 3 sousední čtverce v 4-sousednosti, které jsou považovány za spoje. Netestujte řádky a slupce 0 a 7.
4. Spočítejte a tyto informace vypište na obrazovku.: •
počet čtverců, které spoje zabírají
•
celkový odpor spojů
•
průměrný odpor na jeden čtverec spoje
Bodování •
Správné načtení a výpis informací o tištěném spoji. (4 body)
•
Správný výpis očištěného tištěného spoje. (3 body)
•
Nalezení Chyby1. (4 body)
•
Nelezení Chyby2. (4 body)
•
Plocha tištěného spoje (1bod), celkový odpor (1bod), a průměrný odpor (1bod)
Vstupy a výstupy – viz web soutěže Testovací vstup naleznete v souboru silicontest01.txt a výstup v souboru silicontest01_out.txt Testovací vstup naleznete v souboru silicontest02.txt a výstup v souboru silicontest02_out.txt
Školní soutěž v programování 2013
2/5
Úloha 3: Fibonacciho kódování (14 bodů) Fibonacciho posloupnosti čísel vypadá takto: 0 1 1 2 3 5 8 13 21 34 … Počítá se nasledovně: první číslo je 0, druhé je 1 a každé další číslo je součtem dvou předchozích čísel. Věty obsahují jenom znaky z ASCII tabulky, které mají hodnotu mezi 55 a 100 a znak s hodnotou 32 (mezera). Příklad: „JA JSEM JANA“ zakódujeme jako „J@ HV@U K=S8“.
•
První znak bude mít hodnotu písmena „J“ plus poslední číslice prvního čísla fibonačiho posloupnosti, teda 74 + 0. Výsledný kódovaný znak je teda znak s hodnoutou 74 a to je „J“.
•
Druhý znak bude mít hodnotu písmena „A“, teda 65 mínus poslední číslice druhého fibonačiho čísla. 65 - 1 = 64 = „@“.
•
Třetí znak nebudeme kódovat, protože je to mezera a pouze ho přepíšeme. (Bylo by ale použito plus)
•
Čtvrtý znak budeme kódovat. Je to písmeno „J“. Odečteme od něho 2 a dostaneme pismeno „H“.
•
K devátému znaku, což je písmeno „J“ přičteme poslední číslici 9 čísla ve fibonacciho řadě, což je 21, a dostáváme teda 74 + 1= 75 a to je „H“.
Dekódování za pomoci fibonačiho čísel. Dekódování správy pomocí fibonacciho čísel je obdobné kódování. Tam, kde v kódování přípočítáte poslední cifru fibonacciho čísla tak v dekódování odpočítaváte. Tipy Testovací věta má méně než 45 znaků. Nemusíte teda používat datové typy, které jsou schopny jít dál než je číslo 231. Úlohy a bodování •
Před kódováním a dekódováním vypište pomocí funkce prvních 45 fibonacciho čísel. (2 body)
•
Před kódováním a dekódovaním vypište pomocí funkce poslední cifry z prvních 45 fibonacciho čísel. (2 body)
•
Zakódujte větu “DOUFAM ZE SE MI PODARI TUTO ULOHU UDELAT“. (5 body)
•
Dekódujte větu “JHO?N JV IJ XL MYSIKT“. (5 body)
Školní soutěž v programování 2013
3/5
Úloha 4: Trojúhelníky a jejich Obaly (7 bodů) Mějme dvojrozměrnou síť, začínající v bodě (0,0), která pokračuje do kladných čísel. nachází se v ní 2 trojúhelníky. Tyto trojúhleníky jsou definovány jako trojice bodů a každý bod je definován jako dvojice (X,Y) představující jeho pozici na síti. Všechny body jsou definovány jako celá kladná čísla včetně nuly. Viz obrázek. Každý trojúhleník má svou plochu a taktéž má svůj obal. Obal je obdélník nebo čtverec, kterého nejmenší souřadnice na ose X je rovna nejmenší hodnote X bodů trojúhelníku, ke kterému patří. Jeho největší souřadnice je na ose X rovna největší hodnotě X bodů trojúhleníku. Pro souřadnice Y platí obdobné tvrzení.
Popis k obrázku Zelený trojúhelník (vlevo) je definován body (1,2), (1,5) a (3,5). Minimum jeho obalu je na ose X i Y v bodě 1 a maximum na ose X a Y je v bodě 5. Oranžový trojúhelník (vpravo) je definován body (6,3), (4,4) a (6,7). Minimum obalu na ose X je v bodě 4 a na ose Y v bodě 3. Maximum na ose X je v bodě 6 a na ose Y v bodě 7. Tmavá plocha označuje vzájemné překrytí obalů trojúhelníků.
Zadání a hodnocení •
Vypište souřadnice obalových těles (2 body)
•
Zjistěte, jestli se obalová telesa trojúhelníku překrývají. Obalová telesa se nepřekrývají, pokud sdílí pouze hranu nebo bod s hranou nebo body. (2 body)
•
Zjistěte, jaký je obsah překryvu obalových těles. (3 body)
Vstupy programu Vstup nijak nenačítejte a použijte přímo tyto hodnoty: A) Trojúhelník 1: (0,0),(0,5),(4,0); Trojúhelník2: (8,7),(0,3),(2,6) B) Trojúhelník 3: (2,3),(0,4),(5,9); Trojúhelník4: (4,4),(3,3),(6,4) C) Trojúhelník 5: (2,3),(0,4),(5,9); Trojúhelník6: (4,4),(3,3),(6,4) D) Trojúhelník 7: (5,0),(0,1),(6,6); Trojúhelník8: (4,1),(2,2),(3,3) Ukázka výstupu E) Triangle: 1, MaxX: 5, MaxY: 9, MinX: 0, MinY:3 Triangle: 2, MaxX: 6, MaxY: 4, MinX:3, MinY:3 Překryv: true, Velikost: 2
Školní soutěž v programování 2013
4/5
Úloha 5: Kdy to padne? (7 bodů) Mějme server, který má určitou velikost paměti (0 až 231Bytů). Na tomto stroji jsou do paměti nahrány 3 programy, které ihned zaberou určité množství paměti. Jejich další parametry jsou časový úsek (celé kladné číslo, sekundy), po kterém nastane změna množství paměti, kterou program zabere. Velikost této změny je celé kladné číslo. Po nahrání programů do paměti proběhne jejich spuštění. Programy upravují svoje místo v pořadí Program1, Program 2, Program3. Program nemůže mít zápornou hodnotu pro velikost místa, které potřebuje. Více osvětluje graf.
Popis grafu Graf znázorňuje Servr s pamětí 37 Bytů, na kterém jsou následující programy: Program 1: Na začátku zabírá 20 Bytů a každou sekundu se zvětšuje o 1 Byte. Program 2: Na začátku zabírá 5 Bytů a zvětšuje se každou sekundu o 1 Byte. Program 3: Na začátku zabírá 5 Bytů a zvětšuje se každé dvě sekundy o 2 Byty. Paměť nebude stačit ve 3 sekundě a pád servru spůsobý program č. 2, protože se bude snažit překročit množství paměti, kterou je mu servr schopen poskytnout.
Úlohy a bodování •
Zjistěte, ve které sekundě po startu už nebude dostatek místa a celý server spadne. (3 body)
•
Zjistěte, který Program se snažil zabrat místo jako poslední. (2 body)
•
Upravte úlohu tak, aby programy mohly místo i uvolňovat. (2 body)
Tip Na testování programu použijte příklad z grafu. Značka MB znamená MegaByte. 1MB = 1024KB = 1024*1024 Bytů. Vstupy pro základní úlohu Server: 25MB paměti Program 1: 7MB na začátku a zvětšuje se o 256KB každou sekundu. Program 2: 4MB na začátku a zvětšuje se o 128KB každé 3 sekundy. Program 3: 1MB na začátku a zvětšuje se o 2MB každých 8 sekund. Vstupy pro rozšířenou úlohu Server: 1 GB paměti Program 1: 28MB na začátku a zvětšuje se o 256KB každou sekundu. Program 2: 128MB na začátku a zmenšuje se o 256KB každé 2 sekundy. Program 3: 1MB na začátku a zvětšuje se o 3MB každých 8 sekund. Školní soutěž v programování 2013
5/5