skip to navigation
skip to content

feed icon RSS хранилка

Трета задача

Публикувано на 29.03.2008 23:36 от Митьо
Последна промяна на 06.04.2008 11:51
Тази публикация е от предишно издание на курса, моля не разчитайте на актуалността на информацията.

Брой точки, които дава задачата: 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-библиотеки като Тк, както и много други.

Връзки

Можете да намерите повече информация на следните места:

python@example.org
http://fmi.py-bg.net/
http://python.org/

Уточнения и подсказки

  • Тази задача е относително по-трудна от предните две. Не се притеснявайте да задавате въпроси на форума. Но все пак, преди да го направите, проверете много, много добре дали примерът и горните условия не ви отговарят на въпросите.
  • Няма такова нещо като невалиден вход. Ако някъде срещнете странен низ - *а*б_в_г_ просто не го обработвате.
  • Няма значение къде във изходния текст поставяте знаци за нови редове и интервали. Т.е., няма значение дали ще върнете "<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%, но поне ще ви гарантира, че не сте допуснали глупава грешка, която да ви коства всички точки.