Loading...
Plotso avatar Plotso 24 Точки

Exam Preparation 2 , Problem 2. Ladybugs

ЗАДАЧА

КОД

Здравейте! От 4 часа мъча тази задача ,но не отлепям от 30 точки... Дава ми -"...System.IndexOutOfRangeException: Index was outside the bounds of the array..."...Пробвах да променя кода по десетки начини  и да избягам от този ексепшън,но безуспешно...Проблемът според конзолата е на 93ти ред. Моля някой да погледне кода и да ми помогне.Благодаря предварително!

 

Тагове:
0
Programming Fundamentals
StefkaVasileva avatar StefkaVasileva 250 Точки
Best Answer

Първото нещо което забелязах, като проблем е когато изчисляваш новата позиция newPositionIndex += 1; по условия калинката ако стъпи на индекс на който има друга калинка, лети със същата дължина, т.е новата позиция трябва да е += commandLBFlyLength , за ляво съответно -=. Тази задача има доста проверки за излизане от масива. За това и ти гърми, че индекса е извън обхвата на масива. Ако искаш можеш да разгледаш моето решение: https://github.com/stefkavasileva/Programming-Fundamentals/blob/master/OldExams/Exam-23October2016/02.Ladybugs/Ladybugs.cs

 Иначе аз съм подходила по следния начин: след като получа команда проверявам дали индекса е валиден, ако не е  продължавам със следващата команда. Ако е валиден взимам посоката  и дължината. Веднага правя стойността на индекса на текущата калинка да е 0, защото тя или ще стъпи на друга позиция или ще излети (т.е ще излезне от масива). След това изчислявам новата позиция на калинката и отново проверявам дали новата позиция е валидна в масива, ако не е валидна продължавам с другата команда, ако е валидна (да е в рейнджа на масива) , проверявам дали на новата позиция имам 1 т.е калинка ако имам калинка продължавам да изчислявам новата позиция, така докато не излезна от масива т.е калинката да излети или докато не стъпя на позиция на която има 0 и на която ще запиша 1. Щом запиша калинката продължавам със следващата команда. Дано да си разбрал логиката ми, но честно казано тази задача я мислих ужасно много време, защото има проверки след всяко действие и като забравиш някъде една и край.  

1
vkutov avatar vkutov 57 Точки

" Веднага правя стойността на индекса на текущата калинка да е 0, защото тя или ще стъпи на друга позиция или ще излети (т.е ще излезне от масива)"

". If you are given ladybug index that is outside the field, nothing happens. "  Това условие ми е странно. Ако имаме големина 3 и кажем на калинката от 2то цвете  да лети със стъпка  5 цветя. Тя явно ще напусне полето, независимо от положенита на другите калинки. Какво означава . че нищо няма да се случи:

1. Калинката си излита от полето

2.Калинката си остава в първоначалното ,тъй като и е зададена още в началото неесъществуващо цвете.

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

0
valcho62 avatar valcho62 178 Точки

Грешката, която получаваш е доста описателна .На 93ти ред се опитваш да достъпиш несъществуващ индекс на масив.

Слагаш breakpoint и дебъгваш ред по ред , като гледаш какво става с променливите. Това ще ти се налага доста често, така че свиквай .

0
Javorov1103 avatar Javorov1103 12 Точки

Пробвай да работиш с List и когато LB пристъпи  в индеь по голям от fieldSize да я маха. На работа съм и не съм задълбавал в кода ти просто давам идея.

Поздрави

0
IvanBorisovG avatar IvanBorisovG 6 Точки

Код с обеснения - https://pastebin.com/5GS6H0cL

0
JordanB avatar JordanB 0 Точки

IvanBorisovG може ли да ми обясниш този ред "nextIndexToLand += flyLength;" - при примерна команда 0 right 5 и на 5 е заето, после няма ли да отиде на 10 индекс, без да проверява преди това дали има свободно място?

0
vkutov avatar vkutov 57 Точки

Не разбирам защо правиш проверката от редове  от 52 до 55. Нали стартовия индекс на калинката към този момент със сигурност е 1 , тъй като т самата е там?

0
27/06/2018 11:28:41
Nikola3132 avatar Nikola3132 6 Точки

Здравейте колеги! Някой би ли ми помогнал да открия къде греша. Докарвам я само до 60 точки .Вече два часа се чудя къде бъркам и не я откривам.Създадох си десетки мои тестове и всичките по мои предположения са ок . Просто бъркам някъде кардинално и незнам къде.  Искам да се извиня и на колегата ,който  е задал въпроса и аз се възползвам от това да пиша и моя проблем. Пиша го тук ,за да не пълня форумите с излишни въроси по вече съществуващ проблем .Благодаря предварително!

 

КОД:https://pastebin.com/huCJMDD7

Judge:https://judge.softuni.bg/Contests/Practice/Index/454#1

0
NikolayNeykov92 avatar NikolayNeykov92 617 Точки

Здравей,

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

ето поправката:

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace _2._Ladybugs
{
    class Program
    {
        static void Main(string[] args)
        {
            long[] fieldSize = new long[long.Parse(Console.ReadLine().Trim())];

            long[] indexesWhereTheBugsAre = Console.ReadLine().
                Split().
                Select(long.Parse).ToArray();
            for (int i = 0; i < fieldSize.Length; i++)
            {
                for (int j = 0; j < indexesWhereTheBugsAre.Length; j++)
                {
                    if (i == indexesWhereTheBugsAre[j])
                    {
                        fieldSize[i] = 1;
                    }
                }
            }
            while (true)
            {
                string input = Console.ReadLine();
                if (input == "end")
                {
                    break;
                }
                string[] SplitedInput = input.Trim().Split().ToArray();

                int ladyBugIndex = int.Parse(SplitedInput[0]);

                string directory = SplitedInput[1];
                int flyLenght = int.Parse(SplitedInput[2]);
                bool validBugIndex = ladyBugIndex >= 0 &&
                    ladyBugIndex < fieldSize.Length &&
                    fieldSize[ladyBugIndex] == 1;
                if (validBugIndex)
                {
                    fieldSize[ladyBugIndex] = 0;

                    int indexNewBug = 0;
                    if (directory == "right")
                    {
                        indexNewBug = ladyBugIndex + flyLenght;
                        if (fieldSize.Length > indexNewBug)
                        {
                            while (fieldSize.Length - 1 >= indexNewBug)
                            {
                                if (fieldSize[indexNewBug] == 0)
                                {
                                    fieldSize[indexNewBug] = 1;
                                    break;
                                }
                                else
                                {
                                    indexNewBug *= 2;
                                }
                            }
                        }
                    }
                    if (directory == "left")
                    {
                        indexNewBug = ladyBugIndex - flyLenght;
                        int fullSize = fieldSize.Length - 1;
                        if (indexNewBug >= 0)
                        {
                            while (indexNewBug >= 0)
                            {
                                if (fieldSize[indexNewBug] == 0)
                                {
                                    fieldSize[indexNewBug] = 1;
                                    break;
                                }
                                else
                                {
                                    indexNewBug -= flyLenght;
                                }
                            }
                        }
                    }
                }
                
            }
            Console.WriteLine(string.Join(" ", fieldSize));
        }
    }
}

0
25/06/2018 17:07:15
Nikola3132 avatar Nikola3132 6 Точки

Благодаря ти много, 100/100! Обаче не разбрах в кои ситуации с try...catch няма да проработи ...

0
NikolayNeykov92 avatar NikolayNeykov92 617 Точки

Всъщност може и с try-catch ето така например:

                try
                {
                    if (fieldSize[ladyBugIndex]==1)
                    {
                        fieldSize[ladyBugIndex] = 0;
                    }
                    else
                    {
                        continue;
                    }
                }
                catch (Exception)
                {
                    continue;
                }

но аз лично не бих го направил по този начин.

0
25/06/2018 18:47:33
vkutov avatar vkutov 57 Точки

И при мен не стана . Пращам код с коментари и с приемрите, които са минали

https://pastebin.com/y5e6nNyr

 

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