Website Summary Files Commits Branches @commit @diff @stats
path: root / Week03
diff options
context:
space:
mode:
Commiteb8b89e3622f5a77027fe88930b6d38cfe73b774 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-10-18 14:40:29 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-10-18 14:41:48 +0300
Filesb986b23dc049adf9f9442afac5e26f439ca60a26 /Week03
upp-2025-solutions-eb8b89e3622f5a77027fe88930b6d38cfe73b774.tar
upp-2025-solutions-eb8b89e3622f5a77027fe88930b6d38cfe73b774.tar.gz
upp-2025-solutions-eb8b89e3622f5a77027fe88930b6d38cfe73b774.zip
Parentecf6048c3bbb0c9395ac524921a19f38ef3887ea (diff)
feat(Week03): Add exercises and solutions
11 files changed, 297 insertions, 0 deletions
-rw-r--r--Week03/Exercise01.cpp10
-rw-r--r--Week03/Exercise02.cpp10
-rw-r--r--Week03/Exercise03.cpp19
-rw-r--r--Week03/Exercise05.cpp10
-rw-r--r--Week03/Exercise06.cpp14
-rw-r--r--Week03/Exercise07.cpp18
-rw-r--r--Week03/Exercise08.cpp10
-rw-r--r--Week03/Exercise10.cpp10
-rw-r--r--Week03/Exercise12.cpp10
-rw-r--r--Week03/Exercise13.cpp16
-rw-r--r--Week03/README.md170
diff --git a/Week03/Exercise01.cpp b/Week03/Exercise01.cpp
new file mode 100644
index 0000000..80a4149
--- /dev/null
+++ b/Week03/Exercise01.cpp
@@ -0,0 +1,10 @@
+#include <iostream>
+
+int main() {
+ int x;
+ std::cin >> x;
+
+ std::cout << ((x + 1) % 2);
+
+ return 0;
+}
diff --git a/Week03/Exercise02.cpp b/Week03/Exercise02.cpp
new file mode 100644
index 0000000..4f7ca3c
--- /dev/null
+++ b/Week03/Exercise02.cpp
@@ -0,0 +1,10 @@
+#include <iostream>
+
+int main() {
+ char letter;
+ std::cin >> letter;
+
+ std::cout << (char)(letter + 32);
+
+ return 0;
+}
diff --git a/Week03/Exercise03.cpp b/Week03/Exercise03.cpp
new file mode 100644
index 0000000..3d76b46
--- /dev/null
+++ b/Week03/Exercise03.cpp
@@ -0,0 +1,19 @@
+#include <iostream>
+
+int main() {
+ int a, b, c;
+ std::cin >> a >> b >> c;
+ /* Алтернативно може да направите:
+ * int a;
+ * int b;
+ * int c;
+ * std::cin >> a;
+ * std::cin >> b;
+ * std::cin >> c;
+ */
+
+ std::cout << ((b - a) == (c - b));
+ /* Друга формула, която също работи е:
+ * (a + c) / 2 == b
+ */
+}
diff --git a/Week03/Exercise05.cpp b/Week03/Exercise05.cpp
new file mode 100644
index 0000000..a56209a
--- /dev/null
+++ b/Week03/Exercise05.cpp
@@ -0,0 +1,10 @@
+#include <iostream>
+
+int main() {
+ double bgn;
+ std::cin >> bgn;
+
+ std::cout << (bgn / 1.95583);
+
+ return 0;
+}
diff --git a/Week03/Exercise06.cpp b/Week03/Exercise06.cpp
new file mode 100644
index 0000000..ee919b4
--- /dev/null
+++ b/Week03/Exercise06.cpp
@@ -0,0 +1,14 @@
+#include <iostream>
+
+int main() {
+ bool p, q;
+ std::cin >> p >> q;
+
+ std::cout << ((!p || q) && (!q || p));
+ /* Ако се вгледате в таблицата на истинност, тогава
+ * може да се досетите, че има по-прост израз:
+ * p == q
+ */
+
+ return 0;
+}
diff --git a/Week03/Exercise07.cpp b/Week03/Exercise07.cpp
new file mode 100644
index 0000000..1746447
--- /dev/null
+++ b/Week03/Exercise07.cpp
@@ -0,0 +1,18 @@
+#include <iostream>
+
+int main() {
+ int a, b, c, d;
+ std::cin >> a >> b >> c >> d;
+
+ float average = (float)(a + b + c + d) / 4.0;
+ int sum = a + b + c + d;
+ float inv_sum = 1.0 / (float)a + 1.0 / (float)b + 1.0 / (float)c + 1.0 / (float)d;
+ int product = a * b * c * d;
+ std::cout << average << ' ' << sum << ' ' << inv_sum << ' ' << product;
+ /* В горните сметки можем да пропуснем конвертиранията към float.
+ * Защо?
+ * И какво можем да променим, така че сметките да се нуждаят от конвертиране?
+ */
+
+ return 0;
+}
diff --git a/Week03/Exercise08.cpp b/Week03/Exercise08.cpp
new file mode 100644
index 0000000..8f655cf
--- /dev/null
+++ b/Week03/Exercise08.cpp
@@ -0,0 +1,10 @@
+#include <iostream>
+
+int main() {
+ double a, b, c, d, x;
+ std::cin >> a >> b >> c >> d >> x;
+
+ std::cout << (a * x * x * x + b * x * x + c * x + d == 0);
+
+ return 0;
+}
diff --git a/Week03/Exercise10.cpp b/Week03/Exercise10.cpp
new file mode 100644
index 0000000..dda943e
--- /dev/null
+++ b/Week03/Exercise10.cpp
@@ -0,0 +1,10 @@
+#include <iostream>
+
+int main() {
+ float a1, a2, a3, b1, b2, b3;
+ std::cin >> a1 >> a2 >> a3 >> b1 >> b2 >> b3;
+
+ std::cout << (a1 * b1 + a2 * b2 + a3 * b3);
+
+ return 0;
+}
diff --git a/Week03/Exercise12.cpp b/Week03/Exercise12.cpp
new file mode 100644
index 0000000..f13fe59
--- /dev/null
+++ b/Week03/Exercise12.cpp
@@ -0,0 +1,10 @@
+#include <iostream>
+
+int main() {
+ char current, goal;
+ std::cin >> current >> goal;
+
+ std::cout << ((goal - current + 26) % 26);
+
+ return 0;
+}
diff --git a/Week03/Exercise13.cpp b/Week03/Exercise13.cpp
new file mode 100644
index 0000000..f38156e
--- /dev/null
+++ b/Week03/Exercise13.cpp
@@ -0,0 +1,16 @@
+#include <iostream>
+
+int main() {
+ const double PI = 3.14159;
+
+ double alpha, beta;
+ std::cin >> alpha >> beta;
+
+ double x = alpha + beta;
+ double sinx = (16.0 * x * (PI - x)) / (5 * PI * PI - 4 * x * (PI - x));
+ x += PI / 2;
+ double cosx = (16.0 * x * (PI - x)) / (5 * PI * PI - 4 * x * (PI - x));
+ std::cout << (sinx / cosx);
+
+ return 0;
+}
diff --git a/Week03/README.md b/Week03/README.md
new file mode 100644
index 0000000..e32f046
--- /dev/null
+++ b/Week03/README.md
@@ -0,0 +1,170 @@
+# Задачи
+
+<https://syndamia.com/teaching/upp-2025/week03/>
+
+## За решаване
+
+### Задача 1
+
+Получавате цяло число. Трябва да върнете 0 ако е нечетно и 1 ако е четно.
+
+|Вход|Изход|
+|---|---|
+|5|0|
+|10|1|
+
+### Задача 2
+
+Получавате главна буква. Трябва да върнете съответната малка буква.
+
+|Вход|Изход|
+|---|---|
+|A|a|
+|Z|z|
+|U|u|
+
+### Задача 3
+
+Получавате 3 цели числа, трябва да върнете 1 ако образуват аритметична прогресия и 0 иначе.
+
+|Вход|Изход|
+|---|---|
+|1 2 3|1|
+|4 5 7|0|
+|4 6 7|0|
+|-3 5 13|1|
+
+### Задача 5
+
+Получавате десетично число: сума в левове. Трябва да върнете същата сума в евро, като 1 € = 1.95583 лв.
+
+Поради прецизност при такива числа, вашите изходи може с много малко да се различават.
+
+|Вход|Изход|
+|---|---|
+|1|0.511292|
+|1.95583|1|
+|15|7.66938|
+|199.99|102.253|
+|450|230.081|
+
+### Задача 6
+
+Получавате две булеви стойности. Трябва да върнете 1 ако свойството "би-импликация" е изпълнено за тях. Иначе върнете 0.
+
+Припомняме, че би-импликацията и импликацията се дефинират по следния начин:
+
+![p <-> q = (p -> q) ^ (q -> p) ; p -> q = !p v q](https://syndamia.com/teaching/upp-2025/week03/img/biimplication.png)
+
+|Вход|Изход|
+|---|---|
+|0 1|0|
+|1 1|1|
+|1 0|0|
+|0 0|1|
+
+### Задача 7
+
+Получавате 4 цели числа от входа. За тях трябва да изкарате:
+
+- средно аритметично,
+- сума,
+- сума от вида 1/<първо число> + 1/<второ число> + ...,
+- умножение.
+
+|Вход|Изход|
+|---|---|
+|1 2 3 4|2.5 10 2.08333 24|
+|13 151 7 29|50.0 200 0.260886 398489|
+|-293 6 0 -1|-72.0 -288 inf 0|
+
+### Задача 8
+
+Получавате 5 реални числа: коефициентите на полином от трета степен a (a различно от 0), b, c, d и потенциален негов корен x.
+
+Трябва да върнете 1 ако x е корен на уравнението и 0 ако не е.
+
+Припомняме, че x е корен на кубично уравнение, когато:
+
+![ax^3 + bx^2 + cx + d = 0](https://syndamia.com/teaching/upp-2025/week03/img/cubic.png)
+
+|Вход|Изход|
+|---|---|
+|2 3 -11 -6 2|1|
+|2 3 -11 -6 -0.5|1|
+|2 3 -11 -6 -3|1|
+|2 3 -11 -6 -2|0|
+|3 -3 -90 0 0|1|
+|5 -2 5 -2 0.4|1|
+
+### Задача 10
+
+Получавате 6 реални числа: коефициентите на два (ортонормирани) триизмерни вектора. Върнете тяхното точково умножение.
+
+Припомняме, че алгебричата дефиниция на точковото умножение е:
+
+![a . b = a1b1 + a2b2 + ...](https://syndamia.com/teaching/upp-2025/week03/img/dotproduct.png)
+
+|Вход|Изход|
+|---|---|
+|1 3 -5 4 -2 -1|3|
+|1.5 2.45 3.8 1.01 5 7.005|40.384|
+|-1 -2 3 4 0 -8|-28|
+|3 2 1 6 5 2|30|
+
+## За самоподготовка
+
+### Задача 12
+
+Първите релефни етикети (които човек може сам да попълни) са въведени през 1958 от DYMO.
+
+Механични устройства съдържат диск с букви (знаци), който се завърта докато не се избере желаната буква. Чрез стискане на дръжката, малък чук прищипва лентата върху диска (който има релефи на буквите), пластмасовата лента се изкривява и буква се отпечтва (подобно на пишеща машина).
+
+Нека нашия диск съдържа само малки букви. Във входа получавате две малки букви: коя буква е избрана в момента и коя буква е желана. Трябва да върнете с колко позиции на ляво (обратно на часовниковата стрелка) трябва да се завърти диска, така че желаната буква да се избере.
+
+|Вход|Изход|
+|---|---|
+|a a|0|
+|a b|1|
+|a z|25|
+|z a|1|
+|k j|25|
+|w d|7|
+
+### Задача 13
+
+През 629, индийския математик Бхаскара 1ви представя една забележителна апроксимация на синус функцията (в радиани):
+
+![sin x ~= (16x(pi-x)) / (5pi^2 - 4x(pi-x)), 0 <= x <= pi](https://syndamia.com/teaching/upp-2025/week03/img/sineapprox.png)
+
+От входа ще получите два ъгъла в радиани, α и β, чиято сума е между 0 и π/2 (включително).
+
+Използвайки единствено апроксимацията на Бхаскара 1ви, пресметнете tg(α + β).
+Не може да използвате коренуване!
+
+За константата π, използвайте поне 5 цифри след десетичната запетая.
+Подсказка
+Използвайте факта, че може да представите косинус чрез отместване на синус.
+
+|Вход|Изход|
+|---|---|
+|0 0|0|
+|0.392698 0.392698|1|
+|0 1.047196|1.72973|
+|3.14159 -1.570795|inf|
+|-0.523598 1.047196|0.578125|
+|0.523598 0.392698|1.30265|
+
+### Задача 16
+
+Получавате 8 реални числа: всеки две последователни образуват координат в равнината. Първите два координата представят горния ляв и долния десен ъгъл на първи правоъгълник. Вторите два координата представят горния ляв и долния десен ъгъл на втори правоъгълник.
+
+Трябва да върнете 1 ако правоъгълниците се пресичат и 0 иначе.
+
+|Вход|Изход|
+|---|---|
+|0 6 4 0 6 6 8 2|0|
+|0 6 4 0 4 6 8 2|1|
+|0 6 4 0 3 3 8 2|1|
+|-3 4.5 2.1 0.5 0 6 4 0|1|
+|-4 8 5 -2 0 6 4 0|1|