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 принтираш, това което е сътворено. :)
Поздрави!
Здравей!
И аз имам проблем със задачката и реших да не отварям втора тема за нея.
Направих едно решение (малко е грозно и имената на променливите ми въобще не са ясни, за което се извинявам), но мисля, че логиката ми е правилна - когато си тествам примерите в 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 също е много интересна, защото често го ползвам. Благодаря още вендъж! :)
За да не отварям нова тема за същата задача. galin_kostadinov от няколко дни си блъскам главата с тази задача. Направо ме побърка. Опитвам се да разбера насоките ти който си дал за решаването й (от решението на m.nikolov97) и едвам успях да я докарам до 30/100. За жалост не успях да подкарам дебъгера и тотално съм зацепил. Би ли ми показал как попринцип трябва да изглежда прословутата Copy функция?
Ето до къде съм я докарал: https://pastebin.com/bPycJ7wn
Здравей, Филип!
Функцията за копиране се състои от два цикъла:
Мен също много ме измъчи тази задача. Ето го моето решение, ако имаш нужда. Надявам се да съм успял да ти помогна!
m.nikolov97 Много игра на индекси xd. То това обърква логиката. Сам нямаше да мога да я разбера. Благодаря за отговора и за детайлизираните пояснения!