Трета задача
Брой точки, които дава задачата: 5.
Краен срок: 14 април 2008г., 19:00 часа.
Условие
Напишете функция wiki(text)
, която да обработва специален markup език и да връща HTML. Подобно на Wikipedia. Входът е текст, в който някои специални символи/последователности от символи трябва да бъдат заменени с HTML етикети. Изходът е текстов низ съдържащ HTML код. Правилата на този език са следните:
- Параграфи и нови редове. Функцията трябва да връща последователност от параграфи, оградени с
<p> </p>
. Във входния текст, всеки нов ред да се замени с<br />
. Всяка последователност от повече от един нови редове да се замени с нов параграф. В текста не трябва да има празни параграфи. - Заглавия. Всеки ред, заграден с равно количество знаци за равно, да се трансформира в таг <hN>…</hN>, където N е броя на знаците равно. Празно място около знаците да се игнорира. Заглавието означава край на предходния параграф и след него трябва да започне нов.
- Курсив и почернен. Единични думи, заградени със
*
да бъдат ограждани със <strong>. Например*почернено*
, да се замести със<strong>почернено</strong>
. Аналогично, при дума заградена с_
да се ползва<em>
. Дума е всяка последователност от букви. Тези преобразувания се извършват и в заглавията. - URL-и. Всяко срещане на URL в текста да бъде заменяно с хипервръзка към него, например срещане на
http://www.google.com/intl/en/about.html
се замества с<a href="http://www.google.com/intl/en/about.html">http://www.google.com/intl/en/about.html</a>
. - Именовани URL-и. Срещане на стрингове като [http://fmi.py-bg.net/ Курсът по Python] да се замени с линк от вида
<a href="http://fmi.py-bg.net/">Курсът по Python</a>
. - Email адреси. Всяко срещане на email адрес да бъде заменяно с връзка за изпращане на мейл. Тоест, ако срещнете mityo@example.org, трябва да го замените с
<a href="mailto:mityo@exampe.org">mityo@exampe.org</a>
.
Пример
Ако имате следния текст като вход:
== Дефиниция ==
*Питон* (англ. _Python_, произнася се _Пайтън_) е интерпретируем, интерактивен, обектно-ориентиран език за програмиране, създаден от [http://www.python.org/~guido/ Гуидо ван Росум] в началото на 90-те години. Кръстен е на телевизионното шоу на BBC Monty Python’s Flying Circus. Често бива сравняван с Tcl, Perl, Scheme, Java и Ruby.
Питон предлага добра структура и поддръжка за разработка на големи приложения. Той притежава вградени сложни типове данни като гъвкави масиви и речници, за които биха били необходими дни, за да се напишат ефикасно на C. За разлика от Perl, мистичната променлива _ отсъства. Нито може да ползвате * за глобове.
=== Малко разяснения на *Python* ===
Питон позволява разделянето на една програма на модули, които могат да се използват отново в други програми. Също така притежава голям набор от стандартни модули, които да се използват като основа на програмите. Съществуват и вградени модули, които обезпечават такива неща като файлов вход/изход (I/O), различни системни функции, сокети (_sockets_), програмни интерфейси към GUI-библиотеки като Тк, както и много други.
== Връзки ==
Можете да намерите повече информация на следните места:
python@example.org
http://fmi.py-bg.net/
http://python.org/
Той трябва да се сведе до:
<h2>Дефиниция</h2>
<p><strong>Питон</strong> (англ. <em>Python</em>, произнася се <em>Пайтън</em>) е интерпретируем, интерактивен, обектно-ориентиран език за програмиране, създаден от <a href="http://www.python.org/~guido/">Гуидо ван Росум</a> в началото на 90-те години. Кръстен е на телевизионното шоу на BBC Monty Python’s Flying Circus. Често бива сравняван с Tcl, Perl, Scheme, Java и Ruby.</p>
<p>Питон предлага добра структура и поддръжка за разработка на големи приложения. Той притежава вградени сложни типове данни като гъвкави масиви и речници, за които биха били необходими дни, за да се напишат ефикасно на C. За разлика от Perl, мистичната променлива _ отсъства. Нито може да ползвате * за глобове.</p>
<h3>Малко разяснения на <strong>Python</strong></h3>
<p>Питон позволява разделянето на една програма на модули, които могат да се използват отново в други програми. Също така притежава голям набор от стандартни модули, които да се използват като основа на програмите. Съществуват и вградени модули, които обезпечават такива неща като файлов вход/изход (I/O), различни системни функции, сокети (<em>sockets</em>), програмни интерфейси към GUI-библиотеки като Тк, както и много други.</p>
<h2>Връзки</h2>
<p>Можете да намерите повече информация на следните места:</p>
<p><a href="mailto:python@example.org">python@example.org</a><br />
<a href="http://fmi.py-bg.net/">http://fmi.py-bg.net/</a><br />
<a href="http://python.org/">http://python.org/</a></p>
Което от своя страна, в браузър ще изглежда така.
Дефиниция
Питон (англ. Python, произнася се Пайтън) е интерпретируем, интерактивен, обектно-ориентиран език за програмиране, създаден от Гуидо ван Росум в началото на 90-те години. Кръстен е на телевизионното шоу на BBC Monty Python’s Flying Circus. Често бива сравняван с Tcl, Perl, Scheme, Java и Ruby.
Питон предлага добра структура и поддръжка за разработка на големи приложения. Той притежава вградени сложни типове данни като гъвкави масиви и речници, за които биха били необходими дни, за да се напишат ефикасно на C. За разлика от Perl, мистичната променлива _ отсъства. Нито може да ползвате * за глобове.
Малко разяснения на Python
Питон позволява разделянето на една програма на модули, които могат да се използват отново в други програми. Също така притежава голям набор от стандартни модули, които да се използват като основа на програмите. Съществуват и вградени модули, които обезпечават такива неща като файлов вход/изход (I/O), различни системни функции, сокети (sockets), програмни интерфейси към GUI-библиотеки като Тк, както и много други.
Връзки
Можете да намерите повече информация на следните места:
Уточнения и подсказки
- Тази задача е относително по-трудна от предните две. Не се притеснявайте да задавате въпроси на форума. Но все пак, преди да го направите, проверете много, много добре дали примерът и горните условия не ви отговарят на въпросите.
- Няма такова нещо като невалиден вход. Ако някъде срещнете странен низ -
*а*б_в_г_
просто не го обработвате. - Няма значение къде във изходния текст поставяте знаци за нови редове и интервали. Т.е., няма значение дали ще върнете
"<h1>Заглавие</h1><p>Някакъв текст</p>
или"<h1>Заглавие</h1>\n<p>\n Някакъв текст\n</p>
. Тестовете ни ще бъдат изключително толерантни към подобни вариации. Като правило на лявата ръка ползвайте, че ако изходът е хубав HTML, който изглежда правилно, то значи всичко е ОК. Интерпретирайте „хубав“ и „правилно“ според този текст и интуицията си :) - Отново, не трябва да има празни параграфи. Също, избягвайте параграфи започващи или завършващи на едно или повече
<br />
-та. Грешни примери са<p><br />Текст</p>
и<p>Текст<br /></p>
- Може да ползвате както
<br />
, така и<br/>
. Но не и <br >. - За курсива и получера, всяка последователност от букви е дума. В
имате ли *някакво* _сирене_?
трябва да направите две замествания (обърнете внимание на пунктуационните знаци). Извращения от рода на*spam*eggs*
или_митьо_питона_
(герой от предишното издание на курса) няма да има, така че може да ги третирате както си искате. - Няма да има комбинация от двете - _*python*_ или *_python_* -, така че може да реагирате на тях както ви е удобно.
- Етикетите за заглавие трябва да са извън етикетите за параграф.
- Приемете че URL е всичко, което започва с
http://
и продължава докато не стигне до празно място. Всички адреси в тестовете ни ще отговарят на това условие. Разбира се, няма да ви се разсърдим ако правите по-качествени проверки. niki.bachiyski@example.org
,layne_staley@example.org
иmityo+the+python@people.example.org
са все валидни адреси.mityo@python
не е.- Не се притеснявайте за бързодействието на вашата програма. Важно е да връща правилен резултат, а не да го прави много ефективно. Имайте предвид, че може да се наложи да обработите входа на няколко итерации/стъпки/pass-а.
- Трудно ще решите задачата без съществено количество регулярни изрази. Трудно ще решите задачата и само с регулярни изрази. Ползвайте най-доброто от двата свята.
- Един от начините да решите задачата е да разбиете входа на редове и да обработите всеки ред поотделно. Това не е нито единственият, нито „най-правилният“ начин.
- Под буква имаме предвид валиден символ от българската и английската азбука. Разбира се, не е проблем да хващате други азбуки (å, æ, ø, ü, ß например), но не е и задължително. С малко късмет, това би трябвало да се хваща о
\w
на вашите компютъри (със сигурност ще се хваща на нашите). Ако не работи, може да ползвате класът[\wа-яА-Я]
Оценяване
На задачата се възлагат 5 точки. Ако вашето решение са справя с примера тук, със сигурност ще получите поне три от тях. Разбира се, ще получите пълния брой точки ако сте били внимателни.
Отделно, даваме до 3 точки бонус за елегантни решения. В нашия речник, „елегантни“ значи „кратки, правилни и четими“, а не „бързи и ефективни“. Това, разбира се, ще определим субективно. Като ценители на красивия код, искаме да дадем бонуси на неговите автори. Ако смятате, че сте сътворили елегантно решение и искате да се пробвате за бонус точките, то моля дайте си факултетния номер в тази тема на форумите.
Примерен тест
Примерният тест идва в два варианта Коригираните варианти на примерния тест:
Ако ползвате windows и IDLE ви трябва първата версия. Повече за кодировките и отношението им към Python ще научите на лекцията в сряда.
Тестът може да изпълните като свалите файла, заедно с него в една директория запазите своето решение, именувано p3.py
и изпълните p3-sample-xxx.py
. Крайната ви цел е да получите OK някъде из резултата.
Тестът не гарантира, че сте си решили задачата на 100%, но поне ще ви гарантира, че не сте допуснали глупава грешка, която да ви коства всички точки.