Loading...
markovood 11 Точки

## 08. Anonymous Threat 90/100

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

``````using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _08._Anonymous_Threat
{
public class Anonymous_Threat
{
public static void Main()
{
var input = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(x => x).ToList();

string command = Console.ReadLine();
while (command != "3:1")
{
string[] commandDetails = command.Split(' ');
switch (commandDetails[0])
{
case "merge":
int startIndex = int.Parse(commandDetails[1]);
int endIndex = int.Parse(commandDetails[2]);
if (startIndex < 0)
{
startIndex = 0;
}
else if (startIndex >= input.Count)
{
command = Console.ReadLine();
continue;
}

if (endIndex >= input.Count)
{
endIndex = input.Count - 1;
}

input = Merge(input, startIndex, endIndex);
break;
case "divide":
int index = int.Parse(commandDetails[1]);
int partitions = int.Parse(commandDetails[2]);  // range 0 - 100
if (partitions == 0)
{
command = Console.ReadLine();
continue;
}

Divide(input, index, partitions);
break;
}

command = Console.ReadLine();
}

Console.WriteLine(string.Join(' ', input));
}

private static void Divide(List<string> input, int indexOfElementToDivide, int partitions)
{
string elementToDivide = input[indexOfElementToDivide];
string dividedElement = "";
if (elementToDivide.Length % partitions != 0)
{
// when division CANNOT make equal parts
int lengthOfPartitions = elementToDivide.Length / partitions;
int lengthOfLastPartition = lengthOfPartitions + (elementToDivide.Length % partitions);
for (int i = 0; i < partitions - 1; i++)
{
dividedElement += elementToDivide.Substring(0, lengthOfPartitions);
dividedElement += " ";
elementToDivide = elementToDivide.Remove(0, lengthOfPartitions);
}

dividedElement += elementToDivide;
}
else
{
// when division CAN make equal parts
int lengthOfPartitions = elementToDivide.Length / partitions;
for (int i = 0; i < partitions; i++)
{
dividedElement += elementToDivide.Substring(0, lengthOfPartitions);
dividedElement += " ";
elementToDivide = elementToDivide.Remove(0, lengthOfPartitions);
}
}

// collect all parts
List<string> result = input;

result.RemoveAt(indexOfElementToDivide);
result.Insert(indexOfElementToDivide, dividedElement.TrimEnd());

input = result.ToList();
}

private static List<string> Merge(List<string> input, int startIndex, int endIndex)
{
List<string> merged = input;

StringBuilder sb = new StringBuilder();
for (int i = startIndex; i <= endIndex; i++)
{
sb.Append(input[i]);
}

merged.RemoveRange(startIndex, endIndex - startIndex + 1);
merged.Insert(startIndex, sb.ToString());

return merged.ToList();
}
}
}
``````
Тагове:
0
28/10/2018 01:11:43
VasilKostov 135 Точки

Колега проблема ти е в Divide метода:

result.Insert(indexOfElementToDivide, dividedElement.TrimEnd());

Правилно разделяш дадения стринг, но по този начин - го добаваяш като стринг и листа продължава да ума същия брой елементи, но на теб ти се струва, че е правилно защото на нулевия тест divide-ваш само веднъж., но ако трябва да разделиш един от новополучените елементи, как ще стае? ;) Трябва да разделиш, този новополучен сринг и да го Insert-неш в стария List, на мястото на стринга, който си разделил, но като List от string-ове. Изпозувай InsertRange и ще се поучи нещо такова:

``result.InsertRange(indexOfElementToDivide, dividedElement.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList());``

SplitOptions.Remove... ти трябва да премахнеш последния празен стринг, който преди това премахваше със TrimEnd, а може и предварително да Trim-неш края и да не буташ StringSplitOptions в Split-а.

Надявам се да е разбираемо, че не ме бива по обясненията ;)

0
28/10/2018 14:57:18
captain76 0 Точки

Здравей, Васил!

Не знам дали си помогнал на Марков, но на мен успя!

Благодаря ти!

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