diff options
feat(Week09): Add solutions to first three exercises
4 files changed, 137 insertions, 0 deletions
| -rw-r--r-- | Week09/Exercise01.txt | 40 | ||||
| -rw-r--r-- | Week09/Exercise02.txt | 41 | ||||
| -rw-r--r-- | Week09/Exercise03.txt | 53 | ||||
| -rw-r--r-- | Week09/README.md | 3 |
diff --git a/Week09/Exercise01.txt b/Week09/Exercise01.txt new file mode 100644 index 0000000..9986554 --- /dev/null +++ b/Week09/Exercise01.txt @@ -0,0 +1,40 @@ +Ще запазим броя етажи като глобална константа на име FLOORS (и стойност 5). + +По условие е казано, че асансьор се качва по-бързо отколкото слиза. Ще допуснем, че +разликата в скоростите е малка. Допълнително се изисква да приоритизираме скорост. + +От тези факти, следва че когато два бутона на еднакво разстояние от един асансьор са натиснати, +то асансьора трябва да приоритизира по-горния етаж. + +Също не е казано в какъв формат ни се подават етажите на асансьорите. +Избираме следния format: от 0 до FLOORS-1 вкл. се обозначават етажите, като 0 обозначава партер. + + +unsigned int newElevatorPosition(bool buttonsPressed[FLOORS], unsigned int currentPosition); + + Функцията newElevatorPosition ще върне новата позиция на асансьора по следния начин: + започваме от текущата позиция и с цикъл постепенно инкрементираме стойност "distance". + На всяка итерация ще проверяваме дали на съответния горен и долен етаж + (текуща позиция + distance и текуща позиция - distance) е натиснат бутон. + + При всяка такава проверка, ще погледнем дали получения етаж е валиден (индекс в buttonsPressed). + Ако етажа е валиден и на него е натиснат бутон, директно връщаме етажа. + Първо правим проверката за горния етаж, след това за долния, така имплементираме решението на + проблема с двата натиснати бутона на еднакво разстояние, който анализирахме по-рано. + + distance ще се мени от 0 до FLOORS-1 вкл. и ако не намерим етаж с натиснат бутон, просто връщаме + текущата позиция. + Понеже distance в началото ще е 0, това покрива случая когато бутон е натиснат на текущия етаж. + +int main(); + + Декларираме булев масив с FLOORS на брой елемента и го попълваме с входни данни. + Декларираме и попълваме два индекса (от тип unsigned int), които ще съдържат позицията на двата + асансьора. + + Извикваме newElevatorPosition, като подаваме булевия масив и текущата позиция на първия асансьор. + Върнатия резултат го изкарваме на екрана и на същата позиция в булевия масив, записваме че бутона + не е натиснат. + + Аналогично, отново извикваме newElevatorPosition, с (обновения) булев масив и позицията на втория + асансьор. Резултата го изкарваме. diff --git a/Week09/Exercise02.txt b/Week09/Exercise02.txt new file mode 100644 index 0000000..68e0604 --- /dev/null +++ b/Week09/Exercise02.txt @@ -0,0 +1,41 @@ +Ще запазим броя автобусни линии в глобална константа LINES и +максималния брой спирки в глобална константа MAX_STOPS. + +Не ни е дадена връзка между посока на пътуване на автобусите. +Ще допуснем, че те не са значими за нашето решение. + + +int maxSeatsTaken(int gettingOn[MAX_STOPS], int gettingOff[MAX_STOPS]); + + Линейно итерираме през gettingOn и gettingOff едновременно (един цикъл с един индекс). + Започвайки от първата спирка (на индекс 0), събираме броя хора, които са се качили и + изваждаме броя които са слезли. + + Разликата добавяме в int променлива totalSeats, която се инициализира с 0. + Аналогично пазим променлива maxSeats (също инициализирана на 0). На всяка итерация, + след като добавим към totalSeats, проверяваме дали е повече от maxSeats. + Ако е - записваме стойността в maxSeats. + + Накрая връщаме maxSeats. + +unsigned int seatsToBusSize(int seats); + + Дефинираме променлива busSize със стойност 14. + С цикъл, докато busSize е по-малко от входните seats, + добавяме 6 към busSize. + + Когато стигнем нужната бройка, цикъла спира и връщаме busSize. + +int main(); + + Декларираме две матрици, gettingOn и gettingOff, с размери LINES на MAX_STOPS. + От входа получаваме, за всяка линия, първо броя спирки, след това алтерниращо + колко хора се качват и колко хора слизат. + Попълваме съответните стойности в двете матрици. Ако броя спирки е по-малко от + максимума (17), тогава попълваме останалите клетки с нули. + + Итерираме през всички линии. + За всяка линия, извикваме maxSeatsTaken, като подаваме съответните "подмасиви" + от gettingOn и gettingOff на индекс текущата линия. + Резултата го подаваме на seatsToBusSize и от него изкарваме размера на автобуса + на екрана. diff --git a/Week09/Exercise03.txt b/Week09/Exercise03.txt new file mode 100644 index 0000000..4b72eb0 --- /dev/null +++ b/Week09/Exercise03.txt @@ -0,0 +1,53 @@ +Ще запазим количеството елементи, които машина произвежда в глобална константа +MACHINE_DAY_RECORDS (равна на 8 * 10000 = 80000). + +От научните изследвания очакваме, че дефектите в произведените елементи +ще се срещат в "купчини". Тоест ще имаме последователност от изправни +елементи, след това последователност от дефекти и после пак последователност +от изправни елементи и так. нат. (където всяка последователност съдържа поне 2 +елемента). + +Това означава, че ако имаме много самостоятелни срещания на дефекти, работниците +най-вероятно ги крадат. Аналогично, ако имаме повече редици дефекти отколкото +самостоятелни дефекти, то машината ще е в неизправно състояние. + + +double defectPercentage(bool outputRecords[MACHINE_DAY_RECORDS]); + + Дефинираме променлива defectiveElements със стойност 0. + Итерираме линейно през outputRecords, като за всеки един елемент сумираме + единица към defectiveElements, когато е дефектен. + + Накрая връщаме defectiveElements делено на MACHINE_DAY_RECORDS (като + конвертираме поне едно от двете към double). + +bool isMachineBroken(bool outputRecords[MACHINE_DAY_RECORDS]); + + Дефинираме променливи sequencesOfDefects и countDefects, и двете със + стойност 0. + Ако първия елемент е дефектен, добавяме единица и към двете променливи. + + След това итерираме линейно през останалите елементи, като пазим + предходната стойност в променлива prevDefect (която в началото е истина, + ако първия елемент е дефектен и лъжа иначе). + + На всеки елемент в итерацията, ако е дефектен, добавяме единица към + countDefects. Ако е дефектен и предходния не е бил дефектен, тогава + добавяме единица към sequencesOfDefects. + + Накрая връщаме истина когато sequencesOfDefects е повече от половината от + countDefects и лъжа иначе. + +int main(); + + Декларираме масив machineRecords с размер MACHINE_DAY_RECORDS и го попълваме + с данни от входа. + След това подаваме machineRecords на defectPercentage. Ако е повече от 0.0003, + то тогава го подаваме на isMachineBroken. + + Ако резултата е истина, изкарваме съобщение че машината е счупена, иначе че се + краде от нея. + Ако резултата от defectPercentage е по-малък от 0.0003, тогава изкарваме че + машината е в изправно състояние. + + Повтаряме тази процедура общо 5 пъти, за всяка машина. diff --git a/Week09/README.md b/Week09/README.md new file mode 100644 index 0000000..d1f536a --- /dev/null +++ b/Week09/README.md @@ -0,0 +1,3 @@ +# Задачи + +<https://syndamia.com/teaching/upp-2025/week09/> |
