コード例 #1
0
        public CharactersFrequencyModel CalculateCharactersFrequency(string text)
        {
            CharactersFrequencyModel model = new CharactersFrequencyModel();

            foreach (var character in text)
            {
                if (char.IsLetter(character))
                {
                    if (!model.CharactersCount.ContainsKey(character))
                    {
                        model.CharactersCount[character] = 0;
                    }

                    model.CharactersCount[character]++;
                    model.TotalCharactersCount++;
                }
            }

            foreach (var letter in model.CharactersCount.Keys)
            {
                model.CharactersFrequency[letter] = Math.Round((model.CharactersCount[letter] / model.TotalCharactersCount * 100), roundDecimalsCount);
            }

            model.CharactersCount.OrderBy(x => x.Key);
            model.CharactersFrequency.OrderBy(x => x.Key);

            return(model);
        }
コード例 #2
0
        public Dictionary <int, string> FindKey(CharactersFrequencyModel realCharactersFrequency, string encryptedText, int n)
        {
            var encryptedTextModel = this.calculationsService.CalculateCharactersFrequency(encryptedText);

            var iterationsCount = Math.Min(n, this.Letters.Count);

            var realTextLetters      = realCharactersFrequency.CharactersCount.OrderByDescending(x => x.Value).Take(iterationsCount).Select(x => x.Key);
            var encryptedTextLetters = encryptedTextModel.CharactersCount.OrderByDescending(x => x.Value).Take(iterationsCount).Select(x => x.Key);

            Dictionary <int, int> keysFrequency = new Dictionary <int, int>();

            foreach (var realTextLetter in realTextLetters)
            {
                foreach (var encryptedTextLetter in encryptedTextLetters)
                {
                    var key = (this.Letters.IndexOf(encryptedTextLetter) - this.Letters.IndexOf(realTextLetter) + this.Letters.Count) % this.Letters.Count;

                    if (!keysFrequency.ContainsKey(key))
                    {
                        keysFrequency[key] = 1;
                    }
                    else
                    {
                        keysFrequency[key]++;
                    }
                }
            }

            var keys = keysFrequency.OrderByDescending(x => x.Value).Select(x => x.Key);

            var results = new Dictionary <int, string>();

            foreach (var key in keys)
            {
                var text = this.Decrypt(encryptedText, key);
                results.Add(key, text);
            }

            return(results);
        }