Задачи по теми 2 и 3#
Задача 1 (0.25 т.)#
По дадена дата във формат YYYY-MM-DD
(тип str
) да се върне наредена тройка от числа (int
), съответстващи на годината, месеца и деня.
Hint: може да използвате
str.split
def extract_date_components(date_string):
pass # your code here
# Tests:
assert extract_date_components('1970-01-01') == (1970, 1, 1)
assert extract_date_components('2023-10-22') == (2023, 10, 22)
assert extract_date_components('0000-12-25') == (0, 12, 25)
assert extract_date_components('2009-02-29') == (2009, 2, 29), "no one said it should be a valid date"
"✅ All OK! +0.25 points"
Задача 2 (0.25т.)#
Напишете функция format_date_components
, която:
приема 3 параметъра:
year
,month
,day
(типint
)приема oще 1 параметър
separator
(типstr
), по подразбиране със стойност'-'
връща
str
с годината, месеца и деня, разделени съсseparator
символацифрите на месеца и деня да са точно 2
Number formatting reference: https://www.pythoncheatsheet.org/cheatsheet/string-formatting#formatting-digits
# write your code here
# Tests:
assert format_date_components(2023, 10, 22) == '2023-10-22'
assert format_date_components(2112, 12, 21, separator='/') == '2112/12/21'
assert format_date_components(1970, 1, 1) == '1970-01-01', "check your leading zeroes formatting!"
assert format_date_components(1, 12, 25) == '0001-12-25', "leading zeroes for the year as well!"
"✅ All OK! +0.25 points"
Задача 3 (0.25т.)#
Съединете двата dict
-а в един.
def merge(d1, d2):
pass # write your code here
# Tests:
assert merge({"name": "Pesho", "year": 1999}, {"groups": ["A", "B"]}) == {"name": "Pesho", "year": 1999, "groups": ["A", "B"]}
assert merge({}, {}) == {}
"✅ All OK! +0.25 points"
Задача 4 (0.25т.)#
Намерете броя на цифрите на дадено число (в десетична бройна система).
def digits_count(n):
pass # write your code here
# Tests:
assert digits_count(0) == 1
assert digits_count(1) == 1
assert digits_count(9) == 1
assert digits_count(10) == 2
assert digits_count(666) == 3
assert digits_count(1234) == 4
assert digits_count(9876543210) == 10
assert digits_count(31415926535897932384626433832795028841971693993751058209749445923078164062862089986280) == 86
"✅ All OK! +0.25 points"
'✅ All OK! +0.25 points'
Задача 5 (0.25т.)#
Пребройте колко различни символа има в даден низ.
def unique_chars_count(s):
pass # write your code here
# Tests:
assert unique_chars_count("abcdef") == 6
assert unique_chars_count("aabbcc") == 3
assert unique_chars_count("abcabc") == 3
assert unique_chars_count("aaaaaa") == 1
assert unique_chars_count("") == 0
"✅ All OK! +0.25 points"
'✅ All OK! +0.25 points'
Задача 6 (0.75т.)#
Цензурирайте всички лоши думички в даден текст, заменяйки ги със звездички.
Лошите думички сa дадени в списъка
BAD_WORDS
.Върнете текста, като замените всички лоши думички със звездички (
"*"
) (толкова на брой, колкото символи има въпросната дума).За простота не проверявайте за главни и малки букви, а ги заменяйте както са ви дадени.
Hint: за да създадете стринг с
n
на брой символа"x"
, използвайтеn * "x"
.Hint 2: ползвайте
str.split
иstr.join
BAD_WORDS = [
"fuck",
"shit",
"bullshit",
"bastard",
"bitch",
"whore",
"damn",
]
def censored(text):
pass # write your code here
# Tests:
assert censored("this line should not be censored at all") == "this line should not be censored at all"
assert censored("fuck this bitch") == "**** this *****"
assert censored("This task is UTTER BULLshit") == "This task is UTTER ********", "be careful with the case!"
assert censored("") == ""
"✅ All OK! +0.75 points"
Задача 7 (0.5т.)#
Направете стек:
в инициализатора си да приема неопределен брой аргументи - елементите на стека (първи-последен <-> отляво-надясно)
атрибут
top
- връща последния елемент от стека (None
ако няма такъв)метод
push(x)
- добавяx
към края на стекаметод
pop()
- премахва последния елемент от стекапредефинирайте
__len__
class Stack:
pass # write your code here
# Tests:
assert Stack().top is None
assert Stack("a").top == "a"
assert Stack(1, 2, 3, 4, 5).top == 5
assert Stack(*list(range(1000))).top == 999
# pop
s = Stack("a", "b", "c", "d")
s.pop()
assert s.top == "c"
s.pop()
s.pop()
assert s.top == "a"
s.pop()
assert s.top is None
# push
s.push("X")
assert s.top == "X"
s.push("X")
s.push("X")
assert s.top == "X"
# len
assert len(s) == 3
s.pop(); s.pop(); s.pop()
assert len(s) == 0
"✅ All OK! +0.5 point"
Задача 8 (0.5 т.)#
Създайте функция find_shortest_and_longest_words
, която:
Приема 2 параметъра - списък и буква
Връща наредена двойка от най-късата и най-дългата дума в списъка, която започва с дадената буква
def find_shortest_and_longest_words(words, letter):
pass
# Tests
assert find_shortest_and_longest_words(["abracadabra", "banana", "kugelschreiber", "ant", "almost", "thisshouldbeaverylongword"], "a") == ("ant", "abracadabra")
assert find_shortest_and_longest_words(["abracadabra", "banana", "kugelschreiber", "ant", "almost", "thisshouldbeaverylongword"], "b") == ("banana", "banana")
"✅ All OK! +0.5 points"
Задача 9 (1т.)#
Да се дефинира клас Version
, който моделира числата на една софтуерна версия. Нека има следните свойства:
да може да се инициализира по два различни начина:
чрез
str
във формат{major}.{minor}.{patch}
(например"1.0.2"
)чрез три
int
-a:major
,minor
иpatch
(например1, 0, 2
)
read-only атрибут
major
(типint
)read-only атрибут
minor
(типint
)read-only атрибут
patch
(типint
)метод
__str__
, който конвертира обекта вstr
в подходящ форматметод
__repr__
, който връща репрезентация на обекта в подходящ форматметод
__eq__
, който сравнява две версии в няколко различни случая:ако другият операнд е от тип
Version
, сравнява ги с==
поmajor
,minor
иpatch
ако другият операнд е от тип
str
, то първо конвертира низa къмVersion
и след това прилага горното правилоако другият операнд е от друг тип, връща
False
метод
__ne__
, който сравнява две версии по същия начин, но с!=
вместо==
метод
__lt__
, който сравнява две версии по същия начин, но с<
вместо==
метод
__gt__
, който сравнява две версии по същия начин, но с>
вместо==
Този клас хешируем ли е? Защо?
class Version:
pass # write your code here
# Tests:
assert Version(1, 2, 3).major == 1
assert Version(1, 2, 3).minor == 2
assert Version(1, 2, 3).patch == 3
assert Version("1.2.3").major == 1
assert Version("1.2.3").minor == 2
assert Version("1.2.3").patch == 3
assert Version("10.2.304").major == 10
assert Version("10.2.304").minor == 2
assert Version("10.2.304").patch == 304
assert str(Version(1, 2, 3)) == "1.2.3"
assert repr(Version(1, 2, 3)) == "Version(1, 2, 3)"
assert Version(1, 2, 3) == Version(1, 2, 3)
assert Version(1, 2, 3) == "1.2.3"
assert Version(1, 2, 3) != Version(1, 2, 4)
assert Version(1, 2, 3) != "1.2.4"
assert Version(1, 2, 3) < Version(2, 0, 0)
assert Version(1, 2, 3) < "2.0.0"
assert Version(1, 2, 3) < Version(1, 3, 0)
assert Version(1, 2, 3) < "1.3.0"
assert Version(1, 2, 3) < Version(1, 2, 4)
assert Version(1, 2, 3) < "1.2.4"
assert Version("1.2.3") < Version("1.12.0")
assert Version("1.2.3") < "1.12.0"
assert Version(1, 2, 3) > Version(0, 9, 0)
assert Version(1, 2, 3) > "0.9.0"
assert Version(1, 2, 3) > Version(1, 1, 0)
assert Version(1, 2, 3) > "1.1.0"
assert Version(1, 2, 3) > Version(1, 2, 2)
assert Version(1, 2, 3) > "1.2.2"
assert Version("1.1.13") > Version("1.1.3")
assert Version("1.1.13") > "1.1.3"
"✅ All OK! +1 point"
Задача 10 (2 т.)#
Създайте клас ElectronicDevice, който има:
атрибут serial_number (низ, смесица от латински букви и числа)
атрибут brand (низ)
атрибут model (низ)
атрибут internal_memory (число)
инициализатор, който приема и задава стойности на дадените атрибути
метод show_device_info, който връща информация за устройството в следния формат: “You have electronic device {brand} {model} with {internal_memory}GB memory”
метод show_storage_info, който връща съобщение “Your device has {internal_memory}GB”
метод
__str__
метод
__repr__
Създайте клас Smartphone, който наследява класа ElectronicDevice. Нека има:
атрибут available_storage (число, първоначално равно на internal_memory)
атрибут main_camera_quality (число)
атрибут installed_apps (списък, по подразбиране е празен)
инициализатор, който приема и задава стойности на дадените атрибути
метод show_device_info, който връща информация за устройството в следния формат: “You have smartphone {brand} {model} with {internal_memory}GB memory and {main_camera_quality}MP camera”
метод show_storage_info, който връща съобщение “Your smartphone has {available_storage}GB available storage out of {internal_memory}GB”
метод install_app(app_name, space_needed), който:
Ако е възможно, добавя приложението към списъка с приложения и извежда съобщение “You successfully installed {app_name}”.
Ако не е възможно, връща съобщение “Seems like you don’t have enough space. Available storage space: {available_storage}GB”
метод
__str__
метод
__repr__
Създайте клас Laptop, който наследява класа ElectronicDevice. Нека има:
атрибут processor (низ)
атрибут processor_version (низ)
инициализатор, който приема и задава стойности на дадените атрибути
метод show_device_info, който връща информация за устройството в следния формат: “You have laptop {brand} {model} with {internal_memory}GB memory and {processor} {processor_version} processor”
метод show_storage_info, който връща съобщение “Your laptop has {internal_memory}GB”
метод connect_device(device_name), който връща следното съобщение: “You just connected {device_name} to {brand} {model}”
метод
__str__
метод
__repr__
class ElectronicDevice:
pass
class Smartphone:
pass
class Laptop:
pass
# Tests:
# ElectronicDevice tests
test_electronic_device = ElectronicDevice("8vef15c6", "TestBrand", "TestModel", 128)
assert test_electronic_device.serial_number == "8vef15c6"
assert test_electronic_device.brand == "TestBrand"
assert test_electronic_device.model == "TestModel"
assert test_electronic_device.internal_memory == 128
assert test_electronic_device.show_device_info() == "You have electronic device TestBrand TestModel with 128GB memory"
assert test_electronic_device.show_storage_info() == "Your device has 128GB"
# Smarthphone tests
assert issubclass(Smartphone, ElectronicDevice)
test_smartphone = Smartphone("9pol23k7", "TestBrand2", "TestModel2", 256, main_camera_quality=13)
assert test_smartphone.serial_number == "9pol23k7"
assert test_smartphone.brand == "TestBrand2"
assert test_smartphone.model == "TestModel2"
assert test_smartphone.internal_memory == 256
assert test_smartphone.available_storage == 256
assert test_smartphone.main_camera_quality == 13
assert test_smartphone.installed_apps == []
assert test_smartphone.show_device_info() == "You have smartphone TestBrand2 TestModel2 with 256GB memory and 13MP camera"
res1 = test_smartphone.install_app("TestApp", 56)
assert res1 == "You successfully installed TestApp"
assert len(test_smartphone.installed_apps) == 1
assert "TestApp" in test_smartphone.installed_apps
assert test_smartphone.show_storage_info() == "Your smartphone has 200GB available storage out of 256GB"
res2 = test_smartphone.install_app("TestApp2", 201)
assert res2 == "Seems like you don't have enough space. Available storage space: 200GB"
assert len(test_smartphone.installed_apps) == 1
assert "TestApp2" not in test_smartphone.installed_apps
# Laptop tests
assert issubclass(Laptop, ElectronicDevice)
test_laptop = Laptop("7yeu14t3", "TestBrand3", "TestModel3", 512, "TestProcessor", "v5.2.1.13")
assert test_laptop.serial_number == "7yeu14t3"
assert test_laptop.brand == "TestBrand3"
assert test_laptop.model == "TestModel3"
assert test_laptop.internal_memory == 512
assert test_laptop.processor == "TestProcessor"
assert test_laptop.processor_version == "v5.2.1.13"
assert test_laptop.show_device_info() == "You have laptop TestBrand3 TestModel3 with 512GB memory and TestProcessor v5.2.1.13 processor"
assert test_laptop.show_storage_info() == "Your laptop has 512GB"
assert test_laptop.connect_device("TestConnectedDevice") == "You just connected TestConnectedDevice to TestBrand3 TestModel3"
"✅ All OK! +2.0 points"