Софтуерно Инженерство
Loading...
AntyfrizZz avatar AntyfrizZz 238 Точки

[Подготовка за изпита в Judge] - Problem 11 - Little John

Здравейте,

 

Става въпрос за https://judge.softuni.bg/Contests/Practice/Index/84#10

В Джъджа не ми минава нулевият тест:

>>>----->>asd>ds>----->dasd>>>----->>
>>>----->>a>>----->sd>>>-----s>----->dasd>>>----->>
>>>------>sd>>>----ds>----->dasd>>>----->>
>>>----->sd>>>----->>asds>----->dasd>>>----->>

 

Според изискания от Джъджа тест, тук трябва да имам 427 стрели, а аз не виждам 2 средни стрели. Аз ги боря 417.

Някой ще ми каже ли къде бъркам и от къде идва тази 2ра средна стрела.

 

Поздрави!

0
C# Advanced 03/06/2016 22:12:07
AntyfrizZz:
Според мен проблемът е решен и няма нужда от повече обсъждане. Беше ми обяснено къде бъркам, а също така бяха предложени повече от 2 решения, за което съм благодарен.
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

На последния ред не е ли такава?

>>>----->sd>>>----->>asds>----->dasd>>>----->>

2
03/06/2016 22:17:24
ArmenPotourlyan+deleted! avatar ArmenPotourlyan+deleted! 488 Точки

The given 3 types are the only ones you should count, the rest should be ignored (Robin Hood does not like them).

Оттук може да стане сериозно объркване, понеже човек може да реши, че >>>-----> трябва да се игнорира laugh

1
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Прав си, че е възможно объркване, но >>>-----> не е валидна стрела, част от нея само е :) Абсолютно еквивалетно е ds>----->dasd - цялото това не е валидна стрела, но част от нея е :) Има някакви символи преди и след стрелата, било то букви или тирета или знаци за по-голямо, по-малко и т.н. Аз лично такава логика следвам

1
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравейте,

 

Според така написано условие, не би трябвало >>>-----> да е валидна стрела. По тази логика защо да не си направя някоя средна стрела малка, или някоя голяма - средна или малка? Все пак правя същата операция както при тази - махам tip или tail.

 

Поздрави!

0
03/06/2016 22:36:53
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Пак казвам:

>>>----->  е абсолютно същото като b>>-----> или bla>>----->  или asd>>----->asd

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

Защо да не броим средните стрели в големите стрели е написано в условието:

" You should start searching the hays from the largest arrow type down to the smallest arrow type. "

 

 

1
03/06/2016 22:41:26
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравейте,

 

При логиката с махане на tip или tail, не може ли да се добави и логика за махане на body?

>>-----------> ето една стрела. РХ не я харесва, но Джон маха няколко части от бодито и тя става с 5 части и вече е медиум.

>>>-----> ето я и нашата стрела. РХ не я харесва, но Джон маха част от опашката и тя става медиум.

Така ли се получават нещата?

Под стрели, които Робин Худ не харесва, разбирам стрели, които не отговарят на 3те посочени.

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

Това ds>----->dasd и >>>----->>>>> са две доста различни работи.

Това е стрела >>>-----> (съдържа си символите за стрели). При така написано условие, това спада към стрелите, които РХ не харесва. 

 

Не искам да изглежда като заяждане, но не разбирам условието така, както трябва.

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

 

Поздрави!

0
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Според мен много попадаш в капана на лирическите отклонения. Аз условието го разбирам като - има три вида стрели и разделители между тях (никъде не пише,че не може да са част от символите за стрели, така че приемам, че може). Съответно как бих подходил, ще разглеждам примерни инпут:

>>>----->>abc>>>----->>

>>>----->>

>----->s

>>----->

1. Сканирам линия едно за съдържание на голяма стрела.

Ако съдържа такава (Contains, IndexOf, там каквото поддържа езика), то я риплейсвам с някакъв знак, който не е част от стрелите, за да не си самосъздам стрела :) например с "&".

Съответно първата линия след намирането на една стрела ще стане:

&abc>>>----->>

След което ще проверя дали продължава да има стрели от най-високия тип ( ако трябва да съм честен - while(indexOf...)). Да, има още една. Замествам я и нея с "&" и качвам каунтъра на големите стрели. Първата линия става

&abc&

Проверявам отново дали има стрели от най-висок тип. Няма.

Проверявам дали има стрели от среден тип. Няма

Проверявам дали има стрели от най-ниския тип. Няма

2. Минавам на линия две:

Повтарям логиката. Проверявам има ли стрели от най-висок тип. Има, качвам каунтъра и замествам с "&". Втората линия става:

&

Проверявам има ли още стрели от най-висок тип. Няма.

Проверявам дали има стрели от среден тип. Няма

Проверявам дали има стрели от най-ниския тип. Няма

3. Минавам на линия три

Повтарям логката. Проверявам има ли стрели от най-високия тип. Няма. Проверявам има ли от средния. Няма. Проверявам има ли от малкия - има. Замествам с "&". Линията става

&s

Проверявам пак. Няма. Минавам на следващата линия.

Така, ако е имало на един ред едновременно големи и средни стрели, аз чрез моя while(indexOf..) ще заместя всички големи с "&" съответно няма да хвана средни и малки вътре в големите. Ако има средна стрела предхождана с друг знак ("a", "b", "-", ">", ...) с Contains, IndexOf и т.н. със сигурност ще я хвана. И ще съм сигурен, че никога не е била част от по-голяма такава. Тя просто е била част от някакъв стринг в който има стрела. Но този стринг не е по-голяма стрела. Ако е бил по-голяма стрела щях да го заместя с "&".

Никъде няма логика по това да се маха предната, задната или средната част на стрелата. Напротив. Даже много по-просто. Просто броиш всички occurances на един стринг в друг стринг, след което ги премахваш, за да не се преброят отново като броиш следващите типове стрели. Не знам коя част от условието те накара да мислиш, че имаш супер невалидна стрела и се опитваш да я направиш валидна с някакви евристики :) Това е много по-сложно от колкото задачата очаква и съответно грешно.

Колегата, който си скри поста беше предложил решение с Regex-и. Тъй като тръгнах да обяснявам, че задачата е просто намиране на подниз в низ и премахването му, ето такова решение без регулярни изрази: http://pastebin.com/6MbaR0vk

2
AntyfrizZz avatar AntyfrizZz 238 Точки

Щом има хора, които са я разбрали както трябва, значи е обяснена правилно. Има го и обратното твърдение, но правилното разбиране на проблема си е част от задачата. Повече внимание трябва да се обърне на "You should start searching the hays from the largest arrow type down to the smallest arrow type", а не на "Robin Hood does not like them".

Доста време отдели, за да обясниш къде бъркам, за което съм ти благодарен :)

 

Поздрави!

0
kaloyannikov avatar kaloyannikov 530 Точки
(>-{5}>)|(>>-{5}>)|(>>>-{5}>>) с regex е доста лесна
3
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравей,

 

Нистина обхваща каквото трябва, но не ми е ясно как работи приоритета в този случай. Защо, при условие, че може да засече малка стрела, засича голяма. Може ли да ми го обясниш.

0
kaloyannikov avatar kaloyannikov 530 Точки

Ами в регекса имаш 3 matching groups > 

 Aко има match  >>>----->> засича голямата стрелка защото отговрая на 3та група и това че включва в себе си другите 2 групи не значи че ги включва в matching group. 

Aко махнеш 1 стрелка отпред или отзад ще стане >>----->> или >>>-----> и ще ти мачне средната стрела(group 2) като не взима под внимание останалата ">" или водещата">" във втория случай. 

Прииоритета е да хване най-голяма стрела , след това средна и малка, такава е подредбата и просто малка и средна се включват в голяма, а малка се включва в средна.

0
PlamenMetodiev avatar PlamenMetodiev 14 Точки

Здравейте,

Не бих казал, че има някакво значение как се разбира. В условието е казано да се търсят от големи към малки, и като направите 3 pattern-a за трите стрелки, проверявате последователно, като с regex.Matches(..).Count взимате броя и прибавяте към общия за съответния вид. След което извършвате операциите по криптирането на броя стрели.

Поздрави!

0
murkata86 avatar murkata86 10 Точки

Колега, според мен, когато намериш съвпадение, първо трябва да видиш дали е голяма стрелата, ако е продължаваш нататък, ако не е - гледаш дали е средна - ако е продължаваш, ако не е - гледаш дали е малка. Няма смисъл да правиш от голямата стрела средна или малка. По твоята логика  а>-----> също не би трябвало да е валидна стрела.

0