Task 2 Sequence (JA3 Task 2 Copy Paste)
Здравейте!
По повод Task 2 от Judge.
Моля за малко съдействие по повод разясняване на какво се иска и как се иска. Както се вика, четох, четох, ама положението е "изгубени в превода" :D
Здравейте!
По повод Task 2 от Judge.
Моля за малко съдействие по повод разясняване на какво се иска и как се иска. Както се вика, четох, четох, ама положението е "изгубени в превода" :D
Привет!
Имаш два вида команди - copy и paste.
1. Copy - получаваш два индекса, условно ще ги именувам leftIndex и rightIndex. Тези индекси никога няма да попадат в space, но може да са извън дължината на текста т.е. leftIndex < 0 и rightIndex >= text.size().
Целта е не да вземеш като text.substr() тези интдекси, а първо да провериш, кои думи обхващат и вземаш цялата дума или думи.
"For example, if we do copy 4 6 on the following text (note the indices above the text):
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
H |
e |
l |
l |
o |
|
W |
o |
r |
l |
d |
the copied text will be “Hello World”, i.e. both words will be copied. On the other hand, if we do copy 2 3, only the word “Hello” will be copied." - от условието на задачата
Тук се вижда, че се взема не част от думата, а цялата дума/думи, които са засегнати от тизи индекси, т.е. първоначалните индекси им разширяваш обхвата докато обхванат целия текст.
Вариянт е да се направи със следните функции като търсиш space, и съответно променяш:
leftIndex = text.find_last_of(...)
rightIndex = text.find(...)
http://www.cplusplus.com/reference/string/string/find/
Важно - тези функции позволяват да задаваш от кой индекс да ти започне търсенето - в случая на space ' '.
Съветвам, те да пробваш с дебъгера какво се получава при всяка стъпка - понеже индекстите може да се получат -1, тогава трябва да ги коригираш.
После се прави text.substr(), като използваш новите индекси.
Пълниш това копие в някакъв контейнер за да го ползваш, като се извика paste - препоръчвам stack.
2. Paste
Проверяваш контайнера дали не е празен, т.е. има ли нещо да копираш въобще ако нямаш return;
Иначе трябва да вземеш последното копие, може да имаш няколто копия, които да пазиш и го paste -> insert на дадения индекс:
- ако индекса ти се пада в space ' ', то трябва да добаваш един спейс отляво, така че да може да се запази структурата, така че да се вишда отляво и отдясно, че имаш сложена нова дума-и, а не са прилепени
- ако ти се пада в дума просто insert
Текста, първоначалният, трябва да се промени след извършване на paste.
При end принтираш, това което е сътворено. :)
Поздрави!
За Sequence задачата се иска да извадиш колко на брой са увеличаващите се числа в потока:
Example Input |
Expected Output |
13 25 7 9 11 13 15 17 21 23 27 3 5 19 |
9 |
7 9 11 13 15 17 21 23 27 са увеличаващи се. Затова output-a e 9.
Copy Paste задачата е по-сложна. В нея се иска да копираш индекси от думата от до. От къде до къде (char) и да ги заместиш с вече съществуащи такъвва (При полужение че push_backваш вече съществуващите на края на думата)
После paste-ваш копираните chars на индекса. Също така думите не трябва да се повтарят (което ме навежда на мисълта че трябва да се ползва map) и ако paste индекса е space тогава paste-ването трябва да се случи в копираната дума (a не в следващата).
Example Input |
Expected Output |
some text copy 0 1 paste 4 copy 2 5 paste 1 end |
ssome someome some text |
Копираш индекси 0 и 1 (so от думата some) и ги Paste-ваш на индекс 4, после копираш от 2 до 5ти иднекс и ги paste-ваш на 1ви индекс. (Не забравяй за 0левия. Защото броенето на индекси започва от 0 не от 1)
Поне аз така си обяснявам тези 2 задачи. Може и да греша някъде. Още не съм се мъчил да ги решавам. Само анализирам условията
Аз даже и до този анализ не стигнах.
Първа задача съм я решила. Написах заглавието така, защото директно го взех така написано от документа със задачите. Не съобразих, че и в това ще има объркване 😂
Още ще я мисля, но ми е доста объркана.. Дори и след твоите разяснения 😁
Това видео ми помогна да разбера по-добре задачата:
https://www.youtube.com/watch?v=brJriHZIZUI&feature=youtu.be&t=4159
Не разчитай на решението в него обаче, защото условието е леко по-различно и използват пойнтери и други неща, с които поне аз съм слабо запозната. Следвай съветите на Галин - find() и substr(), за да извлечеш нужното копие от оригиналния текст и stack, в който да пазиш тези копия.
Здравей!
И аз имам проблем със задачката и реших да не отварям втора тема за нея.
Направих едно решение (малко е грозно и имената на променливите ми въобще не са ясни, за което се извинявам), но мисля, че логиката ми е правилна - когато си тествам примерите в Code Blocks всичко си работи както трябва, но когато го пусна в Judge 10/100. Всички тестове (освен 1-ви,2-ри и 3-ти), са ми с грешен отговор. Кодът ми е: https://pastebin.com/B0qyR2SE
Имаш ли някаква идея къде бъркам?
Привет!
Проблема ти е в copy командата.
Раздели си логиката за търсенето на двата индекса begin и end - няма смисъл да са в един и същи общ for().
Ти като намериш if (text [i] == ' ') {...} задаваш copyBeginIndex = i + 1; но не break-ваш цикъла, ами при следваща итерация ако има наляво още някой space ще вземеш него. Това, че брейкваш вътрешния for() не означава, че прекъсваш външния.
Препоръка:
int copyBeginIndex = 0; int copyEndIndex = text.size();
Направи си два for-а отделени един от друг и като намериш индекса на търсения спейс break;
result = text.substr(copyBeginIndex, copyEndIndex - copyBeginIndex);
- тук се задава дължина като втори аргумент, а не индек.
https://en.cppreference.com/w/cpp/types/size_t
text.size() - това е size_t, не е int;
for (size_t k = copyTo; k < text.size(); ++k)
Може да изнесеш int size = (int) text.size(); - кастваш го към по-малкия тип.
Още нещо(в случая не е проблем):
http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html
изполвай continue; на мястото на goto cycle;
Поздрави!
Не знам как да ти се отблагодаря! За пореден път много качествен отговор, благодаря ти за отделеното време... Много тъпи грешки, но щях да си блъскам главата с часове, докато си редкатирам кода. Съвсем бях забравил, че substr изисква индекс за от къде почва + дължината (а не индекс къде свършва)... Статията за go to също е много интересна, защото често го ползвам. Благодаря още вендъж! :)