[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
Извинявам се, че използвам темата ти, но не искам да отварям нова: системата в момента дава "In queue" статус нали, т.е. решението ми не се обработва все още?

от vlad_karamfilov (4595 точки)


0
Да, но полека-лека започва да обработва подадените заявки. И между другото, решението ми има само един верен тест. Ще трябва явно да си "допаса козите" :)

от psotirov (492 точки)


1
И аз малко встрани от въпроса ти ще се изкажа.
Искам да поздравя всички колеги и колежки( и по-специално една от тях, тя си знае коя е), които днес изкараха прилични точки на изпита по C#. Браво момци и девойки доказахте, че сте вложили много труд и енергия в подготовката си за изпита и заслужено пожънахте успех.
Време е за изпита по CSS, стягайте се близо е заветната цел.



0
Хаахах тази задача ми вгорчи живота и на мен, имах 2 решени задачи преди 2рия час мисля и останалото време не можах да взема повече от 30-40 точки на тая задача, като преправих голяма част от нещата по няколко пъти и накрая 15-20 мин педи края чак зацепих защо се чупи и че съм поправял вярната част, в крайна сметка реших да не рискувам и 5 мин преди края си предадох решението за 50 точки и си тръгнах с подвита опашка :). Резултата е +20 точки за 2 часа и половина ...което ме навява на мисълта че не съм си взел поука и като забия на някоя задача просто не мога да я оставя и да хвана да решавам друга ... Между другото поздравления за човека с 500 точки, това е правилният начин да се взимат изпити ;)

от kirotab (219 точки)


0
Реших преди 40-50 минути да си дореша задачата от днес и след като я минах поне 3-4 пъти през дебъгера осъзнах че не съм направил една елементарна и задължителна проверка, ако няма никакви тагове или не свършва с таг просто не принтирам текста ... 2реда код ще са ми наистина за урок, а на всеки изгубил 1-2 минути да прочете поста се извинявам че съм му загубил времето :)

от kirotab (219 точки)


0
Друга задача същата ситуация, аз вече си ги ям ... Поради лошо разпределение на времето "Раббит Джоро" оставих 20мин. реших я за 21мин. и съответно изпуснах bgcoder-a целенасочено не пипах нищо по задачата за да я пусна днес като отворят тестовете - 75 точки .... (headbang) За 1 мин. ... страшна тъпотия ...

от vlad0 (6103 точки)


0

Здравейте, имам въпрос относно тази задача - ето и моето решение, което дава 60 / 100  http://pastebin.com/Bi5BKqtP - на 8, 9 и 10 тест дава Time Limit - тука ясно че нещо съм сбъркал, но на 6 тест ми дава грешен отговор, а като си сравня моя отговор и това от теста output-a е индентичен :

Някакви идея защо дава грешен отговор ? 

от Hachiko (380 точки)


0
При добавяш нов ред, когато съдържанието на тага е на 2 реда. В случая с 6 тест: errors. no more.........
Твоят резултат:
errors. elpmaxe
roF no more..........
Не знам дали е проблем свързан с новия ред: http://www.youtube.com/watch?v=YKdrRt-hpb8&feature=player_detailpage#t=3916


0
Не се бях сетил за това, ако тагът е на 2 реда, но пак не виждам никаква разлика с отговора от теста.И не виждам да добавям нов ред, явно нещо не го разбирам, но 60 точки не са малко

от Hachiko (380 точки)



2

Има нещо счупено във някой от входните тестови файлове... просто не знам как изкарвате 100/100 точки...

Ето го моето решение: http://pastebin.com/uy1yD7Ti

Идеята да броя знак по знак целия текст не ме изкефи поначало. Тръгнах по съвсем различен алгоритъм. Търся първия срещнат ЗАТВАРЯЩ таг. После от него НАЗАД намирам първия отварящ от същия вид (с'я кат се замисля ... няма значение вида - той ще е от същия вид, иначе ще противоречи на условието). Така съм сигурен че съм хванал най-вътрешния "комплект", ако има вложени тагове.
Няма рекурсии, няма броячи за вложеност... абе приказка.

После извършвам действието което ми е определено от тага и замествам таговете (вкл. и  текста между тях) с вече обработения текст.

И това го повтарям докато в текста има нещо като таг (търся знака "<").

Обаче... примерно в 10-ти тест гърми. Изтеглих си тестовите данни. Оказва се че ми изпуска точно 1 таг <toggle> (всъщност са няколко, защото текста се повтаря няколко пъти един и същ в теста). Но изпуска САМО ЕДИН.  Всички видове други тагове ги "предъвква". Предъвква и почти всички <toggle> тагове освен един (повтарящ се неколкократно, но на една и съща позиция в текста). За намирането на таговете разчитам на "вградените" команди .IndexOf и .LastIndexOf. Няма никаква самодейност от моя страна в тая област. Намира всички други тагове без един. Нямам обяснение.

Алгоритъма се получи много стегнат, кратък. Да, бавен е защото ползвам string, но това в последствие може да се модифицира. Но не ми се занимава ако е сбъркана логиката на програмата. А аз просто не виждам защо ще изпуска само един таг, само на определено място.


от JulianG (5316 точки)


0
Може би си няма другарче (затварящ таг) и се разглежда като прост текст...

от martin.nikolov (4535 точки)

0
В условието пише, че в текста няма да има символите < и > . Отделно преброих всички отварящи и затварящи

от JulianG (5316 точки)


2
Eeeee, нееее.... ще си тегля ножа направо.... :)
Първо - конзолата разрешава Input само до 255 знака. Тестовете с които работи bgcoder-a имат редове по-дълги от 255 знака, това препълва буфера й и програмата тотално я фаща диарията...
После ... някаква необяснима за мен странност показва bgcoder-а. Мен ми е ясно че т'ва чудо сравнява байт по байт резултата с тестовия файл, но предполагам бая хора са загубили точки на изпита точно от това.
Когато чета от "конзолата" данните и ги пъхам в стринг билдера, след всеки ред добавям знак "нов ред". По дебелите книги пише и в лекциите са ни казвали, че знака за нов ред е Environment.NewLine. Демек аз си чета ред по ред и блъскам в стринбилдера така:
sb.Append(Console.ReadLine()+ Environment.NewLine);

"Да, да... ама... НЕ!" както казваше един водещ в далечното минало... Правилния според bgcoder синтаксис е следния:
sb.Append(Console.ReadLine()+ "\n");
Цял ден си загубих с тая пущина... вече имам 90/100 точки и един тайм лимит, който мисля че лесно мога да оправя, но ... ми се срина настроението.
А още по-странното (и това което всъщност ме заблуди да търся грешката в друга посока) е че че 1/2 от тестовете минават и с единия и с другия вариант :)

от JulianG (5316 точки)


0
Входните данни на теста, който ти дава тайм лимит са некоректни - редовете са 540 при ограничение 500. Интересното е, че ако се сравнят резултатите от кодът ти тук http://pastebin.com/uy1yD7Ti и резулатата от тест 6 като char[] масиви са 1:1 (с изключение на последния празен ред (два символа), който не оказва влияние върху теста - дори да сложиш символите към крайният резултат пак го дава некоректен). Когато кодът се промени с "sb.Append(Console.ReadLine()+ "\n");" и вече не гърми пак дава същият изходен резултат като char[] масив. А разликата между \r, \n, \r\n, Environment.NewLine and (char)13 можеш да видиш тук: http://social.msdn.microsoft.com/Forums/en-US/47af2197-26b4-4b9e-90e8-bfa9d5cd05b4/what-is-the-deference-between-r-n-and-rn- И аз не мога да си обясня защо гърми, освен да има някакво препредаване между различни операционни системи. Би било добре някой от трейнърите да каже нещо специално за тази задача.
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192))); - това ти вдига броят на входните символи на ред до 1022.

от Drago (711 точки)

0
На колегата започнал темата решението минава със 100/100, а върти в цикъл Console.ReadLine(). Явно броя редове са коректни. Дори и в задачата да има указано някакво ограничение, аз не се интересувам от него (или поне не виждам да съм се интересувал в кода :) ) така че проблема не е оттам. Пробвах различни хитринки за сваляне под ограничението за време, на което се дъня. Стигнах дори до Parallel.For при

от JulianG (5316 точки)


0

Ето и моето решение. Харесвам регулярните изрази съм направил решението с тях. И мен ме прецакаха уловките, но за тази с новия ред се сетих сам. Ако някой все пак има идея как мога си направя решението да дава 100 точки без да го хвърлям на боклука, моля да сподели.


от dimo.petrof (2887 точки)


0
може би ако четеш ред по ред, вместо целия текст наведнъж, ще удариш 100. Но трябва да си пригодиш и regexa.

от d.brezoev (212 точки)

0
Моя проблем идва от това, че чета целия текст наведнъж, а твоя, че не го правиш :)

от dimo.petrof (2887 точки)



0

Радвам се че не само аз съм тръгнал да решавам тази задача с регулярни изрази. Ето го моето решение за 70 точки. Моите пропуски май идват от тестовете в които отварящ и затварящ таг са на различни редове. Ще погледна скоро твоя вариант дано да ми помогне да стигна поне до 90т.  и аз с regex :) А също така неможах да разбера защо ред 87-ми не ми работи. match.Nextmatch();  http://pastebin.com/YCifC1fM

E
dit: С корекциите от горния пост ето го и кода за 100 точки http://pastebin.com/hpVUQdnx


от d.brezoev (212 точки)


0

Здравейте,

Исках и да споделя мое решение което е с RegularExpressions, и е бих казал доста просто и мисля и бързо като решение.

Имах само един проблем който беше при реверсе. Тъй като \r\n ми ги пишеше като два нови реда а не като един. Което ест си беше доста гадно.

Малко чийтнах като тешавам защото когато принтирам на конзолата е правилено но когато е записано на файл тогава ми показва грешката.(странно)

Как решавам задачата като ги обхождам таговете от вътре на вънка за да може най- вътрешния таг да остане с най-малък приоритет. като изхода ми след като се проверят всички тагова и няма съвпадение тогава получаваме изхода.

Това е решението надявам се да ви се стори интересно.

4. Fake Text Markup Language


от emrah.bekir (85 точки)