Домашни > Да върнем левчето обратно!


Да върнем левчето обратно!
Краен срок: 11.03.2026 18:00
Точки: 6

Вчера беше е [трети март, националният празник на България](https://bg.wikipedia.org/wiki/%D0%94%D0%B5%D0%BD_%D0%BD%D0%B0_%D0%9E%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%D1%82%D0%BE_%D0%BD%D0%B0_%D0%91%D1%8A%D0%BB%D0%B3%D0%B0%D1%80%D0%B8%D1%8F_%D0%BE%D1%82_%D0%BE%D1%81%D0%BC%D0%B0%D0%BD%D1%81%D0%BA%D0%BE_%D0%B8%D0%B3%D0%BE). И както ви обещахме в [тази новина](https://2024.py-fmi.org/news/19), приготвили сме ви страшно патриотично домашно... В контекста на тазгодишните събития. ![Да видите, че сме патриоти!](/media/resources/homework-1.png) ### Да се подготвим за връщане на левчето Не знаем за вас, но ние сме разстроени, че ни махнаха левчето. Някои от нас защото вдигнаха цените на хубавото българско кисело мляко, други - цените на традиционните български мартеници, трети - цените на кокаина. Освен инфлацията, не знаем какво ще се случи с магазините за едно левче, дали няма да преименуват Левски _(отбора, не човека, не могат да пипнат националните герои)_ и Боро Първи ще запише ли наново песента си [Левче](https://www.youtube.com/watch?v=i1a-3vzA7JU&list=RDi1a-3vzA7JU), пеейки за едно евро, така че да стане евъргрийн. Знаем едно, обаче, няма да оставим нещата така! Отказваме да потвърдим или отхвърлим дали сме предприели, законови или не, мерки за връщане на левчето обратно. Все пак ще сме ви благодарни ако ни помогнете да се подготвим за това, ако случайно каузата ни е успешна. ### Задачата От вас ще искаме да напишете две функции, които да работят с чужда валута. Едната от тях ще конвертира чужда валута в левчета, а другата ще проверява дали сумата, която се получава, е патриотична или не. #### `курс_в_лева` Напишете функцията `курс_в_лева`, която приема речник - набор от трибуквени идентификатори на валути и обменен курс. Вероятно сте забелязали, че в чейндж бюрата курсът обикновено се пише "спрямо" другата единица, а не спрямо лева. С други думи - виждали сте курс EUR / BGN - `1.9558`. Тоест `1.9558` лева за `1` евро. Да, ама ние сме патриоти, и искаме да е обратното, искаме да покажем колко евро са едно левче - `0.5113`. Всеки от обменните курсове, ще бъде във вида "левчета _за една единица от чуждестранна валута_" Функцията трябва да го конвертира във вида "чуждестранна валута **за едно левче**", и да ни върне речник със съответните стойности например: ``` exchange_rates = {"EUR": 1.9558, "USD": 1.6718, "DKK": 0.2616} курс_в_лева(exchange_rates) # {"EUR": 0.5113, "USD": 0.5982, "DKK": 3.8226} ``` ##### Уговорки - Закръгляме всичко до 4-тия символ след десетичната запетая, включително. #### `валута_към_левчета` - Произволен брой позиционни аргументи - двойки във вида `(идентификатор, брой_единици_от_валутата)`. - Произволен брой именувани аргументи, където името е идентификатор, а стойността - обменен курс "брой единици чуждестранна валута **за едно левче**". Функцията трябва да връща колекция от двойки във вида `(идентификатор, брой_единици_в_лева)`, в която са сумирани всички единици от дадената валута и конвертирани в лева. Например: ``` валута_към_левчета( ("EUR", 1.5), ("USD", 10), ("DKK", 10), ("EUR", 2.5), EUR=0.5, USD=0.8, DKK=7, ) # [("USD", 12.5), ("DKK", 1.4286), ("EUR", 8)] ``` Функцията може да срещне и левчета сред позиционните аргументи ги "конвертира" 1:1: ``` валута_към_левчета( ("BGN", 1.5), ("USD", 10), USD=0.8, ) # [("USD", 12.5), ("BGN", 1.5)] ``` ##### Уговорки - Типът на върнатата колекция е без значение. - Подредбата няма значение. - Няма да тестваме функциите с вход, който не съдържа обменни курсове за всяка валута. - Закръгляме всичко до 4-тия символ след десетичната запетая, включително. - Курс за лева няма да бъде подаван на функцията, тъй като би било непатриотично. #### `е_патриотична` Функцията `е_патриотична` приема: - Позиционен аргумент - списък от двойки, първият елемент на които е идентификатор на валута, а вторият - брой единици от въпросната валута. - Втори позиционен аргумент - речник, където ключовете са познатите трибуквени идентификатори на валутите, а стойностите - обменен курс "брой единици чуждестранна валута **за едно левче**". Например: ``` exchange_rates = {"EUR": 0.5113, "USD": 0.5982, "DKK": 3.8226} amount = [("EUR", 1.34), ("USD", 10.23), ("DKK", 0.12), ("EUR", 1.5)] е_патриотична(amount, exchange_rates) ``` Ако сумата на всички пари в списъка, конвертирани в лева, е кръгло число **(с прецизност 2 символа след десетичната запетая, т.е. - стотинки)** - то тя е патриотична и връща стринга `"ПАТРИОТИЧНА!"`, ако не е - връща стринга `"НЕПАТРИОТИЧНА!"`. Пример: ``` exchange_rates = {"EUR": 0.5, "USD": 0.6, "DKK": 3.8} amount = [("EUR", 1), ("USD", 3), ("DKK", 7.6), ("EUR", 3)] е_патриотична(amount, exchange_rates) # ПАТРИОТИЧНА! - 4 / 0.5 + 3 / 0.6 + 7.6 / 3.8 = 15 amount = [("EUR", 1), ("USD", 2), ("DKK", 7.6), ("EUR", 3)] е_патриотична(amount, exchange_rates) # НЕПАТРИОТИЧНА! - 4 / 0.5 + 2 / 0.6 + 7.6 / 3.8 = 13.33, опитват се да ни измамят ``` ##### Уговорки - Няма да тестваме функциите с вход, който не съдържа обменни курсове за всяка валута. - Прецизността е до стотинка, т.е. `7.00003` го третираме като `7.00`, следователно е патриотична стойност.
Дискусия
Николина Маджарова
05.03.2026 17:14

В примера за курс-в-лева при EUR = 1.9558 се изчислява 1 / 1.9558 = 0.51129…, което се закръглява на 0.5113, т.е. петият знак се взима предвид. В примера за валута-към-левчета при 10 / 7 = 1.42857… се закръглява на 1.4285, т.е. петият знак не се взима предвид. Кое закръгляне е правилното, понеже в "уговорките" за двете функции пише един и същ начин?
Нишка
Виктор Бечев
05.03.2026 17:45

Закръгля се математически, не се игнорират цифри. Мерси, оправено!
Ариф Мехмедали
05.03.2026 09:10

В описанието на функцията е_патриотична пише, че стойностите в речника са "брой единици чуждестранна валута за едно левче". Например 1BGN = 0.5EUR. Ако имаме 4EUR, не трябва ли да ги конвертираме като 4/0.5, а не като 4 * 0.5, както е в примера?
Нишка
Виктор Бечев
05.03.2026 10:50

Уточнение за изпусналите - това е в примерите на `е_патриотична` и е абсолютно на място. Мерси, оправено _(заедно с няколко други неща)_.