Utolsó módosítás: 2008. december 8.
Mivel nem raktam fel időben házi feladatokat, szerintem az lesz a legjobb, ha azt mondom: ebből a feladatsorból nincsen kötelező feladat, viszont pontért (jobb osztályzatért) be lehet adni belőle feladatokat. Változás: december 15.-ig még beadhatod a feladatot, hogy a félévközi jegybe beszámítson.
Figyelem: kiraktam egy harmadik feladatot is a feladatsor aljára.
Az összes nyilvános példa bemenetet és kimenetet (a heti mintafeladatokéval) egyben le lehet tölteni:
Ez a feladat a 2. mintafeladatsor 6. feladatának (feladatok sorbarendezése) folytatása. Meg van adva egy bonyolultabb feladat (például egy ház építése) részfeladatokra osztva, minden részfeladathoz adott a részfeladat neve, az elvégzéséhez szükséges napok száma, és az előkövetlemény részfeladatok nevének listája. Olyan programot kell írnia, amely minden részfeladathoz kitalálja, mikor lehet legkorábban elkezdeni.
Ott kezdjük, ahol a mintafeladatban abbahagytuk, tehát ennek a feladatnak a bemenete az előző feladat kimenete lesz, így a bemenetben már minden feladat csak később szerepel, mint az összes előkövetelménye.
A bemenetben minden sor első szava a részfeladat neve, a második szó az erre a feladatra szükséges napok száma, végül az összes többi szó azon feladatok nevét adja meg, amiket ennek a feladatnak az elkezdése előtt be kell fejezni. A kimenetben ugyanolyan sorrendben és majdnem ugyanilyen formában kell kiírni a feladatokat, csak minden sor elejére be kell szúrni a feladat elkezdésének időpontját (és egy szóközt).
A 0 időpontnál hamarabb semmit nem lehet dolgozni. Ha egy feladat előkövetelménye egy másiknak, akkor a másodikat nem lehet korábban elkezdeni előbb, mint amikor az első feladatot befejezzük. Az időpontokat a hosszusággal azonos mértékegységben mérjük. Minden feladatot a lehető leghamarabbi időpontban kell elkezdeni úgy, hogy a fenti két szabályt betartjuk.
Íme egy példa. Legyen a bemenet a következő.
engedely 5 teto 3 teveantenna 13 teto ablakok 14 udvar 3 ablakok teto mosdo 16 ablakok teto teveantenna udvar kabelek 23 ablakok teto teveantenna udvar mosdo vakolat 1 ablakok
Ekkor a kimenet ez lesz.
0 engedely 5 0 teto 3 3 teveantenna 13 teto 0 ablakok 14 14 udvar 3 ablakok teto 17 mosdo 16 ablakok teto teveantenna udvar 33 kabelek 23 ablakok teto teveantenna udvar mosdo 14 vakolat 1 ablakok
Mivel az engedély és a tető nem függ semmitől, ezeket azonnal el kell kezdeni a 0 időpontban. A tetőt 3 napig tart felhúzni, és a 0 időpontban kezdik, ezért a 3 időpontban elkészül. Ekkor kezdhetjük el a tévéantenna felszerelését, tehát a tévéantenna sorában elől 3 áll.
Az ablakokat is azonnal elkezdjük berakni a 0 időpontban, mert ennek sincs előkövetelménye, így ez a 14. napon készül el. Ekkor kezdhetünk el vakolni, tehát a vakolat sora előtt 14 áll. Másrészt az udvart csak akkor kezdhetjük el rendberakni, ha mind az ablakok, mind a tető kész. Az ablakok a 14. napon elkészülnek, a tető pedig ekkor már rég kész, tehát az udvarral a 14. napon kezdünk el foglalkozni, és 3 nap múlva, a 17. napon lesz kész.
A mosdó már érdekesebb eset: ehhez kellenek az ablakok (a 14. napon készül el), a tető (a 3. napon), a tévéantenna (a 16. napon lesz kész), és az udvar (a 17. napon kész), tehát a mosdót a 17. napon kezdjük el építeni, és ezt írjuk ki a mosdó sora elé. Hasonlóan töltjük ki a maradék két sort is.
A bemeneten csak annyiban változtasson, hogy minden sor elé beszúrja a megfelelő pozitív számot, és egy szóközt. A sorok sorrendjét ne rendezze át, sem az egyes sorokban a függőségek sorrendjét. Így minden bemenethez csak egy helyes kimenet van. (Felteheti, hogy a bemenetben minden sor szavai között pontosan egy szóköz van, és a végén nincs szóköz, de minden sor végén van újsor jel.)
A program megírásához néhány tanács. A bemenet sorait a 6. mintapéldához hasonlóan a split metódussal törjük szavakká. A második szóból (a feladat hosszából) az Integer függvénnyel csináljunk egész számot: ennek a függvénynek egyetlen argumentuma egy sztring ami egy egész számot ír le számjegyekkel, kimenete egy egész szám. A sorokon egyesével menjünk végig, mindegyikhez írjuk ki a megfelelő kimenetet, mielőtt a következő sort beolvassuk. Hozzunk létre egy asszociatív tömböt, amiben a kulcsok az eddig látott feladatok nevei, az értékek a feladat befejezésének ideje. Ha a kezdési időpontot kiszámítottuk egész számként, akkor a to_s metódussal kaphatunk sztringet belőle, amit kiírhatunk, ha a + operátorral a egy szóköz és a bemeneti sor elé fűzzük.
Íme még pár bemenet és kimenet. Próbáljuk a nagyobbakon is ellenőrizni a programot, mint például ruby s2f0.rb < s2f0be6 | diff -s - s2f6ki6.
Ez a feladat a 0. feladat folytatása. A programnak azt kell megállapítania, melyik részfeladatokkal nem szabad késnünk, ha egy bizonyos részfeladatot el akarunk kezdeni időben.
A program bemenete a 0. feladatban megírt program kimenete. Minden sornak megfelel egy sor a kimenetben. A kimenet sorának első szava a megfelelő feladat neve. Ez után néhány szó áll, amik pontosan azon feladatok neveit adják meg, amivel ha egy kicsit is késünk (és a többi feladatot nem tudjuk a tervezettnél gyorsabban megoldani), akkor nem tudjuk a kiszámított időben elkezdeni azt a feladatot, amihez a sor tartozik. Ezeket a szavakat olyan sorrendben kell kiírni, amilyen sorrendben a megfelelő feladatok a bemenetben szerepelnek.
Íme egy példa. A bemenet:
0 teto 2 0 ajto 1 0 ablak 2 2 butor 1 ajto ablak teto 3 bekoltozes 1 butor
A kimenet:
teto ajto ablak butor teto ablak bekoltozes teto ablak butor
Tehát a bútorokat nem tudjuk a 2. napon elkezdeni berakni akkor, ha a tetőt vagy az ablakot későn fejezzük be, de az ajtóval csúszhatunk. A beköltözést a bútorokon kívül az ablakok és a bútorok berakása is késleltetheti, noha ezek a beköltözésnek csak közvetett előzményei.
Minden bemenethez csak egy helyes kimenet van.
Az 5. versenyfeladatsor 4. feladatát, ami egy egyszerűsített tetriszjátékról szól, be lehet küldeni házi feladatnak egy pontért. A sio-ba a z5f4 feladathoz kell feltölteni.