Предизвикателства > Осем-измерна битова баница с късмет


Осем-измерна битова баница с късмет
Краен срок: 25.12.2024 12:00
Точки: 1

* Това предизвикателство е с краен срок чак на Коледа. Пускаме го отсега, за да можете да решите дали да го решите сега, успоредно с домашното, по време на ваканцията, или никога. Не планувахме да правим такова, но вчера поискахте - днес даваме. За празниците сме подготвили баница. Баницата е осем-измерна и е нарязана така, че всяко измерение има 2 реда, 2 колони, или както там решите да наречем линиите от дадено измерение. Общо 256 парчета. В едно от парчетата има паричка. Осемизмерен куб (октеракт) е проста концепция, но трудно се визуализира в две измерение. Това е апроксимация на това как би изглеждала октерактна баница с късмети. ![](/media/resources/banica.png) Вашата задача е да напишете функция `lucky`, която да връща адреса на парчето с паричка. Очакваме адресът да е цяло число (`int`) от 0 до 255, което представено в двоичен код представлява адрес в осем-мерната баница, на който е паричката. Например, ако функцията върне 42, неговата репрезентация в двоична система е `101010`. За да довършим адреса допълваме до 8-битово число, като запълним левите битове с нули: `00101010`. Това е адресът в баницата, който смятате, че крие паричката. Всеки бит от числото показва позиция в един от осемте разреза, които са направени, за да се разреже баницата. За да определите къде е късмета, можете да извикате една функция, която да ви помогне. Функцията се казва `clue` и се намира в модул `secret`. Можете да я импортирате с `from secret import clue`. Имате право да извикате функцията `clue` само 4 пъти. Всяко извикване може да се направи с един от 4 именувани аргумента, **като всеки аргумент може да се ползва само веднъж**. Нямате право да викате функцията повече от веднъж с даден аргумент. Вариантите са следните: * `left_shift` - извиквате функцията с именуван аргумент `left_shift`, чията очаквана стойност е **цяло число не по-малко от 5**. Функцията ще върне цяло число, което се получава като резултат от адреса с късмета, след прилагане на побитовото изместване в ляво с подадения брой позиции. Досещате се, че след като изместим адреса в ляво, се получават повече от 8 бита. След изместването на адреса, той отново се свежда до 8 бита, като всичко след най-десните 8 отпада. Например: ``` # Адресът с късмет е 42 (00101010) clue(left_shift=6) # 128 # 00101010 изместено в ляво с 6 бита е 101010000000 # взимат се само на-десните 8 бита - 10000000 # 10000000 e двоичен запис за 128 ``` * `right_shift` - извиквате функцията с именуван аргумент `right_shift`, чията очаквана стойност е **цяло число не по-малко от 5**. Функцията ще върне цяло число, което се получава като резултат от адреса с късмета, след прилагане на побитовото изместване в дясно с подадения брой позиции. Тук няма опасност да се получат повече от 8 бита. Например: ``` # Адресът с късмет е 42 (00101010) clue(right_shift=5) # 1 # 00101010 изместено в дясно с 5 бита е 001 # 001 e двоичен запис за 1 ``` * `bw_and` - извиквате функцията с именуван аргумент `bw_and`, чията очаквана стойност е **цяло число, чиято двоична репрезентация съдържа не повече от една единица**. Функцията ще върне цяло число, което се получава като резултат от адреса с късмета, след прилагане на побитовото AND с подаденото цяло число. Например: ``` # Адресът с късмет е 42 (00101010) clue(bw_and=8) # 8 # 8 се репрезентира като 1000 # прилагане на битово AND между 1000 и 00101010 дава 00001000, което е 8 в десетична система ``` * `bw_or` - извиквате функцията с именуван аргумент `bw_or`, чията очаквана стойност е **цяло число, чиято двоична репрезентация съдържа не повече от една нула**. Функцията ще върне цяло число, което се получава като резултат от адреса с късмета, след прилагане на побитовото OR с подаденото цяло число. Например: ``` # Адресът с късмет е 42 (00101010) clue(bw_or=223) # 255 # 223 се репрезентира като 11011111 # прилагане на битово OR между 11011111 и 00101010 дава 11111111, което е 255 в десетична система ``` Ако извикате функцията `clue` с даден позиционен аргумент повече от веднъж, ще се възбуди някакво изключение. Същото важи и ако не спазите специалните правила за стойностите зад именуваните аргументи (поне 5 позиции за шифтване и не повече от 1 нула/единица съответно за OR/AND аргументите). Дори да извикате функцията с невалидна стойност зад даден аргумент, което ще породи изключение, това се брои за извикване, така че няма да имате право да извикате функцията пак с друга стойност зад този аргумент. Във всички примери адресът на късмета е 42, така че се очаква вашата функция да върне 42: ``` lucky() # 42 ```
 1import io
 2import sys
 3import unittest
 4
 5
 6class StdBuffer:
 7    def __init__(self):
 8        self.buffer = io.StringIO()
 9
10    def __enter__(self):
11        self.stds = sys.stdin, sys.stderr, sys.stdout
12        sys.stdin = self.buffer
13        sys.stderr = self.buffer
14        sys.stdout = self.buffer
15
16    def __exit__(self, *args, **kwargs):
17        sys.stdin, sys.stderr, sys.stdout = self.stds
18
19
20with StdBuffer():
21    # Creating a clue instance that the solution expects
22    import secret
23    secret.clue = secret.Clue(0)
24    import solution
25
26
27class TestLuck(unittest.TestCase):
28
29    def test_lucky(self):
30        self.assertIn('lucky', dir(solution),
31                      'Убеди се, че имаш функция "lucky"')
32
33
34if __name__ == "__main__":
35    unittest.main()
 1import unittest
 2from importlib import reload
 3
 4import secret
 5secret.clue = secret.Clue(0)
 6import solution
 7
 8
 9class TestLucky(unittest.TestCase):
10    """Test lucky function."""
11
12    def separate_test(self, value):
13        """Perform a separate test and reload the modules for the next one."""
14        # Normally mocking will do, but students can
15        # import clue using various ways:
16        #    import secret
17        #    from secret import clue
18        #    from secret import clue as something_else
19        # First two cases can be covered, but the third one cannot be covered
20        # easily using mock, so let's do some monkey patching instead
21        reload(secret)
22        secret.clue = secret.Clue(value)
23        reload(solution)
24        self.assertEqual(solution.lucky(), value)
25
26    def test_lucky(self):
27        """Test with various cases."""
28        # All tests in a single test case so that only 100% gives a point
29        self.separate_test(0)
30        self.separate_test(255)
31        self.separate_test(42)
32        self.separate_test(69)
33
34
35if __name__ == '__main__':
36    unittest.main()
Дискусия
Георги Балтиев
22.12.2024 16:08

Здравейте, имам бърз въпрос по условието. Всеки kwarg от посочените може да се ползва точно веднъж ако се извиква, но може ли value стойностите да бъдат повтаряни - тоест да извикам right\_shift и left\_shift със 7 примерно?
Нишка
Виктор Бечев
22.12.2024 17:28

`clue` не следи стойностите, няма проблем.
Илиан Запрянов
13.12.2024 16:09

Да бе, Ивайло, давай им идеи, давай им
Нишка
Ивайло Кънчев
13.12.2024 18:11

Другият път си поръчвам безкраен генератор споко
Георги Кунчев
13.12.2024 18:55

Say no more... С малко регекс, нали?
Илиан Запрянов
13.12.2024 21:25

Тъй като наскоро имаше форумче с предложения за подобрения по сайта, моето е Ивайло да бъде баннат.
Ивайло Кънчев
13.12.2024 21:30

Ще кажа на Виктор кой му отправи заплахата в презентация 8, слайд 17
Калоян Марков
13.12.2024 21:48

Може ли да си правите секстинга на личен чат, благодаря предварително!
Йоан Байчев
13.12.2024 22:56

Знаете ли защо жабата скача по-високо от Айфеловата кула?
Илиан Запрянов
13.12.2024 23:02

Защо, моля те кажи ми
Ивайло Кънчев
13.12.2024 23:03

тоя е от Перник, избягвайте го моля
Калоян Марков
13.12.2024 23:22

Нека носим йоще срама по челото, синила от бича, следи от теглото; нека спомен люти от дни на позор да висне кат облак в наший кръгозор; нека ни отрича исторйята, века, нека е трагично името ни; нека Беласица стара и новий Батак в миналото наше фърлят своя мрак; нека да ни сочат с присмехи обидни счупенте окови и дирите стидни по врата ни още от хомота стар; нека таз свобода да ни бъде дар! Нека. Но ний знаем, че в нашто недавно свети нещо ново, има нещо славно, що гордо разтупва нашите гърди и в нас чувства силни, големи плоди; защото там нейде навръх планината, що небето синьо крепи с рамената, издига се някой див, чутовен връх, покрит с бели кости и със кървав мъх на безсмъртен подвиг паметник огромен; защото в Балкана има един спомен, има едно име, що вечно живей и в нашта исторья кат легенда грей, едно име ново, голямо антично, като Термопили славно, безгранично, що отговор дава и смива срамът, и на клеветата строшава зъбът. О, Шипка! Три деня младите дружини как прохода бранят. Горските долини трепетно повтарят на боя ревът. Пристъпи ужасни! Дванайсетий път гъсти орди лазят по урвата дива и тела я стелят, и кръв я залива. Бури подир бури! Рояк след рояк! Сюлейман безумний сочи върха пак и вика: "Търчете! Тамо са раите!" И ордите тръгват с викове сърдити, и "Аллах!" гръмовно въздуха разпра. Върхът отговаря с други вик: ура! И с нов дъжд куршуми, камъни и дървье; дружините наши, оплискани с кърви, пушкат и отблъскват, без сигнал, без ред, всякой гледа само да бъде напред и гърди геройски на смърт да изложи, и един враг повеч мъртъв да положи. Пушкалата екнат. Турците ревът, насипи налитат и падат, и мрът; - Идат като тигри, бягат като овци и пак се зарвъщат; българи, орловци кат лъвове тичат по страшний редут, не сещат ни жега, ни жажда, ни труд. Щурмът е отчаян, отпорът е лют. Три дни веч се бият, но помощ не иде, от никъде взорът надежда не види и братските орли не фърчат към тях. Нищо. Те ще паднат, но честно, без страх - кат шъпа спартанци под сганта на Ксеркса. Талазите идат; всичките нащрек са! Последният напън вече е настал. Тогава Столетов, наший генерал, ревна гороломно: "Млади опълченци, венчайте България с лаврови венци! на вашата сила царят повери прохода, войната и себе дори!" При тез думи силни дружините горди очакват геройски душманските орди бесни и шумещи! О, геройски час! Вълните намират канари тогаз, патроните липсват, но волите траят, щикът се пречупва - гърдите остаят и сладката радост до крак да измрът пред цяла вселена, на тоз славен рът, с една смърт юнашка и с една победа. "България цяла сега нази гледа, тоя връх висок е: тя ще ни съзре, ако би бегали: да мрем по-добре!" Няма веч оръжье! Има хекатомба! Всяко дърво меч е, всякой камък - бомба, всяко нещо - удар, всяка душа - плам. Камъне и дървье изчезнаха там. "Грабайте телата!" - някой си изкряска и трупове мъртви фръкнаха завчаска кат демони черни над черний рояк, катурят, струпалят като живи пак! И турците тръпнат, друг път не видели ведно да се бият живи и умрели, и въздуха цепят със демонский вик. Боят се обръща на смърт и на щик, героите наши като скали твърди желязото срещат с железни си гърди и фърлят се с песни в свирепата сеч, като виждат харно, че умират веч... Но вълни по-нови от орди дивашки гълтат, потопяват орляка юнашки... Йоще миг - ще падне заветният хълм. Изведнъж Радецки пристигна със гръм. . . . . . . . . . . . . . . . . . . . . . . . . . . . И днес йощ Балканът, щом буря зафаща, спомня тоз ден бурен, шуми и препраща славата му дивна като някой ек от урва на урва и от век на век!
Ивайло Кънчев
13.12.2024 23:26

ти нямаше ли контролно утре
Йоан Байчев
13.12.2024 23:33

Утре с Лагранж 1 в 1
Ивайло Кънчев
13.12.2024 23:37

Аз нз как не са ни баннали още
Йоан Байчев
13.12.2024 23:37

За тебе се моля да те баннат
Ивайло Кънчев
13.12.2024 23:40

Примерна дефиниция на клас в UML • Класовете, създавани по време на Обектно-Ориентирания (ОО) анализ, обикновено имат непълни дефиниции и представят бизнес обекти и подсистеми в реалната система • Тези класове на анализа се използват в ОО дизайн, където обикновено се представят с множество класове на дизайна, използващи конкретна платформа за имплементацията на системата
Виктор Бечев
14.12.2024 14:40

:rofl: "Когато нямаш оферта за петък вечер, ама ти все пак решиш да си пиеш сам в общака."
Калоян Марков
14.12.2024 18:53

Как минаха числените методи, Ивайло Кънчев, Йоан Байчев и Илиан Запрянов
Ивайло Кънчев
14.12.2024 19:50

Как мина УП-то Калоян Марков? Съжалявам, че не покрещях и на тебе
Илиан Запрянов
16.12.2024 22:45

Нишката умря, момчета, събуди се, народе! https://www.youtube.com/watch?v=UZUofg0yh7o