Професионална програма
Loading...
markovood avatar 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();
        }
    }
}

линк към условието: https://softuni.bg/downloads/svn/soft-tech/Sept-2018/CSharp/05-Lists/Exercise/05.%20Lists-Exercises.docx

Тагове:
0
Fundamentals Module 28/10/2018 01:11:43
VasilKostov avatar VasilKostov 136 Точки

Колега проблема ти е в 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 avatar captain76 0 Точки

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

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

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

0