Ликвидационен изпит
Животно се представя с наредена двойка от име (низ) и списък от храни, в реда на предпочитанието им от животното. Екосистема се представя със списък от наредени двойки от цяло число и име на животно или растение, където числото означава бройката индивиди в екосистемата за животните и е -1 за растенията.
а) Да се реализира функция eatFood, която получава като параметри n - брой на гладни животни, food - низ, описващ име на търсената от тях храна и екосистема ecosystem, и връща като резултат наредена двойка от:
- новата екосистема, която се получава от ecosystem след като всяко гладно животно изяде по един индивид от храната food и
- броя на животните h, които са останали гладни поради недостатъчна наличност на храната food в екосистемата ecosystem.
Ако храната food е растение (т.е. е отразена в екосистемата с брой -1), то се счита, че екосистемата не се променя и не остават гладни животни. Ако всички индивиди от даден вид са изядени, този вид изчезва от екосистемата.
б) Да се реализира функция eatAllFood, която получава като параметри животно animal (наредена двойка от име и списък от храни в реда на предпочитанието им от животното) и екосистема ecosystem, и връща като резултат наредена двойка от:
- новата екосистема, която се получава от ecosystem след като всеки индивид от animal в екосистемата ecosystem изяде по един индивид от най-предпочитаната си храна, която е налична в ecosystem и
- броя на животните h, които са останали гладни поради недостатъчна наличност на храна в екосистемата ecosystem.
Както и в а), счита се, че ако животното изяжда храна, която е растение (т.е. е отразена в екосистема с брой -1), то екосистемата не се променя, а животното се засища и ако всички индивиди от даден вид са изядени, този вид изчезва от екосистемата. Животните винаги изяждат храната в реда на предпочитание, зададен в списъка им от храни.
в) Да се реализира функция eatOrDie, която получава като параметри животно animal (наредена двойка от име и списък от храни в реда на предпочитанието им от животното) и екосистема ecosystem, и връща като резултат нова екосистема, която се получава като предишната по следните правила:
- всеки индивид от animal изяжда по един индивид от най-предпочитаната си храна, която е налична в ecosystem, съгласно правилата, описани в б)
- индивидите, които са останали гладни, умират (т.е. в новата екосистема остават само животни, за които е имало храна)
- ако броят индивиди от даден вид падне на 0, видът се премахва от екосистемата
- оживелите индивиди се размножават, като удвояват броя си.
г) Да се реализира функция streamOfLife, която получава като параметри списък от животни animals и екосистема ecosystem и генерира безкраен поток от екосистеми, чиито първи елемент е ecosystem, а всяка следваща екосистема се получава от предишната съгласно правилата, описани във в), приложени последователно над всички животни в списък animals. Т.е. първо умират или се размножават индивидите от първия вид животно в animals, след това от втория вид в animals и т. н. до края на списъка.
Примери:
animals = [ ("rabbit", ["carrots", "grass"]),
("chicken", ["grass", "corn"]),
("rat", ["corn", "carrots"]),
("fox", ["chicken", "rabbit", "rat", "carrots"]),
("wolf", ["rabbit", "fox"])]
ecosystem = [(12,"wolf"), (2, "fox"), (8, "rabbit"), (10, "chicken"), (4, "rat"), (-1, "grass"), (-1, "corn")]
eatFood 5 "rabbit" ecosystem → ([(12,"wolf"),(2,"fox"),(3,"rabbit"),(10,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")],0)
eatFood 15 "rabbit" ecosystem → ([(12,"wolf"),(2,"fox"),(10,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")],7)
eatFood 100 "grass ecosystem → ([(12,"wolf"),(2,"fox"),(8,"rabbit"),(10,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")],0)
eatAllFood ("wolf", ["rabbit", "fox"]) ecosystem → ([(12,"wolf"),(10,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")],2)
eatAllFood ("fox", ["chicken", "rabbit", "rat", "carrots"]) ecosystem → ([(12,"wolf"),(2,"fox"),(8,"rabbit"),(8,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")],0)
eatAllFood ("rabbit", ["carrots", "grass"]) ecosystem → ([(12,"wolf"),(2,"fox"),(8,"rabbit"),(10,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")],0)
eatOrDie ("wolf", ["rabbit", "fox"]) ecosystem → [(20,"wolf"),(10,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")]
eatOrDie ("rabbit", ["carrots", "grass"]) ecosystem → [(12,"wolf"),(2,"fox"),(16,"rabbit"),(10,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")]
streamOfLife animals ecosystem → [[(12,"wolf"),(2,"fox"),(8,"rabbit"),(10,"chicken"),(4,"rat"),(-1,"grass"),(-1,"corn")],
[(24,"wolf"),(4,"fox"),(4,"rabbit"),(18,"chicken"),(8,"rat"),(-1,"grass"),(-1,"corn")],
[(32,"wolf"),(32,"chicken"),(16,"rat"),(-1,"grass"),(-1,"corn")],
[(64,"chicken"),(32,"rat"),(-1,"grass"),(-1,"corn")],...