Prog 2 2. házi feladatsor

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:

s2p.tgz

0. feladat: feladat ütemzés

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.

s2f0be0 -> s2f0ki0

s2f0be1 -> s2f0ki1

s2f0be2 -> s2f0ki2

s2f0be3 -> s2f0ki3

s2f0be4 -> s2f0ki4

s2f0be5 -> s2f0ki5

s2f0be6 -> s2f0ki6

1. feladat: nem csúszhat

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.

s2f1be0 -> s2f1ki0

s2f1be1 -> s2f1ki1

s2f1be2 -> s2f1ki2

s2f1be3 -> s2f1ki3

s2f1be4 -> s2f1ki4

s2f1be5 -> s2f1ki5

s2f1be6 -> s2f1ki6

2. feladat: tetrisz

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.