Loading...

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

kmilewa avatar kmilewa 2 Точки

Task 2 Sequence (JA3 Task 2 Copy Paste)

Здравейте!

По повод Task 2 от Judge.

Моля за малко съдействие по повод разясняване на какво се иска и как се иска. Както се вика, четох, четох, ама положението е "изгубени в превода" :D

 

Тагове:
0
C++ Fundamentals
galin_kostadinov avatar galin_kostadinov 166 Точки
Best Answer

Привет!

Имаш два вида команди  - 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 принтираш, това което е сътворено. :)

Поздрави!

 

1
02/11/2019 12:48:14
m.nikolov97 avatar m.nikolov97 25 Точки

Здравей!

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

Направих едно решение (малко е грозно и имената на променливите ми въобще не са ясни, за което се извинявам), но мисля, че логиката ми е правилна - когато си тествам примерите в Code Blocks всичко си работи както трябва, но когато го пусна в Judge 10/100. Всички тестове (освен 1-ви,2-ри и 3-ти), са ми с грешен отговор. Кодът ми е: https://pastebin.com/B0qyR2SE

Имаш ли някаква идея къде бъркам?

0
04/11/2019 13:32:58
galin_kostadinov avatar galin_kostadinov 166 Точки

Привет!

Проблема ти е в 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;

Поздрави!

0
04/11/2019 15:13:45
m.nikolov97 avatar m.nikolov97 25 Точки

Не знам как да ти се отблагодаря! За пореден път много качествен отговор, благодаря ти за отделеното време... Много тъпи грешки, но щях да си блъскам главата с часове, докато си редкатирам кода. Съвсем бях забравил, че substr изисква индекс за от къде почва + дължината (а не индекс къде свършва)... Статията за go to също е много интересна, защото често го ползвам. Благодаря още вендъж! :) 

1
04/11/2019 16:17:22
Filipbg avatar Filipbg 26 Точки

Sequence и Copy Paste са 2 различни задачи. И са част от Judge Assignment 3 - https://judge.softuni.bg/Contests/Compete/Index/1102

За 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 задачи. Може и да греша някъде. Още не съм се мъчил да ги решавам. Само анализирам условията

0
02/11/2019 09:57:08
kmilewa avatar kmilewa 2 Точки

Аз даже и до този анализ не стигнах.

Първа задача съм я решила. Написах заглавието така, защото директно го взех така написано от документа със задачите. Не съобразих, че и в това ще има объркване 😂

Още ще я мисля, но ми е доста объркана.. Дори и след твоите разяснения 😁

0
02/11/2019 11:46:33
SylviaNikolova avatar SylviaNikolova 20 Точки

Това видео ми помогна да разбера по-добре задачата:

https://www.youtube.com/watch?v=brJriHZIZUI&feature=youtu.be&t=4159

Не разчитай на решението в него обаче, защото условието е леко по-различно и използват пойнтери и други неща, с които поне аз съм слабо запозната. Следвай съветите на Галин - find() и substr(), за да извлечеш нужното копие от оригиналния текст и stack, в който да пазиш тези копия. 

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.