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 Точки

За да не отварям нова тема за същата задача. galin_kostadinov от няколко дни си блъскам главата с тази задача. Направо ме побърка. Опитвам се да разбера насоките ти който си дал за решаването й (от решението на m.nikolov97) и едвам успях да я докарам до 30/100. За жалост не успях да подкарам дебъгера и тотално съм зацепил. Би ли ми показал как попринцип трябва да изглежда прословутата Copy функция? 

Ето до къде съм я докарал: https://pastebin.com/bPycJ7wn

0
m.nikolov97 avatar m.nikolov97 25 Точки

Здравей, Филип!

Функцията за копиране се състои от два цикъла:

  1. Първия би трябвало да изглежда подобно на този: for (int i = copyFrom; i >= 0; --i), тоест въртим от индекса, където започваме копирането напред (към началото на текста), като вътре трябва да предвидим 2 случая:
    • Ако въпросния чар е '  ', тоест  if (text [i] == ' '), то тогава започваме да копираме от i + 1, а не от i - не искаме да копираме спейса.
    • Ако стигнем до i = 0, то тогава е ясно, че заповаме да копираме от началото, тоест индексът е 0. 
  2. Вторият цикъл е за това до къде копираме и при мен изглежда по следния начин: for ( int k = copyTo; k <= (text.size() - 1); ++k ). Още преди създаването на втория цикъл съм направил проверка, за това дали индексът до който ще копираме е по-голям от текста ( if (copyTo > text.size() ), то тогава копираме до последния индекс. Така се подсигурява, че ако ни дадът да копираме повече символи, няма да копираме всички спейсове накрая. Относно цикълът след тази проверка (в него няма да влезем, ако copyTo индексът е по-голям от размера на текста):
    • Отново проверяваме дали конкретният символ е ' ' ( if (text [k] == ' ' ) - ако е, то копираме до този символ, тоест copyEnd индексът е равен на k. В случая вземаме спейса (това е по условие).
    • Втората проверка в този цикъл при мен е дали k + 1 ще е равно на последния индекс в текста ни, тогава логично ще копираме до последния символ в текста.

 Мен също много ме измъчи тази задача. Ето го моето решение, ако имаш нужда. Надявам се да съм успял да ти помогна!

0
12/11/2019 16:57:14
Filipbg avatar Filipbg 26 Точки

m.nikolov97 Много игра на индекси xd. То това обърква логиката. Сам нямаше да мога да я разбера. Благодаря за отговора и за детайлизираните пояснения!

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