Website Summary Files Commits Branches @commit @diff @stats
path: root / Week09
diff options
context:
space:
mode:
Commit6f894be622e8046f43a70e843cff7bd99c58a3c1 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-11-29 20:01:00 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-11-29 20:01:00 +0200
Files76d0f8b7818f3696aa0e5016679f0225b33d3270 /Week09
upp-2025-solutions-6f894be622e8046f43a70e843cff7bd99c58a3c1.tar
upp-2025-solutions-6f894be622e8046f43a70e843cff7bd99c58a3c1.tar.gz
upp-2025-solutions-6f894be622e8046f43a70e843cff7bd99c58a3c1.zip
Parent5294e73a21f3402e14fcf3379c721275e2dd19c2 (diff)
feat(Week09): Add solutions to first three exercises
4 files changed, 137 insertions, 0 deletions
-rw-r--r--Week09/Exercise01.txt40
-rw-r--r--Week09/Exercise02.txt41
-rw-r--r--Week09/Exercise03.txt53
-rw-r--r--Week09/README.md3
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/>