[C# Exam] 11 Feb 2013 - Fake Text Markup Language


6

Условие на задачата:

 

Problem 4 – Fake Text Markup Language

Joro's trying to top the leaderboard on "weirdest things by the lectors" (yep, couldn't think of a better translation). Last time he used Paint for a color picker on a CSS lecture, now he's inventing a whole new markup language – the Fake Text Markup Language. It looks a bit like HTML – it has opening and closing tags, and those tags define the formatting of text… on the console! So, if we receive an FTML formatted text, we need to print the text content according to the following rules:

·         Tags can be opening and closing, e.g.: <upper> and </upper>

·         Tags can be nested, e.g.: <upper> this is a <lower> nested tag</lower>  in another tag </upper>

·         Nesting is measured in "depth", in this case <lower> is deeper than <upper>

·         Tags cannot "intersect", e.g.: <upper> this is <lower> very </upper> wrong </lower> is not valid

·         Tags don't appear in the resulting text, but they affect it

·         When tags are nested, the effect of the "deepest" is considered first, then the effect of the less deeper and so on

o   e.g.: <upper>Before nested <lower>Inside nested</lower> After nested</upper>
will apply the effects of <lower> and then of <upper>

o   The end result will be: BEFORE NESTED INSIDE NESTED AFTER NESTED

·         The <upper> tag converts text to its uppercase variant

o   e.g.: <upper>tExT</upper> results in: TEXT

·         The <lower> tag converts text to its lowercase variant

o   e.g.: <lower>tExt</lower> results in: text

·         The <toggle> tag:

o   if a character is uppercase, it converts it to lowercase

o   if a character is lowercase, it converts it to uppercase

o   e.g. <toggle>tExT<toggle> results in: TeXt

·         <upper>, <lower> and <toggle> tags don't affect punctuation or whitespaces

·         The <del> tag deletes all text in it

o   e.g.: this is <del> this is deleted </del> some text results in: this is some text

·         The <rev> tag reverses all text in it

o   e.g.: 123 reversed is <rev>123</rev> results in: 123 reversed is 321

·         The FTML keeps all whitespaces and new lines (it doesn't remove them like HTML)

o   the only exception is, obviously, the <del> tag

Write a program, which formats code, according to the rules described.

Input

On the first line of the input, there will be the number N – the number of lines in the FTML text.

On each of the next lines there will be a line of the FTML text, consisting of English letters, punctuation and whitespaces (and of course FTML tags)

Output

On the console, you should print the lines of the formatted text.

Constraints

·         0 < N < 500

·         The text input will NOT contain any '<' or '>', other than the ones for the tags

·         Allowed working time for your program: 0.1 seconds. Allowed memory: 16 MB.

Examples

Input example

Output example

2

So<rev><upper>saw</upper> txet em</rev>

<lower><upper>here</upper></lower>

Some text WAS

here

3

<toggle><rev>ERa</rev></toggle> you

<rev>noc</rev><lower>FUSED</lower>

<rev>?<rev>already </rev></rev>

Are you

confused

already ?

 

И моето решение, което за съжаление довърших в къщи поради липсата на време на изпита. Принципно смятам, че времето на този изпит въобще не достига. Мисля, че е редно догодина да бъде поне с 1 час отгоре. Все пак не сме програмисти с 10+ years experience.

http://pastebin.com/ffL0jEcn

В кода съм сложил достатъчно коментари за да е ясно каква е логиката.

Основната идея е да се прочете целия вход (заедно със символите за нов ред)  в един буфер. После този буфер се подава на рекурсивен метод, който го "декодира". За всяка срещната двойка тагове методът извиква сам себе си с текста между тях.




Отговори



0

Ето и едно предизпитно решение и от мен. Задачката ми отне доста време защото реших да я направя с регулярни изрази а доскоро изобщо нищо не знаех за тях. В крайна сметка се получи някаква смесица от регулярни изрази и нормални string операции.

В началото ползвах MatchCollection но като видях че гърми на 8 тест го смених с по-пестелив Match вариант. Като цяло идеята ми беше да обхождам таговете докато намеря два допълващи се последователни и след това променя стринга към който се отнасят. След това почвам да чета тагове отначало докато пак намеря попадение и така докато таговете не свършат.

Кодът ми е тук.

*Edit* Четейки кода на колегите преди мен успях да си съкратя решението още повече и стана на това - Версия2




0
Супер си го измислил ! Аз също се мъчих с regex, но твоето (особенно 2рото) е станало къде по-елегантно :)

от dzhenko (3893 точки)

0
Коментарите в затворената тема имат доста насоки къде да търсиш информация за основите на Regex. Ето ти още един сайт където има информация по въпроса - http://www.regular-expressions.info/quickstart.html . Книгата на Наков относно .Net програмиране също има цяла глава за тях, нея може да я намериш тук http://www.devbg.org/dotnetbook/Nakov-Programming-.NET-Framework-Book-Volume-1-ver-1.03.html#_Toc116671746 . Като друго допълнение ако си търсиш информация и вече знаеш малко как се работи с изразите, тук може да си намериш някой изрази специфични за C# http://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx .
Относно това което аз съм написал, мога да ти го разбия на части. Целият патерн е <(?