Задача от методси - Array Manipulator C#
Здравейте,
на задача Array Manipulator получавам 40/100. Zero Тестовете са ок, гледах условията няколко пъти, но не мога да открия къде имам грешка. Може ли малко помощ:
Благодаря
Здравейте,
на задача Array Manipulator получавам 40/100. Zero Тестовете са ок, гледах условията няколко пъти, но не мога да открия къде имам грешка. Може ли малко помощ:
Благодаря
Ето едно решение с методи за всяка операция.
https://pastebin.com/LUUtMhVd
Някъде в коментарите видях, че е станало на въпрос за Concat. То е същото като стрингосването :D.
Например:
string str = "simple";
str = str + " text";
Тоест Concat e абсолютно същото като + или +=. Ако искаш да закопаеш още повече, почети за Command Interpreter, Interpreter Pattern, Interpreter Desing Pattern и т.н. По-късно в OOP-то този подход започва да се използва за разделяне на командите на отделни части. Ако имаш въпроси по кода, може да ми драснеш на лично. Успех :)
някакво условие да link-неш? че така само по кода трудно е да се ориентира човек.
Ето го условието:
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
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] |
last N even и last N odd показват занулени последни индекси. Явно някъде четеш грешно техните масиви.
Сори, но ми е много сложно да се ориентирам да видя къде е грешката :/
Ще погледна за какво ми говориш. Мерси :)
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+ реда за тая задача е самоубийство честно след работа нямам нерви да дебъгвам такива неща.
вземи я напиши отново и по -кратко и си спазвай условието.. и не е ухбаво да се преповтаря код малко е безмислено.
Благодаря за коментара. Някои неща не са ми познати все още, като concat. Ще прочета малко повече и ще го започна от нула. И аз като видях крайния резултат се усетих, че съм прекалила с методите и циклите.
Благодаря отново.
Така погледнах кода 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)}]");
}
}
Надявам се това да помогне. Питай ако има нещо.
pff хах малко на тех модула като гледам 3-4 лекция и е рано да разбира linq :D затова и го споменах а и дадох насоки :Д
така както си го пляснал тоя код я разбере нещо я не :Д не може да тръгне да бяга преди да се е научила да ходи. и поне в pastebin или нещо подобно да го беше сложил....
Е все пак хората сложили във форума да можеш да пляскаш код, ке го плескаме тогаз :D Иначе не знам какво се учи в тех модула.
За LINQ не съм съгласен, защото по-твоята логика аз първо съм се научил да плуавам преди да вървя (Почнах с TPL библиотеката да уча програмиране :)) )
Учиш инструментите, които ти трябват, когато са ти необходими.
Благодаря за отговора и кода. По принцип Linq съм използвала досега само, когато си парсвам стринга, преди да го вкарам в масив. Примерно int[] numberArray = Console.ReadLine().Split().Select(int.Parse).ToArray();
Така, че ще трябва да се поразтърся за доста неща по кода ти. Но пък ще науча нещо ново. Благодаря.
Здравейте,
С малко помощ от всички/ идеите, които ми дадохте, успях да си пренапиша кода и да взема 100/100
Споделям и новото решение:
Благодаря отново!
Мерси. Ще разгледам и твоето решение. Новата информация, която трябва да науча всеки ден си расте експоненциално :) Става много забавно.
Ето един въпрос. Ще можеш ли да ми обясниш този ред код: message = (index >= 0) ? $"{index}" : "No matches";
Тази въпросителна съм я срещала и на други места, но не мога да схвана какво прави. Намерих в интернет ?? тази опция, но не е същото.
Благодаря!
Това е тернарен оператор (ternary). Накратко по-съкратен синтаксис на if-else.
В ляво е условието, след това въпросителна и 2та възможни изхода разделени с ":"
(условие) ? (изход 1) : (изход 2)
Тоест същото като:
Когато имаш 2 проверки можеш да го позлваш, защото е по-кратко като синтаксис. Може и да се нестват, за да обхванеш повече проверки if -- else if -- else if -- else... Но нестване на тернарен оператор е малко грозничко и нечетимо. Ако са само if -- else е доста приятно (Syntactic sugar). Ето още един пример с принтене и по 2та начина, за да е по-ясно:
Ето един линк от Майкрософт за тернарния оператор:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator
И един от dot net perls:
https://www.dotnetperls.com/ternary