private void AddNextFights(MultiLineStringBuilder builder, int placeholderLenght, int groupSize, int itemsForAdd, ref int id)
        {
            var playersCount = builder.Count;
            var startIndex = groupSize - 1;
            var index = groupSize / 2;
            var itemsAdded = 0;

            TabToNextLevel(builder);

            do
            {
                if (index >= playersCount)
                {
                    startIndex -= groupSize + 1 - (playersCount - startIndex);
                    index = groupSize / 2 + 1 + startIndex;
                }

                if (index < playersCount)
                    builder[index].Append($"#{++id}.{new string('_', placeholderLenght)}");

                index = groupSize / 2 + 1 + startIndex;
                startIndex += groupSize;

                itemsAdded++;
            } while (itemsAdded < itemsForAdd);
        }
 private static void TabToNextLevel(MultiLineStringBuilder builder, int tabsCount = 2)
 {
     for (int index = 0; index < builder.Count; index++)
     {
         builder[index].Append(new string('\t', tabsCount));
     }
 }
        private void AddAdditionalFight(MultiLineStringBuilder builder, int placeholderLenght, ref int id)
        {
            var lastItem = builder.Count - 1;


            TabToNextLevel(builder);

            builder[lastItem--].Append($"#{++id}.{new string('_', placeholderLenght)}");
            builder[lastItem].Append($"#{++id}.{new string('_', placeholderLenght)}");
        }
 private void SetClusteredPlayers(MultiLineStringBuilder builder, List<SimpleCluster> clusters)
 {
     var maxPlayerLenght = GetMaxPlayerLenght(clusters);
     var id = 0;
     foreach (var cluster in clusters)
     {
         foreach (var player in cluster)
         {
             if (player.IsNotBlank())
                 builder.AppendLine($"#{++id}. {player} {new string(' ', maxPlayerLenght - player.Length)}");
         }
     }
 }
        public string ConvertToString(List<SimpleCluster> clusters)
        {
            Logger.Info($"Starting convert data from clusters. Clusters.Count = {clusters.Count};");
            var stopwatch = new Stopwatch();
            var builder = new MultiLineStringBuilder();
#if GetMaxPlayerLenght
            var placeholderLenght = GetMaxPlayerLenght(clusters);
#else
            var placeholderLenght = 10;
#endif
            var groupSize = 2;
            var groupMmultiplier = 2;

            SetClusteredPlayers(builder, clusters);

            var playersCount = builder.Count;
            var lastId = builder.Count;
            var itemsForAdd = playersCount / groupSize;

            if (playersCount % 2 != 0)
            {
                AddAdditionalFight(builder, placeholderLenght, ref lastId);
                playersCount -= 1;
            }

            while (!IsPowerOfTwo(playersCount))
            {
                playersCount += 2;
            }

            do
            {
                AddNextFights(builder, placeholderLenght, groupSize, itemsForAdd, ref lastId);

                groupSize *= groupMmultiplier;
                itemsForAdd = playersCount / groupSize;
            } while (groupSize <= playersCount);

            stopwatch.Stop();
            Logger.Info("Finish Convert.");
            Logger.Info($"Converting time {stopwatch.Elapsed}");
            return builder.ToString();
        }