Cvičení z programování I pro pokročilé
Ve školním roce 2011/2012 vedeme s Vojtou Tůmou speciální cvičení z předmětu Programování I [NPRG030] pro pokročilé studenty, kteří již nasbírali nějaké zkušenosti z programování (třeba v olympiádách a korespondenčních seminářích) a chtěli by se naučit víc.
Viz též letáček :-)
Cvičení se koná každý čtvrtek od 14:00 v S6, kdo chcete chodit, přihlašte se, prosíme, v SISu, případně nám pošlete mail, pokud vám to SIS nedovolí.
Podmínky k získání zápočtu jsou (AND):
- vypracování domácích úkolů za alespoň 100 bodů
- vypracování zápočtového programu
Kontakt
Svým cvičícím pište na adresu mami@ucw.cz.
Zápočtový program
- Téma: libovolné, jaké si vymyslíte, má-li odpovídající obtížnost. Pokud vás ještě múza nepolíbila, podívejte se na náš seznam témat (na skladě též zdrojový text v TeXu a pěkně vysázená verze v PDF); přiměřené pro zimní semestr jsou úlohy obtížnosti 3 a vyšší. Jinými zajímavými zdroji inspirace mohou být: archiv programátorského korespondenčního semináře a archiv Matematické Olympiády kategorie P.
- Jazyk: nejlépe Pascal nebo C; pokud máte dobrý důvod použít něco jiného, ozvěte se, lze se domluvit.
- Odevzdání specifikace programu do konce listopadu. Tím máme na mysli krátký popis toho, co všechno by program měl umět. Vyhnete se tak tomu, že by váš zápočtový program odevzdaný den před koncem zkouškového období byl odmítnut jako příliš triviální nebo příliš podobný programu někoho z vašich kolegů.
- Nedílnou součástí zápočtového programu je dokumentace, a to jak uživatelská (vysvětující, jak se program ovládá), tak programátorská (ta popisuje, jak program uvnitř funguje; postrádá smysl popisovat každou funkci či proměnnou, zaměřte se spíš na celkový návrh programu a použité algoritmy, pokud jste je sami nevymysleli, je moudré uvést odkazy na zdroje, z nichž jste čerpali).
- Specifikaci i dokumentaci odevzdávejte buďto v papírové podobě nebo chcete-li šetřit naše lesy, elektronicky v libovolném otevřeném formátu (tím se myslí formát, jehož struktura je všeobecně známa a na jehož prohlížení není potřeba žádný komerční software; speciálně tedy ne MS Word!), nejlépe jako čistý text, HTML, PostScript či PDF.
- Hotový program nám mužete předat buďto na cvičení nahraný na CD či v lahvi (totiž USB flašce)
nebo jej poslat po Internetu, buďto e-mailem nebo (pokud je poněkud
větších rozměrů, řekněme nad 0.5MB) uploadem do
ftp://atrey.karlin.mff.cuni.cz/pub/priv/p1x/
(ale pak pošlete mail se jménem souboru). Pokud se zápočťák skládá z většího množství souborů, raději jej předtím zabalte ZIPem nebo TARem (RAR, prosím, ne). - Zápočtový program musí mít přiměřeně ošetřené vstupy. Tím se myslí, že komunikuje-li s uživatelem, měl by počítat s tím, že uživatel je nešika a občas zadá špatný vstup a nenechat se tím zmást a bez zaváhání je odmítnout. Naopak, pokud programujete knihovnu funkcí, můžete předpokládat, že všechny vstupy jsou korektní.
Domácí úkoly
Domácí úkoly jsou dvou druhů:
- Praktické – odladěné programy řešící jednoduché problémy. Odevzdávají se do CodExu, který je automaticky testuje. Jakmile si v CodExu založíte účet (pokud možno si jako kroužek nastavte 99), napište nám a my vás přidáme do naší skupiny I99 a uvidíte všechny již zadané úlohy. Pozor, některé úlohy bude možné řešit pouze nějakou dobu (např. měsíc) po zadání.
- Teoretické – těžší problémy, kde jde daleko víc o efektivní algoritmus než implementační detaily. Řešení nám posílejte mailem, a to buď v těle zprávy nebo jako textovou přílohu. U některých úkolů je v hranatých závorkách zmíněna časová složitost, které (případně lepší) byste měli dosáhnout.
Na získání kýžené stovky bodů bohatě stačí praktické úlohy, pokud je řešíte včas.
Teoretické úkoly
Datum | ID | Body | Příklady |
---|---|---|---|
6. 10. | funf | 5 | Co dělá funkce f() z letáčku? |
funb | 5 | Co dělá funkce bc() z letáčku? | |
2mis | 15 | Princezně se rozsypaly perly z náhrdelníku (očíslované 1 až N) a dvě z nich se ztratily. Jak v lineárním čase a konstantní paměti zjistit, které? | |
20. 10. | ndpx | 15 | Vymyslete n-rozměrnou variantu prefixových součtů, tedy strukturu, která si pro n-rozměrnou matici v lineárním čase něco předpočítá a pak bude umět v konstantním čase vypočíst součet libovolné n-rozměrné souvislé podmatice. Předpokládejte, že n je konstanta. |
15. 12. | gseq | 7 | Vymyslete algoritmus, který vypíše všechny posloupnosti n nul a jedniček v takovém pořadí, aby se každé dvě sousední lišily jen na jedné pozici. |
gsek | 13 | Jak vypsat posloupnosti n nul a jedniček s právě k jedničkami v takovém pořadí, aby se dvě sousední lišily na právě dvou pozicích? | |
5. 1. | pcol | 11 | Uvažujme algoritmus pro barvení rovinných grafů s očíslovanými vrcholy: na počátku nemá žádný vrchol barvu; pak vždy vybereme vrchol, který má nejvýše 5 neobarvených sousedů (pokud jich je více, tak vítězí vrchol s nejmenším pořadovým číslem), a přidělíme mu nejmenší barvu, kterou nepoužívají jeho sousedé. Dokažte, že pro každé K existuje rovinný graf, na jehož obarvení tento algoritmus spotřebuje alespoň K barev. |
Co jsme dělali
datum | co se cvičilo |
---|---|
6. 10. |
Pár příkladů na úvod:
|
13. 10. | Úlohy o posloupnostech: dvojice s daným součtem, úsek s daným součtem. |
20. 10. | Ještě posloupnosti: úsek se součtem co nejbližším zadanému, nejdelší vyvážený úsek. Největší nulová podmatice. 2D prefixové součty. |
27. 10. | Nejdelší rostoucí podposloupnost. Házíme vajíčka. Kompromisy mezi časem a pamětí: spočtěte všechna yk = x1 * … * xk-1 * xk+1 * … xn (kde * je nějaká asociativní operace). |
3. 11. | RGB třídění (ladění konstant a též verze pro k barev). Šroubky a matičky aneb o síle randomizace. Míchání karet. |
10. 11. | Módní přehlídka třídících algoritmů. Operace s haldou. Třídíme posloupnost obsahující jen O(log n) různých čísel. Nebo jen celá čísla z rozsahu 1 až n2. Střílíme po billboardech. Budou volby… |
17. 11. | Cvičení se nekoná, slavíme 2002. narozeniny císaře Vespasiana (mimo jiné). |
24. 11. | Prohledávání grafů, Dijkstrův algoritmus a přihrádkové struktury. Agenti a jejich šéf, stoky a jejich strážníci (jak hlídat každou stoku, jak kontrolovat mafiány, kolika způsoby to jde). |
1. 12. | Šéf agentů na mnoho způsobů. |
8. 12. | O stromech a mafiánech. Asfaltéři v neorientovaném městě. |
15. 12. |
Generování všech objektů s danou vlastností:
|
22. 12. | Generování, ranky a unranky. |
5. 1. | Symetrická orientace grafu se sudými stupni, dělení stupňů a párovaní v 2k-regulárním bipartitním grafu. Barvení rovinných grafů 6 a 5 barvami. |
12. 1. | Jeřábníkův problém. Co když je jeřáb strom? Kdy se jeřáb protne? |