- Коректно
- 3 успешни тест(а)
- 0 неуспешни тест(а)
... ---------------------------------------------------------------------- Ran 3 tests in 0.462s OK
Срокът за предаване на решения е отминал
Предизвикателството е просто - искаме от вас да направите безкраен генератор на хайку редове.
Mandatory wikipedia quote:
Хайку е най-късата поетична форма в световната литература. Въпреки че се състои само от три реда, съдържащи съответно 5 – 7 – 5 срички, то може да изрази и дълбоко чувство, и проблясък на интуицията. В хайку няма символи. То отразява живота в неговото свободно движение. Притежава чистотата, завършеността и дори празнотата на една музикална нота.
За нашите цели, фокусът ще е единствено върху правилната форма на хайкутата:
Кратък хайку ред
Леко дълъг хайку ред
И пак пет срички
С цел да не ви вкарваме в сферата на лексикалния анализ, решихме, че е по-добре да пишете хайкута на български, отколкото на английски (колко срички има в думата "through"?). Обмисляхме японски, но решихме, че няма да можем да прочетем творбите ви лесно, затова останахме на български.
С други думи - една сричка се определя от наличието на гласна буква. Правилата за сричкуване са малко по-сложни от това, но тъй като нас няма да ни вълнува дали сричките са отворени или затворени, как точно разцепваме съгласните и прочие, а само колко са на брой - правилото "гласна = сричка" ни върши работа:
Искаме генераторът generate_haiku_lines(corpus)
да работи по следния начин:
corpus = {'мъгла': ['пада', 'непротивоконституционствувателствувайте'], ..., 'пада': ['тук', 'някъде'], ...}
haiku_writer = generate_haiku_lines(corpus)
next(haiku_writer) # Мъгла пада тук -> 5 срички
next(haiku_writer) # Мъгла пада някъде -> 7 срички
# следващият пак би бил 5 срички
corpus-ът е речник, индикиращ кои думи се срещат често в последователност - "мъгла" и "пада", както и "мъгла" и "непротивоконституционствувателствувайте" често се използват в комбинация. Перифразирано - всяка дума, която е ключ на речника, показва какви са възможните думи, които да стоят след нея.
Искаме да използваме тази информация, за да генерираме последователно хайку редове от по 5, 7, 5 срички, използвайки тази дефиниция на логическите връзки между думите. Забележете, че първата буква на всеки хайку ред е Главна.
corpus = {'първата': ['ми'], 'ми': ['работа', 'двайсет'], 'работа': ['беше'], 'беше': ['да', 'страшен'], 'да': ['вдигна', 'бъда', 'не', 'не', 'легализирам', 'го', 'напишеш'], 'вдигна': ['бензина'], 'бензина': ['с'], 'с': ['лев', 'тия', 'тая'], 'т': ['за'], 'за': ['мене', 'мен,', 'гласа,', 'това', 'всичко', 'всичко'], 'мене': ['беше'], 'страшен': ['кеф'], 'от': ['тоя'], 'тоя': ['лев', 'чичко'], 'лев': ['седемдесет'], 'седемдесет': ['стотинки'], 'стотинки': ['са'], 'са': ['за'], 'мен,': ['а'], 'а': ['трийсете'], 'трийсете': ['ги'], 'ги': ['нося'], 'нося': ['лично'], 'лично': ['на', 'депутата', 'депутата'], 'на': ['асен', 'дългия,', 'дебелия', 'двамата'], 'знам,': ['няма'], 'няма': ['как'], 'как': ['да', 'успя'], 'бъда': ['кратъки'], 'кратъки': ['да'], 'не': ['спомена', 'те', 'наяде'], 'спомена': ['нещо'], 'нещо': ['мило'], 'мило': ['за'], 'гласа,': ['който'], 'който': ['лекува'], 'лекува': ['запек'], 'чува': ['се'], 'се': ['десислава'], 'десислава': ['атанасова'], 'атанасова': ['шефке,'], 'шефке,': ['мно'], 'мно': ['ме'], 'ме': ['кефиш'], 'кефиш': ['с'], 'тия': ['твоите'], 'твоите': ['цайси', 'хора'], 'заклевам': ['се,'], 'се,': ['при', 'ма', 'ето'], 'при': ['други'], 'други': ['обстоятелства'], 'обстоятелства': ['сеш'], 'сеш': ['се'], 'копейка,': ['к'], 'к': ['е'], 'е': ['твоята', 'вкусен', 'една', 'да', 'виновен', 'виновен'], 'твоята': ['прогноза'], 'хора': ['ще'], 'ще': ['си', 'си', 'ти'], 'си': ['праснат', 'траем,'], 'праснат': ['ли'], 'ли': ['четвърта', 'е', 'се', 'се,'], 'четвърта': ['доза'], 'догодина': ['обещавам'], 'обещавам': ['да'], 'те': ['тормозя'], 'дай': ['ми'], 'двайсет': ['гласа'], 'гласа': ['да'], 'легализирам': ['коза'], 'траем,': ['красива'], 'красива': ['резиденция,'], 'резиденция,': ['знаем,'], 'знаем,': ['обичам'], 'обичам': ['възрожденци'], 'възрожденци': ['под'], 'под': ['наем'], 'последно,': ['кажи'], 'кажи': ['честно,', 'честно'], 'честно,': ['мон'], 'мон': ['амур,'], 'амур,': ['толко'], 'толко': ['ли'], 'вкусен': ['този'], 'този': ['руски'], 'руски': ['шнур'], 'ей,': ['бройлер,'], 'бройлер,': ['ще'], 'ти': ['купя', 'помогна,'], 'купя': ['бойлер'], 'нека': ['ти', 'сам'], 'помогна,': ['стига'], 'стига': ['с'], 'тая': ['мизерия'], 'това': ['е', 'нека'], 'една': ['мистерия'], 'мистерия': ['как'], 'успя': ['да'], 'го': ['поемеш', 'тоя', 'вече'], 'поемеш': ['целия'], 'целия': ['едновременно'], 'едновременно': ['и'], 'и': ['на', 'на', 'нищо'], 'дългия,': ['и'], 'моята': ['лесна,'], 'лесна,': ['има'], 'има': ['аерогара'], 'трудното': ['е'], 'напишеш': ['коментара'], 'сам': ['изям'], 'изям': ['кафявата'], 'кафявата': ['попара'], 'попара': ['в'], 'в': ['държавата'], 'държавата': ['на'], 'двамата': ['шопара'], 'виж': ['кво,', 'кво,'], 'кво,': ['според', 'според'], 'според': ['мен', 'мен'], 'мен': ['за', 'за'], 'всичко': ['е', 'е'], 'виновен': ['лично', 'лично'], 'депутата': ['христо', 'христо'], 'честно': ['побърка'], 'побърка': ['ли'], 'батко': ['не'], 'наяде': ['се,'], 'ма': ['поне'], 'поне': ['наспа'], 'наспа': ['ли'], 'ето': ['продаде'], 'продаде': ['се'], 'мани': ['го'], 'ей': ['го'], 'вече': ['8'], '8': ['месеца'], 'месеца': ['и']}
haiku_writer = generate_haiku_lines(corpus)
for i in range(1, 10):
print(next(haiku_writer))
if i % 3 == 0:
print('\n') # За визуално разграничаване
# Output:
Лев седемдесет
Попара в държавата
Кво според мен за
Виновен лично
Вкусен този руски шнур
Заклевам се при
Ей го поемеш
Да вдигна бензина с лев
Нека сам изям
{'биатлонистите': ['стачкуваха'], 'стачкуваха': ['твърде'], 'твърде': ['целеустремено', 'противоконституционно']}
- в този речник няма никаква комбинация от думи, която да дава 5 или 7 срички).{'дюнера': ['е', 'тигана'], 'е': ['тука'], 'тигана': ['има'], 'има': ['праскови', 'е']}
- греда... но всъщност има няколко валидни реда - "тигана има", "има праскови", "има е тука").... ---------------------------------------------------------------------- Ran 3 tests in 0.462s OK
... ---------------------------------------------------------------------- Ran 3 tests in 0.037s OK
... ---------------------------------------------------------------------- Ran 3 tests in 0.035s OK
... ---------------------------------------------------------------------- Ran 3 tests in 0.035s OK
.E. ====================================================================== ERROR: test_minimal (test.TestHaikuGenerator) ---------------------------------------------------------------------- Traceback (most recent call last): File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 63, in thread raise TimeoutError TimeoutError ---------------------------------------------------------------------- Ran 3 tests in 2.034s FAILED (errors=1)
... ---------------------------------------------------------------------- Ran 3 tests in 0.044s OK