Cypher Roulette - Софтуерен университет

Cypher Roulette - Софтуерен университет

+ Нов въпрос
StefkaVasileva avatar StefkaVasileva 259 Точки
Здравей, опитай да въведеш: 
5
Bed
Is
So
Fine
spin
spin
This
По условие: If two equal strings are entered two consecutive times, the cypher resets - emptying the cypher string. This rule also applies to the "spin" command. 
При този вход имаш въведени една след друга две команди spin, това означава, че трябва да изтриеш всичко което си запазил до този момент. 
0
19/02/2017 21:14:46
peterkolev avatar peterkolev 6 Точки

Благодаря, след редакция по твоя съвет направих кроекции:

http://pastebin.com/SZ0b642g - виж // !!!!!!!!!!!!!!!Edit after Help!!!!!!!!!!!!!

С примера който ми даде работи. А с judge не, пак 70/100. 

0
peterkolev avatar peterkolev 6 Точки

Не съм го напрвил да работи с твоя пример. Нешо съм объркал.

0
peterkolev avatar peterkolev 6 Точки

Влоших нещата :(

40/100

http://pastebin.com/1AZ07nx7

Много време я мисля и не става...

Моля за помощ

0
ThePSXHive avatar ThePSXHive 435 Точки

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

Note: the "spin" commands do not count towards the N count.

т.е. въвеждането на spin по никакъв начин не трябва да бъде обвързано с намаляване стойността на counter-a (в този случай, i). Сиреч, този сегмент:

if (inputText=="spin")
{
    inputText = "";
    i--;
    ...
}

трябва да бъде променен така, че да не се налага специфична проверка за низ "spin".

if (prevString == currString) 
{
    cypherString = string.Empty; 

    if (prevString != "spin")
	    inputRows--; 
				
    continue;
}

В това решение не проверявам за "spin", а за всеки друг вход, защото ако входният низ е "spin", то тогава ще трябва да се увериш, че този резултат не се прибавя към cypherString-a. Подходил съм с continue, защото по този начин отново се връщаш към въвеждането на нов низ, и ако предишният низ (при мен prevString, при теб buffer) е равен на текущият стринг (при мен currString, при теб inputText), то нулираме cypherString-a, за разлика от останалите случаи, не декрементираме броячът, а отново се връщаме към въвеждането на низ. Междувременно, трябва броячът да бъде декрементиран и когато въведеният низ (текущият) не е "spin":

if (currString != "spin") 
        inputRows--;

Тази проверка е отделна и независима от останалите. Ако въведеният низ е "spin", то стойността на булевата променлива трябва да бъде променена: 

addBack = !addBack;

и стойността на текущият низ да бъде присвоена на предишния низ (защото все пак трябва да бъде отразено въвеждането на "spin").  Оттук насетне вероятно има и други варианти, но аз съм подходил с още едно връщане към въвеждането на низове (с continue).

0
peterkolev avatar peterkolev 6 Точки

Благодаря,

Утре на свежа глава ще пробвам да си оправя кода.

0
peterkolev avatar peterkolev 6 Точки

Въпреки много доброто и подборбно обяснение не се справям.

Може ли нещата в код?

0
ThePSXHive avatar ThePSXHive 435 Точки

Това е решението, и в него използвам while и една конструкция, която бегло наподобява FSM, но си струва да се отбележи, че някой от форумците беше решил задачата като теб (с for цикъл), като използва continue само на едно място в програмата. Въпреки това, според мен решението с while малко по-кратко. Успех!

0
21/02/2017 08:04:55
Bullsized avatar Bullsized 153 Точки

виждам, че тук е най-разгорещена дискусията (ето тема с още 4 линка към тази задача: https://softuni.bg/forum/questions/details/15060 )
 

ето и моя примерен код: https://pastebin.com/ta1zkLUn

70/100 в системата. Обяснявам: за мен е безсмислено да се ползва while цикъл за тази задача, за това си ползвам for, като просто вадя 1 от i когато има въведено spin. Другото - ползвам булеви команди за това дали въртенето е съответно надясно или наляво, като се променя при всеки spin. Сравнявам си предната дума с новата въведена и ако са същите анулирам резултатния стринг и прескачам това въртене на цикъла. При всичко изпълнено от условията добавям съответно нова дума към стария стринг или стария стринг към новата дума (редове от 45 до 52). Откровено казано вече не знам какво повече иска задачата, а имам 3 или по-малко грешки според джъджа. Гледах и лекцията от съотвеното упражнение, но там не е решена. Ще съм много благодарен ако някой удари едно рамо по кода. Виждал съм решение, което прави 100/100 със while и switch, което не мисля, че се различава от моето, какво бъркам?

 

0
spzvtbg avatar spzvtbg 581 Точки

https://pastebin.com/78fzeKE9 ето гоооооо - е бутнах го малко  ама 100/100

преместих проверката за спин отпред  за да не се трие ако е въведен 2 поредни пъти и му пастнах проверката и в тази за еднаквите входове защото дори тогава си мени посоката

и понеже има елсе закоментирах дясната посока

като закуча така обикновенно трия всичко, препрочитам условието и си правя нова структура 

0
Bullsized avatar Bullsized 153 Точки

не се бях замислял направо да махна едната булева, хитро попадение. наистина изкарва 100 от 100, мерси за удареното рамо!

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

0
spzvtbg avatar spzvtbg 581 Точки

моля,

нали за това сме тука!

0