Ejemplo n.º 1
0
        public Stream Decompress(Archive archive, Stream output)
        {
            var bytesPrices = archive.BytePrice.OrderBy(pair => pair.Key);
            var bits        = new List <bool[]>(archive.BytePrice.Count);

            foreach (var bytePrice in bytesPrices)
            {
                var convertedPrice = new bool[bytePrice.Value.Count];

                foreach (bool bit in bytePrice.Value)
                {
                    convertedPrice.Append(bit);
                }

                bits.Add(convertedPrice);
            }

            using (var reader = new BinaryReader(archive.Data, encoding, true))
                using (var writer = new BinaryWriter(output, encoding, true))
                {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        foreach (var bit in bits[reader.ReadByte()])
                        {
                            writer.Write(bit);
                        }
                    }
                }

            return(output);
        }
Ejemplo n.º 2
0
        static void PrintExpTree(Expression exp, StringBuilder sb, bool[] scopes = null)
        {
            Console.OutputEncoding = Encoding.UTF8;
            if (scopes == null)
            {
                scopes = new bool[1] {
                    false
                }
            }
            ;

            const char lineHorizontal = '\u2501';
            const char lineCrossed    = '\u2523';
            const char lineCurved     = '\u2517';
            const char lineChildren   = '\u2533';
            const char lineVertical   = '\u2503';

            for (int i = 0; i < scopes.Length - 1; i++)
            {
                if (scopes[i])
                {
                    sb.Append(lineVertical);
                }
                else
                {
                    sb.Append(' ');
                }
            }
            if (scopes.Last() == false)
            {
                sb.Append(lineCurved);
            }
            else
            {
                sb.Append(lineCrossed);
            }
            if (exp.getChildren().Count() > 0)
            {
                sb.Append(lineChildren);
            }
            else
            {
                sb.Append(lineHorizontal);
            }
            sb.Append(' ');
            sb.AppendLine(exp.ToString());

            int counter = 0;

            foreach (var item in exp.getChildren())
            {
                counter++;
                PrintExpTree(item, sb, scopes.Append(exp.getChildren().Count() != counter).ToArray());
            }
        }
Ejemplo n.º 3
0
        public bool[] CalculateOnePass(double[] timePassed, params bool[] elementsStates)
        {
            //массив состояний элементов после прохода (на один меньше, так как значение системы будет рассчитываться позже)
            bool[] outElementsStates = new bool[elementsStates.Length - 1];
            //проход по всем элементам
            for (int i = 0; i < elementsStates.Length - 1; i++)
            {
                double randomValue = random.NextDouble();
                //если элемент работает
                if (elementsStates[i])
                {
                    double failureProbability = 1 - Math.Exp(-failureRate * timePassed[i]);
                    //если элемент отказывает
                    if (randomValue <= failureProbability)
                    {
                        //изменить состояние элемента на "отказ"
                        outElementsStates[i] = false;
                    }
                    else
                    {
                        outElementsStates[i] = true;
                    }
                }
                //если элемент отказал
                else
                {
                    double recoveryProbability = 1 - Math.Exp(-recoveryRate * timePassed[i]);
                    //если элемент восстанавливается
                    if (randomValue <= recoveryProbability)
                    {
                        //изменить состояние элемента на "работает"
                        outElementsStates[i] = true;
                    }
                    else
                    {
                        outElementsStates[i] = false;
                    }
                }
            }
            //находим количество отказавших элементов
            int failureElementsCount = outElementsStates.Count(x => !x);

            //определяем и записываем состояние системы
            outElementsStates = outElementsStates.Append(!(failureElementsCount >= necessaryFailureElementsCount)).ToArray();
            return(outElementsStates);
        }
        static void Main(string[] args)
        {
            int N = GetNumbers(Console.ReadLine());

            string[]      array      = Console.ReadLine().Split();
            int[]         numbers    = Console.ReadLine().Split(' ').Select(GetNumbers).ToArray();
            bool[]        used       = new bool[N];
            StringBuilder list       = new StringBuilder();
            int           index      = 0;
            bool          cycles     = false;
            int           cycleIndex = -1;

            while (true)
            {
                if (index < 0 || index >= N)
                {
                    break;
                }
                if (used[index])
                {
                    cycles     = true;
                    cycleIndex = index;
                    break;
                }

                list.Append(index);
                used.Append(index);
                index = numbers[index];
            }

            if (cycleIndex == 0)
            {
                Console.Write("(" + list[0] + " ");
                for (int i = 1; i < list.Length - 1; i++)
                {
                    Console.Write(list[i] + " ");
                }
                Console.Write(list[list.Length - 1] + ")");
            }
            else
            {
                for (int i = 0; i < list.Length - 1; i++)
                {
                    if (list[i + 1] - '0' == cycleIndex)
                    {
                        Console.Write(list[i]);
                    }
                    else if (list[i] - '0' == cycleIndex)
                    {
                        Console.Write("(" + list[i] + " ");
                    }
                    else
                    {
                        Console.Write(list[i] + " ");
                    }
                }
                if (cycles == true)
                {
                    if (list.Length == 2)
                    {
                        Console.Write("(" + list[list.Length - 1] + ")");
                    }
                    else
                    {
                        Console.Write(list[list.Length - 1] + ")");
                    }
                }
                else
                {
                    Console.Write(list[list.Length - 1]);
                }
            }
        }