Софтуерно Инженерство
Loading...
+ Нов въпрос
kenderov.emil avatar kenderov.emil 6 Точки

Encrypted Matrix - Проблем

Привет колеги,

Днес се занимавах със задачата Encrypted Matrix, която се е падала тази година на 29ти март на изпита. Първия ми вариант(код : http://pastebin.com/mg2X2Z6X). Джъджа ми отсъди 40 точки. Реших, че проблема може да е в начина, по който се опитвам да превърна стринга отново в инт масив(линии 99-104). ОК, намерих начин да мина без това и направих втори вариант, по-опростен(код: http://pastebin.com/KRGpE00v) където въвеждам потребителски int[] и процедура за превръщане на число в масив от цифри. И двата варианта работят при мен. Само че джъджа оцени втория по-зле:20 точки. Плийс, кажете ми къде е грешката. Благодарско предварително на всички.

RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Има няколко code smell-а, които виждам.

1. Няма никакъв смисъл от този Convert.ToInt32 почти никъде... особено на първото парсване.( ASCII_message[a] = Convert.ToInt32(message[a]); )

2. Проверките дали си на 1ви или последен символ са ... 6 ?!? плюс имаш проверка дали си на ВТОРИ символ? Защо? Това е достатъчно:

                    backward = 0;
                    forward = 0;
                    if (c > 0)
                    {
                        backward = ASCII_1[c - 1];
                    }
                    if (c < ASCII_1.Length - 1)
                    {
                        forward = ASCII_1[c + 1];
                    }
                    ASCII_encrypted[c] = ASCII_1[c] + forward + backward;

3. Превръщането от стринг в цялочислен масив е излишно. Още повече е разбирам защо маха някакви цифри:

            for (int i = 0; i < ASCII_encrypted1.Length; i++)

            {

               string_encrypted[i] = Convert.ToInt32(ASCII_encrypted1[i])-48;

            }

Тук не става ли просто string_encrypted[i] = int.Parse(ASCII_encrypted1[i]+"")?

Както и да е. Махнах го това въобще и прекръстих стрингът ASCII_encrypted1 на string_encrypted:

            string string_encrypted = string.Empty;

            for (int h = 0; h < ASCII_encrypted.Length; h++)
            {
                string_encrypted = string_encrypted + (ASCII_encrypted[h]);

            }

И започнах да боравя само с него. На местата на които се ползваше ударих по един int.Parse за да не взима ASCII кода, а числото:

encrypted_array[d, d] = int.Parse(string_encrypted[d]+"");

и

encrypted_array[string_encrypted.Length - d - 1, d] = int.Parse(string_encrypted[d]+"");

100/100
       

2
alex.mitev avatar alex.mitev 20 Точки

Здрасти, аз днес също я решавах. Всичко почна ок, може би не е най-оптималното , но това са ми познанията.

След като я направих, judge ми даде 0 точки.

Чак тогава, накрая, добавих space-овете, които просто не бях видял. Никъде не го пише, и аз си карах без тях.

Ето го кода:

http://pastebin.com/cES3mHks

Тази задача, предполагам, може да се направи и с обикноени стрингове за Оутпут, а не с двумерен масив, или бъркам?

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

while, защото мислех, че ще се подават данни няколко пъти. Така в началото нулирах стринговете.

0
04/11/2015 18:48:13
StaVykoV avatar StaVykoV 169 Точки

Колега, това за празното място между цифричките го пише  във файла с домашното:

Output

The output data should be printed on the console.

You must print the matrix with a single space between the elements.

 

Иначе аз още в началото си пълня ASCII стойностите в един int масив и просто ползвам /10 и %10. Накрая пълня само диагонала на двумерен масив и в зависимост от наклонената чертичка печатам от ляво на дясно или обратното.

1
alex.mitev avatar alex.mitev 20 Точки

Да, така пише, но не съм гледал.

Не знаех, че липсващите стойности на масива се пълнят с нули. Аз отделно съм ги и напълнил с нули. 

VyKov, как избягваш проблема с промняната на дължината при енкрипването, ако използваш само един масив?

 

 

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

Най-вероятно еккриптва и направо печата. Ако се получи N-цифрено число при умножението/събирането, просто печата N реда. И да, няма нужда от матрица (двумерен масив). Просто печаташ Х на брой нули, числото, още нули до края на реда :)

1