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

Задача от методси - Array Manipulator C#

Здравейте, 

на задача Array Manipulator получавам 40/100. Zero Тестовете са ок, гледах условията няколко пъти, но не мога да открия къде имам грешка. Може ли малко помощ: 

https://pastebin.com/s8DKsACh

 

Благодаря

0
Module: C# Advanced
RadostinStoychev avatar RadostinStoychev 112 Точки
Best Answer

Ето едно решение с методи за всяка операция.
https://pastebin.com/LUUtMhVd
Някъде в коментарите видях, че е станало на въпрос за Concat. То е същото като стрингосването :D.
Например:

string str = "simple";
str = str + " text";

Тоест Concat e абсолютно същото като + или +=. Ако искаш да закопаеш още повече, почети за Command Interpreter, Interpreter Pattern, Interpreter Desing Pattern и т.н. По-късно в OOP-то този подход започва да се използва за разделяне на командите на отделни части. Ако имаш въпроси по кода, може да ми драснеш на лично. Успех :)

0
YanaStamenova avatar YanaStamenova 16 Точки

Мерси. Ще разгледам и твоето решение. Новата информация, която трябва да науча всеки ден си расте експоненциално :) Става много забавно. 

1
YanaStamenova avatar YanaStamenova 16 Точки

Ето един въпрос. Ще можеш ли да  ми обясниш този ред код:  message = (index >= 0) ? $"{index}" : "No matches";

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

Благодаря!

1
RadostinStoychev avatar RadostinStoychev 112 Точки

Това е тернарен оператор (ternary). Накратко по-съкратен синтаксис на if-else.
В ляво е условието, след това въпросителна и 2та възможни изхода разделени с ":"
(условие) ? (изход 1) : (изход 2)
Тоест същото като:

if (index >= 0)
{
    message = index;
}
else
{
    message = "No matches";
}

Когато имаш 2 проверки можеш да го позлваш, защото е по-кратко като синтаксис. Може и да се нестват, за да обхванеш повече проверки if -- else if -- else if -- else... Но нестване на тернарен оператор е малко грозничко и нечетимо. Ако са само if -- else е доста приятно (Syntactic sugar). Ето още един пример с принтене и по 2та начина, за да е по-ясно:

int a = 10;
int b = 2;

Console.WriteLine(a > b ? "a is bigger" : "b is bigger");

if (a > b)
{
    Console.WriteLine("a is bigger");
}
else
{
    Console.WriteLine("b is bigger")
}

Ето един линк от Майкрософт за тернарния оператор:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator
И един от dot net perls:
https://www.dotnetperls.com/ternary

1
14/06/2019 19:46:54
TeodorStefanovPld avatar TeodorStefanovPld 1285 Точки

някакво условие да link-неш? че така само по кода трудно е да се ориентира човек.

-1
YanaStamenova avatar YanaStamenova 16 Точки

Ето го условието:

Trifon has finally become a junior developer and has received his first task. It’s about manipulating an array of integers. He is not quite happy about it, since he hates manipulating arrays. They are going to pay him a lot of money, though, and he is willing to give somebody half of it if to help him do his job. You, on the other hand, love arrays (and money) so you decide to try your luck.

The array may be manipulated by one of the following commands

  • exchange {index} – splits the array after the given index, and exchanges the places of the two resulting sub-arrays. E.g. [1, 2, 3, 4, 5] -> exchange 2 -> result: [4, 5, 1, 2, 3]
    • If the index is outside the boundaries of the array, print “Invalid index
  • max even/odd– returns the INDEX of the max even/odd element -> [1, 4, 8, 2, 3] -> max odd -> print 4
  • min even/odd – returns the INDEX of the min even/odd element -> [1, 4, 8, 2, 3] -> min even > print 3
    • If there are two or more equal min/max elements, return the index of the rightmost one
    • If a min/max even/odd element cannot be found, print “No matches”
  • first {count} even/odd– returns the first {count} elements -> [1, 8, 2, 3] -> first 2 even -> print [8, 2]
  • last {count} even/odd – returns the last {count} elements -> [1, 8, 2, 3] -> last 2 odd -> print [1, 3]
    • If the count is greater than the array length, print “Invalid count
    • If there are not enough elements to satisfy the count, print as many as you can. If there are zero even/odd elements, print an empty array “[]”
  • end – stop taking input and print the final state of the array

Input

  • The input data should be read from the console.
  • On the first line, the initial array is received as a line of integers, separated by a single space
  • On the next lines, until the command “end” is received, you will receive the array manipulation commands
  • The input data will always be valid and in the format described. There is no need to check it explicitly.

Output

  • The output should be printed on the console.
  • On a separate line, print the output of the corresponding command
  • On the last line, print the final array in square brackets with its elements separated by a comma and a space
  • See the examples below to get a better understanding of your task

Constraints

  • The number of input lines will be in the range [2 … 50].
  • The array elements will be integers in the range [0 … 1000].
  • The number of elements will be in the range [1 .. 50]
  • The split index will be an integer in the range [-231 … 231 – 1]
  • first/last count will be an integer in the range [1 … 231 – 1]
  • There will not be redundant whitespace anywhere in the input
  • Allowed working time for your program: 0.1 seconds. Allowed memory: 16 MB.

Examples

Input

Output

1 3 5 7 9

exchange 1

max odd

min even

first 2 odd

last 2 even

exchange 3

end

2

No matches

[5, 7]

[]

[3, 5, 7, 9, 1]

Input

Output

1 10 100 1000

max even

first 5 even

exchange 10

min odd

exchange 0

max even

min even

end

3

Invalid count

Invalid index

0

2

0

[10, 100, 1000, 1]

Input

Output

1 10 100 1000

exchange 3

first 2 odd

last 4 odd

end

[1]

[1]

[1, 10, 100, 1000]

0
nsavov avatar nsavov 67 Точки

last N even и last N odd показват занулени последни индекси. Явно някъде четеш грешно техните масиви.

Сори, но ми е много сложно да се ориентирам да видя къде е грешката :/

-1
YanaStamenova avatar YanaStamenova 16 Точки

Ще погледна за какво ми говориш. Мерси :) 

0
TeodorStefanovPld avatar TeodorStefanovPld 1285 Точки

If a min/max even/odd element cannot be found, print “No matches”

If the count is greater than the array length, print “Invalid count

ей тея 2 неща не виждам никъде да ги изпълняваш... Това за масивите дали ги четеш грешно без да го пусна кода не мога да се ориентирам.. но ми прави впечатление че въртиш отделни цикли и методи за повтарящи се действия

кода може да се оптимизира доста, като конктаваш при ехchange пак правиш някакви странни неща първо тръгваш правилно с take(x,x) и после въртиш пак цикъл да допълниш а може просто .concat(y,y)

за търсенето на индексите също дали ти трябват първите или последните просто ще подадеш reverse array и ще вземеш каквото ти трябва.. 300+ реда за тая задача е самоубийство честно след работа нямам нерви да дебъгвам такива неща.

вземи я напиши отново и по -кратко и си спазвай условието.. и не  е ухбаво да се преповтаря код малко е безмислено.

0
YanaStamenova avatar YanaStamenova 16 Точки

Благодаря за коментара. Някои неща не са ми познати все още, като concat. Ще прочета малко повече и ще го започна от нула. И аз като видях крайния резултат се усетих, че съм прекалила с методите и циклите.

Благодаря отново.

1
thefolenangel avatar thefolenangel 17 Точки

Така погледнах кода YanaStamenova и забелязах нещо критично, че не ползваш LINQ.

LINQ

LINQ (Language Integrated Query) is a Microsoft programming model and methodology that essentially adds formal query capabilities into Microsoft .NET-based programming languages. LINQ offers a compact, expressive, and intelligible syntax for manipulating data. 

Пренаписах ти кода:

 using System;
    using System.Linq;

    public class ArrayManipulator
    {
        public static void Main(string[] args)
        {
            int[] array = Console.ReadLine()
                .Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                .Select(int.Parse)
                .ToArray();

            while (true)
            {
                string input = Console.ReadLine().ToLower().Trim();
                if (input.Equals("end"))
                {
                    break;
                }

                string[] command = input
                    .Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

                switch (command[0])
                {
                    case "exchange":
                        int index = int.Parse(command[1]);
                        if (index < 0 || index >= array.Length)
                        {
                            Console.WriteLine("Invalid index");
                            break;
                        }

                        index++;
                        array = array.Skip(index).Concat(array.Take(index)).ToArray();
                        break;
                    case "max":
                    case "min":
                        MaxOrMin(array, command[0], command[1]);
                        break;
                    case "first":
                    case "last":
                        FirstOrLast(array, int.Parse(command[1]), command[2], command[0]);
                        break;
                    default:
                        throw new EntryPointNotFoundException();
                }
            }

            PrintArray(array);
        }

        private static void FirstOrLast(int[] array, int count, string evenOrOdd, string firstOrLast)
        {
            int[] separated = FilterEvenOdd(array, evenOrOdd);
            int[] result = firstOrLast.Equals("last")
                ? separated.Reverse().Take(count).Reverse().ToArray()
                : separated.Take(count).ToArray();

            if (count > array.Length)
            {
                Console.WriteLine("Invalid count");
                return;
            }

            PrintArray(result);
        }

        private static void MaxOrMin(int[] array, string maxOrMin, string evenOrOdd)
        {
            int[] separated = FilterEvenOdd(array, evenOrOdd);

            if (separated.Length == 0)
            {
                Console.WriteLine("No matches");
                return;
            }

            Console.WriteLine(maxOrMin.Equals("max")
                ? Array.LastIndexOf(array, separated.Max())
                : Array.LastIndexOf(array, separated.Min()));
        }

        private static int[] FilterEvenOdd(int[] array, string evenOrOdd)
        {
            int reminder = evenOrOdd.Equals("even") ? 0 : 1;
            return array.Where(n => n % 2 == reminder).ToArray();
        }

        private static void PrintArray(int[] array)
        {
            Console.WriteLine($"[{string.Join(", ", array)}]");
        }
    }


Надявам се това да помогне. Питай ако има нещо.

0
TeodorStefanovPld avatar TeodorStefanovPld 1285 Точки

pff хах малко на тех модула като гледам 3-4 лекция и е рано да разбира linq :D затова и го споменах а и дадох насоки :Д

така както си го пляснал тоя код я разбере нещо я не :Д  не може да тръгне да бяга преди да се е научила да ходи. и поне в pastebin или нещо подобно да го беше сложил....

0
thefolenangel avatar thefolenangel 17 Точки

Е все пак хората сложили във форума да можеш да пляскаш код, ке го плескаме тогаз :D Иначе не знам какво се учи в тех модула.

За LINQ не съм съгласен, защото по-твоята логика аз първо съм се научил да плуавам преди да вървя (Почнах с TPL библиотеката да уча програмиране :)) )

Учиш инструментите, които ти трябват, когато са ти необходими.

 

0
12/06/2019 23:38:54
YanaStamenova avatar YanaStamenova 16 Точки

Благодаря за отговора и кода. По принцип Linq съм използвала досега само, когато си парсвам стринга, преди да го вкарам в масив. Примерно int[] numberArray = Console.ReadLine().Split().Select(int.Parse).ToArray();

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

0
YanaStamenova avatar YanaStamenova 16 Точки

Здравейте,

С малко помощ от всички/ идеите, които ми дадохте, успях да си пренапиша кода и да взема 100/100

Споделям и новото решение: 

https://pastebin.com/0h7qwuWm

 

Благодаря отново!

1